10

wordpress サイトに Google+ 認証を追加しようとしています。私が欲しいもの:ユーザーがサイトに登録されていない場合、Google+での認証後-ユーザー名を入力するページにリダイレクトします。ユーザーがすでに登録されている場合-ログインされます。ここに私のjsコード:

function doGooglePlusLogin(authResult) {
    if (authResult['code']) {
        jQuery('#signinButton').attr('style', 'display: none');
        jQuery.ajax({
            url: '<?php echo site_url(); ?>/wp-admin/admin-ajax.php',
            type: 'get',
            dataType: 'json',
            data: {
                action: 'login_gplus',
                code: authResult['code']
            },
            success: function(result) {
            },
        });
    } else if (authResult['error']) {
    }
}

ここに私のphpコード:

function login_gplus() {
$response = array();

if (isset($_GET['code']) && !empty($_GET['code'])) {
    @session_start();
    $client = new Google_Client();
    $client->setApplicationName('Test');
    $client->setAccessType('offline');
    $client->setClientId(get_option(SOCIAL_GPLUS_CLIENT_ID));
    $client->setClientSecret(get_option(SOCIAL_GPLUS_CLIENT_SECRET));
    $client->setDeveloperKey(get_option(SOCIAL_GPLUS_API_KEY));
    $client->setRedirectUri(get_option(SOCIAL_GPLUS_REDIRECT_URIS));
    $client->setApprovalPrompt('auto');

    $code = $_GET['code'];
    $client->authenticate($code);

    $token = json_decode($client->getAccessToken());
    $reqUrl = 'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=' . $token->access_token;
    $req = new Google_HttpRequest($reqUrl);

    $tokenInfo = json_decode(
            $client->getIo()
                    ->authenticatedRequest($req)
                    ->getResponseBody());

    if ($tokenInfo->error) {
        $response['test'] = $tokenInfo->error;
        send_json_response($response);
        die();
    }
    if ($tokenInfo->audience != get_option(SOCIAL_GPLUS_CLIENT_ID)) {
        $response['test'] = "Token's client ID does not match app's.";
        send_json_response($response);
        die();
    }
    $response['test'] = 'Succesfully connected with token: ' . print_r($token, true);
}
send_json_response($response);
die();
}

ユーザーは Google+ で正常に承認されましたが、php では次のようになりました。

致命的なエラー: /var/www/html/v4/wp-content/plugins/social/google-plus/google-api/auth で、メッセージ「OAuth2 アクセス トークンの取得エラー、メッセージ: 'redirect_uri_mismatch'」を含むキャッチされない例外「Google_AuthException」 /Google_OAuth2.php:113Stack trace:#0 /var/www/html/v4/wp-content/plugins/social/google-plus/google-api/Google_Client.php(131): Google_OAuth2->authenticate(Array, ' 4/ScmpTqEIWt0SJ...')#1 /var/www/html/v4/wp-content/plugins/social/google-plus/functions.php(35): Google_Client->authenticate('4/ScmpTqEIWt0SJ... ')#2 [内部関数]: login_gplus('')#3 /var/www/html/v4/wp-includes/plugin.php(406): call_user_func_array('login_gplus', Array)#4 /var/www /html/v4/wp-admin/admin-ajax.php(74): do_action('wp_ajax_nopriv_...')#5 {main} は、113 行目の /var/www/html/v4/wp-content/plugins/social/google-plus/google-api/auth/Google_OAuth2.php でスローされます

アプリ設定で、 http://example.com/wp-admin/admin-ajax.phpとして指定された URI をリダイレクトします。私は何を間違っていますか?

編集

Google+ ログイン ボタンの定義:

<span id="signinButton">
  <span class="g-signin"
   data-callback="doGooglePlusLogin"
   data-clientid="<?php echo $this->gplus_client_id; ?>"
   data-cookiepolicy="single_host_origin" data-accesstype="offline"
   data-requestvisibleactions="http://schemas.google.com/AddActivity"
   data-scope="https://www.googleapis.com/auth/plus.login">
  </span>
</span>

SOCIAL_GPLUS_REDIRECT_URIS はexample.com/wp-admin/admin-ajax.php?action=login_gplus

4

1 に答える 1

22

あなたのコードは基本的に正しいですが、あまりよく文書化されていないことがわかるわずかな癖があります! 使用している URL ではなく、redirectURI を postmessage に設定する必要があります。

$client->setRedirectUri('postmessage');

これは、ボタンからの Javascript 交換時にトークンに設定された URI と一致するようにするためです。https://github.com/googleplus/gplus-quickstart-php/blob/master/signin.phpでサンプル コードを見て、動作を確認してください。ドキュメントにメモを追加するようにします。

于 2013-03-28T13:46:38.737 に答える