2016-01-08 20 views
8

私はトークンを得るためにgoogleの例に従っていますが、成功しません。 常にトークンの取得に失敗します。 これは、Googleがページの開発者に、私はエラーがどのように私はトークンを取得することができます私のコードでトークンnullサインインGoogleアカウント

private String CLIENTE_ID = "...apps.googleusercontent.com"; 



GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
      .requestIdToken(CLIENTE_ID) 
      .requestEmail() 
      .build(); 

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

imgBGoogle.setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View v) { 

      Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
      startActivityForResult(signInIntent, 9002); 
     } 
}); 



@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...); 
     if (requestCode == 9002) { 
      GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 

      handleSignInResult(result, data); 

     } 

if (requestCode == 9002) { 
      // [START get_id_token] 
      GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
      Log.d(TAG, "onActivityResult:GET_TOKEN:success:" + result.getStatus().isSuccess()); 

      if (result.isSuccess()) { 
       GoogleSignInAccount acct = result.getSignInAccount(); 
       String idToken = acct.getIdToken(); 

       // Show signed-in UI. 
       Log.d(TAG, "idToken:" + idToken); 
       Log.d(TAG, "\n "); 

       // TODO(user): send token to server and validate server-side 
      } else { 
       // Show signed-out UI. 
       Log.d(TAG, "idToken: fail"); 

      } 
      // [END get_id_token] 
     } 



} 

private void handleSignInResult(GoogleSignInResult result, Intent data) { 

     getToken1(data); 
     getToken2(result); 

     String BOOKS_API_SCOPE = "https://www.googleapis.com/auth/books"; 
     String GPLUS_SCOPE = "https://www.googleapis.com/auth/plus.login"; 
     String mScopes = "oauth2:" + BOOKS_API_SCOPE + " " + GPLUS_SCOPE; 

} 


void getToken1(Intent data){ 

    GoogleSignInResult a = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 

    if (a.isSuccess()) { 

     Log.d(TAG, "TOKEN 1: " + a.getSignInAccount().getIdToken()); 
     Log.d(TAG, "DISPLAY NAME 1: " +a.getSignInAccount().getDisplayName()); 
     Log.d(TAG, "ID 1: " + a.getSignInAccount().getId()+"\n "); 

    }else{ 
     Log.d(TAG, "ID 1: falhou"+"\n "); 
    } 

} 

void getToken2(GoogleSignInResult result){ 

     if (result.isSuccess()) { 

      GoogleSignInAccount acct = result.getSignInAccount(); 

      Log.d(TAG, "TOKEN 2: " + acct.getIdToken()); 
      Log.d(TAG, "DISPLAY NAME 2: " + acct.getDisplayName()); 
      Log.d(TAG, "ID 2: " + acct.getId()+"\n "); 

     }else{ 
      Log.d(TAG, "ID 2: falhou"+"\n "); 
     } 

} 

ではないと信じて を表示する最新の方法ですか? 誰でも私を助けることができますか?

enter image description here

enter image description here

enter image description here

enter image description here

+0

を忘れてはいけないかどうかを確認するためにhttp://stackoverflow.com/questions/34099208/google-sign-in-idtokenで私の答えを読んでくださいそれは助けることができますか – BNK

+0

@BNKは動作しません:( – FlipNovid

+0

あなたのアプリは、Androidタイプのものではなく、ウェブタイプのIDを使用していますか? – BNK

答えて

3

それはあなたのコードは大丈夫ですが、正確に公式ガイドに従うことをしようと思われます。それは私のために働いた: http://android-developers.blogspot.com/2016/03/registering-oauth-clients-for-google.html

Webトークンを使用していることを確認し、新しいトークンを作成して使用してください。 enter image description here

+0

あなたは私の問題で私を助けてください、私はそれを解決しようといくつかの時間を過ごす...私は同じコードを使用しますが、最終的に私はGoogleのAPIからtokenIdを取得するとき、私はString tokenId = <857 chars> ...?私はそれを検証しようとすると、googleapis.com/oauth2/v3/tokeninfo?access_token= <857文字の応答>私はすべて 'error_description'を取得します: "無効な値" ...どのようにあなたの応答の検証をしていますか?また、あなたはString tokenId = <857 chars>を取得していますか? –

+0

私のために働いていません –

+0

@AlekseyTimoshchenko:あなたはid_tokenを元に戻していますので、oauth2/v3/tokeninfo?id_token = xxxにする必要があります。 – dannyroa

14

私は同様の問題につまずいた、私はウェブのOAuthクライアントを使用していなかった、それはfirebaseを使用して働いていたし、私は、この簡単な解決策は、誰かのために役立つかもしれないと思いました。

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
       .requestIdToken(getString(R.string.default_web_client_id)) 
       .requestEmail() 
       .build(); 

default_web_client_idを定義する必要はありません。貼り付けたままで動作します。これはgoogle-servicesプラグインによって生成された文字列です。

0
public class GplusTokenUtils extends AsyncTask<Void, Void, String> { 

    String accessToken = ""; 

    private GoogleSignInAccount account; 

    public IGetToken iGetTokenListener; 

    public interface IGetToken { 
     void onGetToken(String token); 
    } 

    public void getTokenLitener(IGetToken tokenListener) { 
     this.iGetTokenListener = tokenListener; 
    } 

    public GplusTokenUtils() { 

     iGetTokenListener = new IGetToken() { 

      @Override 
      public void onGetToken(String token) { 

      } 
     }; 
    } 


    private Activity activity; 

    public void setActivity(Activity activity) { 

     this.activity = activity; 
    } 


    public void setAccount(GoogleSignInAccount account) { 

     this.account = account; 
    } 


    @Override 
    protected String doInBackground(Void... voids) { 

     try { 
      accessToken = GoogleAuthUtil.getToken(activity, account.getEmail(), "oauth2:profile email"); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (GoogleAuthException e) { 
      e.printStackTrace(); 
     } 

     return accessToken; 
    } 

    @Override 
    protected void onPostExecute(String aVoid) { 

     Log.d("GPLUS_TOKEN", aVoid); 

     iGetTokenListener.onGetToken(aVoid); 

    } 

} 

そしてこの

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
      .requestIdToken(getString(R.string.default_web_client_id)) 
      .requestEmail() 
      .build(); 
関連する問題