0

フロントエンドは 100% JS です。ユーザーがサインインボタンをクリックすると、次のコンテンツを含むauthResult['code']ajax 経由で受信および送信されます。localhost/api/user/login

     $code = $data['code'];
    require_once 'Google/Client.php';
    $client = new Google_Client();
    $client->setClientId('xxxxxx');
    $client->setClientSecret('xxxxx');
    $client->setRedirectUri('http://localhost:8080');
    $client->setScopes('email'); //Why do I need this? I already set scope in JS.
    $client->authenticate($code);   //It fails here. with no error. just 400 bad request.
    $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());

   //Check errors. 
   //Save user personal info in database
   //Set login sessions
  1. javascript で既にスコープを設定しているのに、スコープを設定する必要があるのはなぜですか?
  2. 認証関数が呼び出されたときに失敗するのはなぜですか? エラーは発生しません。
  3. バックエンドにあるのに setRedirectUri() が必要なのはなぜですか?
4

1 に答える 1

0
  1. この場合、スコープを設定する必要はありません。
  2. (回答 3 も参照): クライアント ID が Javascript で使用されているものと一致していること、およびクライアント シークレットがコンソールとまったく同じであること (末尾/先頭のスペースがないこと) を確認します。
  3. redirecturi を「postmessage」に変更します。これは、Javascript プロセスによってコードが生成されたときに使用される文字列です。

URL を手動で作成し、それを curl で呼び出して、すべてが期待どおりであることを確認することもできます: https://developers.google.com/accounts/docs/OAuth2WebServer#handlingtheresponse

于 2014-05-14T10:44:26.913 に答える