web-dev-qa-db-ja.com

でノンス生成を処理する AJAX 登録手続き

私は現在、新しいWordpress Rest APIをベースにしたマルチステップの登録システムに取り組んでいますが、一回だけの生成と検証に関する問題を抱えています。

私の最初のステップは、基本的な情報(name - firstname - emailアドレス)をフロントエンドのフォームからユーザーに尋ねることです。 2番目の方法は、追加のメタデータ情報を要求することです。それから3番目の人は彼にそのパスワードとパスワードの確認を求める。

プロセスには3つの異なるHTTP Post要求があり、すべてAJAXで処理されます。私が適用した戦略は、最初のPOSTが問題なければサーバー側でナンスを生成し、それをJSON応答で返すことです。これは最初のステップでのユーザー作成のためのコードです:

 $user_id = wp_insert_user( $userdata ) ;          
 $user = new \WP_User($user_id);
 if (!empty( $user ) && $user instanceof \WP_User) {
    $user->add_role( 'subscriber' );
 }

 // Autologin after registration
 wp_set_current_user($user_id);
 wp_set_auth_cookie($user_id);

 // Storing the regitration event for the user
 $this->saveLoginEvent( $user_id );

 $data = array(
    'user_id' => $user_id,
    'nonce'   => wp_create_nonce( 'wp_rest' ),
    'message' => 'user_created'
 );

ユーザーは正しく作成されてログインしています。しかし、追加のステップの間にこの一回だけを使用することは無効と見なされます(常に403を取得します)。 nonceを検証するための私のコードは次のとおりです。

/**
 * authenticate_call - Default permission callback used to validate that the call is coming from our frontend
 *
 * @return {WP_nonce}  The state of the nonce, if it is verified or not
 */
public function authenticate_call() {

   if ( isset( $_REQUEST['_wpnonce'] ) ) {
       $nonce = $_REQUEST['_wpnonce'];
   } elseif ( isset( $_SERVER['HTTP_X_WP_NONCE'] ) ) {
       $nonce = $_SERVER['HTTP_X_WP_NONCE'];
   }

   if ( empty( $nonce ) || null === $nonce ) {
     // No nonce at all, so act as if it's an unauthenticated request.
     return new \WP_Error( 'rest_cookie_no_nonce', __( 'Nonce is invalid' ), array( 'status' => 403 ) );
   }

   $result = wp_verify_nonce( $nonce, 'wp_rest' );
   if ( ! $result ) {
    return new \WP_Error( 'rest_cookie_invalid_nonce', __( 'Cookie nonce is invalid' ), array( 'status' => 403 ) );
   }

   return true;
}

私が得ているエラーは2番目のエラーです:rest_cookie_invalid_nonce。 nonceは、このPOST www/api/url?_wpnonce=a30e88f0bdのようにURLパラメータとして渡されます。何か案が ?バックエンドがナンスを生成してフロントエンドに返すことが不可能であることについて何か知っていますか?私はまだ知らない方法を使ってフロントエンドでそれを生成するべきです。それが助けになるなら、私はフロントエンドのアーキテクチャコンポーネントとしてTimberとTwigを使っています。

前もって感謝します、

1
Balessan

誰かがそれに悩んでいるのであれば、適切な解決策は、2番目のパラメータであるlogs_inクッキーを指定して両方のwp_set_auth_cookieを使用することです。

wp_set_current_user($user_id);
if ( wp_validate_auth_cookie( '', 'logged_in' ) != $user_id )
{
    wp_set_auth_cookie( $user_id );
}

そして、このスレッドで提案されているように、アクションを追加するには: Wordpress(4.x)セッションとnonceを拡張する ページの更新を必要とせずにログイン中の現在のクッキーを適切に上書きする。

それは確かにトリッキーなもので、どこにも文書化されていません。誰かがまだそれを試しましたか?

とにかくあなたの注意をありがとう

1
Balessan