2013-07-28 22 views
5

Ngoại lệ:.GoogleAuthException: Không xác định khi thực hiện Google SSO.

07-28 14:36:13.140: W/System.err(11382): com.google.android.gms.auth.GoogleAuthException: Unknown 
07-28 14:36:13.140: W/System.err(11382): at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source) 
07-28 14:36:13.140: W/System.err(11382): at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source) 
07-28 14:36:13.148: E/AndroidRuntime(11382): FATAL EXCEPTION: main 

của tôi Đăng ký mã:

public class Signup extends Activity { 

     final private String CLIENT_ID = <android-client-id>; 
     final private List<String> SCOPES = Arrays.asList(new String[]{ 
      "https://www.googleapis.com/auth/plus.login" 
     }); 
     private String webId = <web-client-id>; 


     private GoogleAccountCredential mCredential; 

     private EditText mExchangeCodeEditText; 
     private EditText mIdTokenEditText; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_google); 
     //mExchangeCodeEditText = (EditText) findViewById(R.id.editTextExchangeCode); 
     // mIdTokenEditText = (EditText) findViewById(R.id.editTextIdToken); 

     // initiate a credential object with drive and plus.login scopes 
     // cross identity is only available for tokens retrieved with plus.login 
     mCredential = GoogleAccountCredential.usingOAuth2(this, Arrays.asList(SCOPES.get(0))); 

     // user needs to select an account, start account picker 
     startActivityForResult(
      mCredential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER); 
     } 

     /** 
     * Handles the callbacks from result returning 
     * account picker and permission requester activities. 
     */ 
     @Override 
     protected void onActivityResult(
      final int requestCode, final int resultCode, final Intent data) { 
     switch (requestCode) { 
     // user has returned back from the account picker, 
     // initiate the rest of the flow with the account he/she has chosen. 
     case REQUEST_ACCOUNT_PICKER: 
      String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); 
      if (accountName != null) { 
      mCredential.setSelectedAccountName(accountName); 
      new RetrieveExchangeCodeAsyncTask().execute(); 
      new RetrieveJwtAsyncTask().execute(); 
      } 
      break; 
     // user has returned back from the permissions screen, 
     // if he/she has given enough permissions, retry the the request. 
     case REQUEST_AUTHORIZATION: 
      if (resultCode == Activity.RESULT_OK) { 
      // replay the same operations 
      new RetrieveExchangeCodeAsyncTask().execute(); 
      new RetrieveJwtAsyncTask().execute(); 
      } 
      break; 
     } 
     } 

     /** 
     * Retrieves the exchange code to be sent to the 
     * server-side component of the app. 
     */ 
     public class RetrieveExchangeCodeAsyncTask 
      extends AsyncTask<Void, Boolean, String> { 

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

      String scope = String.format("oauth2:server:client_id:%s:api_scope:%s", 
       CLIENT_ID, TextUtils.join(" ", SCOPES)); 
      try { 

       GoogleAccountCredential.usingAudience(Signup.this, "server:client_id:" + webId); 
      return GoogleAuthUtil.getToken(

       Signup.this, mCredential.getSelectedAccountName(), scope); 
      } catch (UserRecoverableAuthException e) { 
      startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION); 
      } catch (Exception e) { 
      e.printStackTrace(); // TODO: handle the exception 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(String code) { 
      // exchange code with server-side to retrieve an additional 
      // access token on the server-side. 
     // mExchangeCodeEditText.setText(code); 
      Log.d("code",code); 
     } 
     } 

     /** 
     * Retrieves a JWT to identify the user without the 
     * regular client-side authorization flow. The jwt payload needs to be 
     * sent to the server-side component. 
     */ 
     public class RetrieveJwtAsyncTask 
      extends AsyncTask<Void, Boolean, String> { 

     @Override 
     protected String doInBackground(Void... params) { 
      String scope = "audience:server:client_id:" + CLIENT_ID; 
      try { 
      return GoogleAuthUtil.getToken(
        Signup.this, mCredential.getSelectedAccountName(), scope); 
      } catch(UserRecoverableAuthIOException e) { 
      startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION); 
      } catch (Exception e) { 
      e.printStackTrace(); // TODO: handle the exception 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(String idToken) { 
      // exchange encrypted idToken with server-side to identify the user 
     // mIdTokenEditText.setText(idToken); 
      Log.d("idtoken",idToken); 
     } 
     } 

     private static final int REQUEST_ACCOUNT_PICKER = 100; 
     private static final int REQUEST_AUTHORIZATION = 200; 

    } 

Tôi hoàn toàn tránh khỏi thất bại chuyện gì đang xảy ra ở đây. Cứu giúp?

+0

Từ khi nào phương thức GoogleAuthUtil.getToken() bắt đầu ném GoogleAuthException với thông báo "BadUsername" cho một email không được đăng ký trên thiết bị, thay vì ngoại lệ trước IllegalArgumentException với thông báo "Tài khoản không tồn tại 'email_address'"? http://developer.android.com/reference/com/google/android/gms/auth/GoogleAuthUtil.html#getToken(android.content.Context, java.lang.String, java.lang.String) – toobsco42

Trả lời

1

Tôi gặp sự cố tương tự. Trong trường hợp của tôi, vấn đề nằm trong tên ứng dụng bị thiếu trong bảng điều khiển google.

Mở console điều hướng đến dự án của bạn và chọn "Màn hình đồng ý". Điền vào trường "PRODUCT NAME" và lưu.

0

Tương tự như CheatEx, tôi phải chọn địa chỉ email của mình từ trang "Màn hình đồng ý" và lưu.