उन लोगों के लिए जो Google से आते हैं: आपको शायद REST API से नॉनवेज नहीं मिलना चाहिए , जब तक कि आप वास्तव में नहीं जानते कि आप क्या कर रहे हैं। REST API साथ कुकी-आधारित प्रमाणीकरण केवल है मतलब प्लगइन्स और विषयों के लिए। एक पृष्ठ के आवेदन के लिए, आपको शायद OAuth का उपयोग करना चाहिए ।
यह प्रश्न इसलिए मौजूद है क्योंकि दस्तावेज़ीकरण इस बात पर स्पष्ट नहीं है कि आपको वास्तव में कैसे प्रमाणित करना चाहिए जब एकल पृष्ठ ऐप्स का निर्माण किया जाता है, JWTs वास्तव में वेब ऐप्स के लिए फिट नहीं होते हैं, और OAuth कुकी आधारित नीति की तुलना में लागू करना कठिन है।
हैंडबुक में एक उदाहरण है कि बैकबोन जावास्क्रिप्ट क्लाइंट नॉनस को कैसे संभालता है, और यदि मैं उदाहरण का पालन करता हूं, तो मुझे एक ऐसा नॉन्स मिलता है जो बिल्ट इन एंडपॉइंट्स जैसे / wp / v2 / पोस्ट स्वीकार करता है।
\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
पहले एक से प्राप्त करता हूं , और दूसरा एक पोस्ट को सफलतापूर्वक बनाता है। ऐसा शायद इसलिए है क्योंकि गैर अलग हैं, लेकिन क्यों? मैं दोनों अनुरोधों में एक ही उपयोगकर्ता के रूप में लॉग इन हूं।
यदि मेरा दृष्टिकोण गलत है, तो मुझे गैर कैसे प्राप्त करना चाहिए?
संपादित करें :
मैंने बहुत किस्मत के बिना ग्लोबल्स के साथ खिलवाड़ करने की कोशिश की । Wp_loaded कार्रवाई का उपयोग करके थोड़ा भाग्यशाली मिला:
<?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