ঐ যে 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