2017-08-13 17 views
0

私はバックエンドサーバでAndroidサインインを使用するためにthese instructionsに従っています。google/apiclient:署名検証に失敗しました

Androidのサインイン作品、と私は私のサーバーのクライアントIDとIDトークンを取得しています:

// Configure sign-in to request the user's ID, email address, and basic 
// profile. ID and basic profile are included in DEFAULT_SIGN_IN. 
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
     .requestIdToken(getString(R.string.server_client_id)) 
     .build(); 

// Build a GoogleApiClient with access to the Google Sign-In API and the 
// options specified by gso. 
mGoogleApiClient = new GoogleApiClient.Builder(this) 
     .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */) 
     .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
     .build(); 

mGoogleSignIn.setSize(SignInButton.SIZE_STANDARD); 
mGoogleSignIn.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
     startActivityForResult(signInIntent, REQUEST_CODE_SIGN_IN); 
    } 
}); 
このトークンは、POSTリクエストとしての私のバックエンドサーバに送信され

(コード関係ありません:それは作品)。

そしてサーバ(symfonyのバックエンドは)ユーザーIDを検証し、バックエンドデータベース内のユーザ情報を取得するために、再度ユーザを認証するためにgoogle/apiclientを使用:

// Get token from user 
$id_token = $request->get('id_token'); 

// Validate token 
try { 
    $options = [ 
     'client_id' => $this->container->getParameter('google_app_id') 
    ]; 
    $client = new \Google_Client($options); 
    $payload = $client->verifyIdToken($id_token); 
    if ($payload) { 
     $user = $this->getDoctrine() 
        ->getRepository(User::class) 
        ->findOneBy(['googleId' => $payload['sub']]); 
     if ($user != null) { 
      $data = [ 
       'client_id' => $user->getClient()->getClientId(), 
       'client_secret' => $user->getClient()->getSecret(), 
      ]; 
     } else { 
      $data = [ 
       'error' => 'Unknown user', 
       'message' => 'Please create an account first', 
      ]; 
     } 
    } else { 
     $data = [ 
      'error' => 'Invalid token', 
     ]; 
    } 
} catch (\Exception $e) { 
    $data = [ 
     'error' => 'Invalid token', 
     'details' => $e->getMessage(), 
    ]; 
} 

例外が発生され、メッセージSignature Verification Failedです。

オンラインでの調査の結果、このメッセージの理由が見つかりませんでした。これを引き起こしているのは何ですか?バックエンドで同じコードを使用していましたが、Android側でいくつか変更しましたが、Google Sign Inとは関係ありません。

+1

OpenSSLのアップデートやタイムゾーンが設定されているかどうかの確認など、いくつかのことを行うことができます。 – Vamsi

+0

私はほとんど情報を与えていません。 OpenSSLと日付は正しいですが、それは非常に良いアイデアでした。 –

答えて

0

今朝もまったく同じコードで試してみましたが、魅力的でした。私はそれがGoogle側の一時的な失敗だったと思う(それを期待しなかった!)。

私のコードのエラーではなく、エラーメッセージを理解したかったのですが(何もありませんでした)、誰かが明確な説明をしていれば、私はその答えを受け入れます。

関連する問題