REST এপিআই থেকে প্রাপ্ত নোকসটি অবৈধ এবং ডাব্লুপি_লোক্যালাইজ_স্ক্রিপ্টে উত্পন্ন জঞ্জাল থেকে পৃথক


10

ঐ যে Google থেকে পৌঁছা জন্য: আপনি সম্ভবত না nonces বিশ্রাম API থেকে পাওয়া উচিত , যদি না আপনি সত্যিই জানি তুমি কি করছেন। REST এপিআই সহ কুকি-ভিত্তিক প্রমাণীকরণ কেবল প্লাগইন এবং থিমগুলির জন্য বোঝানো হয় । একক পৃষ্ঠার অ্যাপ্লিকেশনের জন্য আপনার সম্ভবত OAuth ব্যবহার করা উচিত ।

এই প্রশ্নটি উপস্থিত রয়েছে কারণ একক পৃষ্ঠাগুলির অ্যাপ্লিকেশনগুলি তৈরি করার সময় ডকুমেন্টেশনটি কীভাবে সত্যায়িত করা উচিত সে সম্পর্কে / পরিষ্কার ছিল না, জেডাব্লুটিটি ওয়েব অ্যাপ্লিকেশনগুলির পক্ষে আসলেই উপযুক্ত নয় এবং কুকি ভিত্তিক লেখার চেয়ে ওআউথ প্রয়োগ করা আরও শক্ত।


ব্যাকবোন জাভাস্ক্রিপ্ট ক্লায়েন্ট কীভাবে ননেসগুলি পরিচালনা করে তার উপর হ্যান্ডবুকের একটি উদাহরণ রয়েছে এবং আমি উদাহরণটি অনুসরণ করি তবে আমি একটি নোকস পাই যা বিল্ট ইন ইনপয়েন্টগুলিতে যেমন / ডাব্লুপি / ভি 2 / পোস্ট গ্রহণ করে।

\wp_localize_script("client-js", "theme", [
  'nonce' => wp_create_nonce('wp_rest'),
  'user' => get_current_user_id(),

]);

তবে, ব্যাকবোন ব্যবহার করা প্রশ্নের বাইরে নয় এবং থিমগুলিও তাই, আমি নিম্নলিখিত প্লাগইনটি লিখেছিলাম:

<?php
/*
Plugin Name: Nonce Endpoint
*/

add_action('rest_api_init', function () {
  $user = get_current_user_id();
  register_rest_route('nonce/v1', 'get', [
    'methods' => 'GET',
    'callback' => function () use ($user) {
      return [
        'nonce' => wp_create_nonce('wp_rest'),
        'user' => $user,
      ];
    },
  ]);

  register_rest_route('nonce/v1', 'verify', [
    'methods' => 'GET',
    'callback' => function () use ($user) {
      $nonce = !empty($_GET['nonce']) ? $_GET['nonce'] : false;
      return [
        'valid' => (bool) wp_verify_nonce($nonce, 'wp_rest'),
        'user' => $user,
      ];
    },
  ]);
});

আমি জাভাস্ক্রিপ্ট কনসোলে কিছুটা টিনকার্ড করে লিখেছিলাম:

var main = async () => { // var because it can be redefined
  const nonceReq = await fetch('/wp-json/nonce/v1/get', { credentials: 'include' })
  const nonceResp = await nonceReq.json()
  const nonceValidReq = await fetch(`/wp-json/nonce/v1/verify?nonce=${nonceResp.nonce}`, { credentials: 'include' })
  const nonceValidResp = await nonceValidReq.json()
  const addPost = (nonce) => fetch('/wp-json/wp/v2/posts', {
    method: 'POST',
    credentials: 'include',
    body: JSON.stringify({
      title: `Test ${Date.now()}`,
      content: 'Test',
    }),
    headers: {
      'X-WP-Nonce': nonce,
      'content-type': 'application/json'
    },
  }).then(r => r.json()).then(console.log)

  console.log(nonceResp.nonce, nonceResp.user, nonceValidResp)
  console.log(theme.nonce, theme.user)
  addPost(nonceResp.nonce)
  addPost(theme.nonce)
}

main()

প্রত্যাশিত ফলাফলটি দুটি নতুন পোস্ট, তবে আমি Cookie nonce is invalidপ্রথমটি পেয়েছি এবং দ্বিতীয়টি সফলভাবে পোস্টটি তৈরি করে। বোধহয় ভিন্ন কারণ এটি সম্ভবত, তবে কেন? আমি উভয় অনুরোধে একই ব্যবহারকারী হিসাবে লগ ইন করছি।

এখানে চিত্র বর্ণনা লিখুন

যদি আমার পদ্ধতির ভুল হয় তবে আমি কীভাবে নর্দমা পাব?

সম্পাদনা করুন :

আমি অনেক ভাগ্য ছাড়াই গ্লোবালগুলির সাথে গণ্ডগোলের চেষ্টা করেছি । ডব্লিউপি_লোড হওয়া ক্রিয়াটি ব্যবহার করে কিছুটা ভাগ্যবান হয়েছে:

<?php
/*
Plugin Name: Nonce Endpoint
*/

$nonce = 'invalid';
add_action('wp_loaded', function () {
  global $nonce;
  $nonce = wp_create_nonce('wp_rest');
});

add_action('rest_api_init', function () {
  $user = get_current_user_id();
  register_rest_route('nonce/v1', 'get', [
    'methods' => 'GET',
    'callback' => function () use ($user) {
      return [
        'nonce' => $GLOBALS['nonce'],
        'user' => $user,
      ];
    },
  ]);

  register_rest_route('nonce/v1', 'verify', [
    'methods' => 'GET',
    'callback' => function () use ($user) {
      $nonce = !empty($_GET['nonce']) ? $_GET['nonce'] : false;
      error_log("verify $nonce $user");
      return [
        'valid' => (bool) wp_verify_nonce($nonce, 'wp_rest'),
        'user' => $user,
      ];
    },
  ]);
});

এখন আমি যখন উপরে জাভাস্ক্রিপ্ট চালাচ্ছি, দুটি পোস্ট তৈরি হবে, তবে যাচাই করুন শেষের অবস্থানটি ব্যর্থ হয়!

এখানে চিত্র বর্ণনা লিখুন

আমি wp_verify_nonce ডিবাগ করতে গিয়েছিলাম:

function wp_verify_nonce( $nonce, $action = -1 ) {
  $nonce = (string) $nonce;
  $user = wp_get_current_user();
  $uid = (int) $user->ID; // This is 0, even though the verify endpoint says I'm logged in as user 2!

আমি কিছু লগিং যোগ

// Nonce generated 0-12 hours ago
$expected = substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce'), -12, 10 );
error_log("expected 1 $expected received $nonce uid $uid action $action");
if ( hash_equals( $expected, $nonce ) ) {
  return 1;
}

// Nonce generated 12-24 hours ago
$expected = substr( wp_hash( ( $i - 1 ) . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 );
error_log("expected 2 $expected received $nonce uid $uid action $action");
if ( hash_equals( $expected, $nonce ) ) {
  return 2;
}

এবং জাভাস্ক্রিপ্ট কোড এখন নিম্নলিখিত এন্ট্রি ফলাফল। যেমন আপনি দেখতে পাচ্ছেন, যখন যাচাইকরণের শেষ পয়েন্টটি কল করা হয়, তখন uid 0 হয়।

[01-Mar-2018 11:41:57 UTC] verify 716087f772 2
[01-Mar-2018 11:41:57 UTC] expected 1 b35fa18521 received 716087f772 uid 0 action wp_rest
[01-Mar-2018 11:41:57 UTC] expected 2 dd35d95cbd received 716087f772 uid 0 action wp_rest
[01-Mar-2018 11:41:58 UTC] expected 1 716087f772 received 716087f772 uid 2 action wp_rest
[01-Mar-2018 11:41:58 UTC] expected 1 716087f772 received 716087f772 uid 2 action wp_rest

উত্তর:


3

কাছাকাছি তাকান function rest_cookie_check_errors()

আপনি যখন ননসটি পেয়ে যাবেন /wp-json/nonce/v1/get, আপনি প্রথমে কোনও নোকস পাঠাচ্ছেন না। সুতরাং এই ফাংশনটি এই কোড সহ আপনার প্রমাণীকরণকে বাতিল করে:

if ( null === $nonce ) {
    // No nonce at all, so act as if it's an unauthenticated request.
    wp_set_current_user( 0 );
    return true;
}

এ কারণেই আপনি থিম থেকে এটি পাওয়ার জন্য আপনার আরইএসটি কল থেকে আলাদা ননজ পাচ্ছেন। আরআরএসটি কল ইচ্ছাকৃতভাবে আপনার লগইন শংসাপত্রগুলি (কুকি লেখার মাধ্যমে এই ক্ষেত্রে) স্বীকৃতি দিচ্ছে না কারণ আপনি প্রাপ্তির অনুরোধে বৈধ ননস প্রেরণ করেন নি।

এখন, আপনার ডাব্লুপি-লোড কোডটি যে কারণে কাজ করেছে তা হ'ল এই বিশ্রাম কোডটি আপনার লগইন বাতিল করার আগে আপনি ননসটি পেয়েছিলেন এবং একটি বিশ্বব্যাপী এটি সংরক্ষণ করেছিলেন। যাচাইকরণ ব্যর্থ হয় কারণ যাচাইকরণের আগে বাকী কোডটি আপনার লগইনকে বাতিল করে দেয়।


আমি এমনকি যে ফাংশন তাকান না, কিন্তু সম্ভবত এটি বোধগম্য। জিনিসটি হ'ল, আমি কেন জিইটি অনুরোধের জন্য একটি বৈধ নোট অন্তর্ভুক্ত করব? (আমি এটি এখনই পেয়েছি তবে এটি সুস্পষ্ট থেকে অনেক দূরে) / ভেরিফাইড এন্ডপয়েন্টের পুরো বিষয়টি হ'ল আমি যাচাই করতে পারি যে নোকটি এখনও বৈধ কিনা এবং যদি এটি বাসি হয়ে যায় বা বৈধ না হয় তবে একটি নতুন নোকস পাব।
খ্রিস্টান

রেস্ট_কুকি_চেক_অরফেসরের উত্সের ভিত্তিতে, আমার আমার শেষের অবস্থানটি পরিবর্তন করা উচিত যাতে এটি পরীক্ষা না করে $_GET['nonce']তবে ননস হেডার বা $_GET['_wpnonce']প্যারামিটার। সঠিক?
খ্রিস্টান

1

এই সমাধানটি কাজ করার সময় এটি প্রস্তাবিত নয় । OAuth পছন্দসই পছন্দ।


আমি মনে করি এটি পেয়েছি।

আমি মনে করি যে ডাব্লুপি_ভারিফাই_অনসেস নষ্ট হয়ে গেছে, ডাব্লুপি_জেট_কন্টেন_উজার যথাযথ ব্যবহারকারীর অবজেক্ট পেতে ব্যর্থ।

এটি অটো দ্বারা চিত্রিত হিসাবে নয়।

ভাগ্যক্রমে এটির একটি ফিল্টার রয়েছে: $uid = apply_filters( 'nonce_user_logged_out', $uid, $action );

এই ফিল্টারটি ব্যবহার করে আমি নিম্নলিখিতগুলি লিখতে সক্ষম হয়েছি এবং জাভাস্ক্রিপ্ট কোডটি যেমনটি করা উচিত তেমন কার্যকর হয়:

এখানে চিত্র বর্ণনা লিখুন

<?php
/*
Plugin Name: Nonce Endpoint
*/

$nonce = 'invalid';
add_action('wp_loaded', function () {
  global $nonce;
  $nonce = wp_create_nonce('wp_rest');
});

add_action('rest_api_init', function () {
  $user = get_current_user_id();
  register_rest_route('nonce/v1', 'get', [
    'methods' => 'GET',
    'callback' => function () use ($user) {
      return [
        'nonce' => $GLOBALS['nonce'],
        'user' => $user,
      ];
    },
  ]);

  register_rest_route('nonce/v1', 'verify', [
    'methods' => 'GET',
    'callback' => function () use ($user) {
      $nonce = !empty($_GET['nonce']) ? $_GET['nonce'] : false;
      add_filter("nonce_user_logged_out", function ($uid, $action) use ($user) {
        if ($uid === 0 && $action === 'wp_rest') {
          return $user;
        }

        return $uid;
      }, 10, 2);

      return [
        'status' => wp_verify_nonce($nonce, 'wp_rest'),
        'user' => $user,
      ];
    },
  ]);
});

যদি আপনি এই সমস্যার সমাধানের সাথে কোনও সুরক্ষা সমস্যা দেখেন তবে দয়া করে আমাকে চিৎকার করুন, এখনই আমি গ্লোবালগুলি বাদে এটিতে কোনও ভুল দেখতে পাচ্ছি না।


0

এই সমস্ত কোডটি দেখে মনে হচ্ছে আপনার সমস্যাটি ক্লোজার ব্যবহার। এ initপর্যায়ে আপনি শুধুমাত্র আঙ্গুলসমূহ সেট হবে এবং প্রত্যেকটি কোর না ডেটা মূল্যায়ন করা সমাপ্ত লোড ছিল এবং সক্রিয়া করা হচ্ছে।

ভিতরে

add_action('rest_api_init', function () {
  $user = get_current_user_id();
  register_rest_route('nonce/v1', 'get', [
    'methods' => 'GET',
    'callback' => function () use ($user) {
      return [
        'nonce' => $GLOBALS['nonce'],
        'user' => $user,
      ];
    },
  ]);

$userগোড়ার দিকে আবদ্ধ হয় অবসান ব্যবহৃত হবে, কিন্তু আপনি কেউ প্রতিশ্রুতি কুকি ইতিমধ্যে ঘাঁটা হয়েছে এবং ব্যবহারকারী সেগুলিকে উপর ভিত্তি করে প্রামাণ হয়। একটি ভাল কোড হবে

add_action('rest_api_init', function () {
  register_rest_route('nonce/v1', 'get', [
    'methods' => 'GET',
    'callback' => function () {
    $user = get_current_user_id();
      return [
        'nonce' => $GLOBALS['nonce'],
        'user' => $user,
      ];
    },
  ]);

ওয়ার্ডপ্রেসে যে কোনও কিছু হুকের সাথে সর্বদা সর্বদা সর্বশেষতম হুক ব্যবহার করুন এবং আপনার যা প্রয়োজন তা কখনই প্রাক্কলিত করার চেষ্টা করবেন না।


আমি কি মনিটরের ক্রিয়াগুলি এবং হুক বিভাগটি ব্যবহার করেছি তা নির্ধারণের জন্য কী চালায় এবং কোন ক্রমে, set_current_user আরম্ভের পরে এবং after_setup_theme এর আগে চলে, $ ব্যবহারকারীর বাইরের এবং বন্ধ হওয়ার আগে সংজ্ঞায়িত হওয়ার আগে সমস্যা হবে না।
খ্রিস্টান

@ ক্রিশ্চিয়ান এবং এগুলি সমস্ত জেএসন এপিআইয়ের প্রসঙ্গে প্রাসঙ্গিক নাও হতে পারে। যদি ক্যোয়ারী মনিটর সেই প্রসঙ্গে কাজ করে তবে আমি খুব অবাক হব
মার্ক কাপলুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.