Google 로그인 오류 12500

내 앱에 Google 로그인을 통합하려고합니다. 백엔드 서버가 없습니다. 로그인 한 Google 계정의 세부 정보를 내 앱으로 가져 오는 중입니다.

먼저 Google 로그인 예제 를 사용하여 시도했지만 오류가 발생했습니다 (아래 스택 추적을 인쇄하는 것을 제외하고 코드 변경 사항 없음). 백엔드 서버가 없기 때문에 SignInActivity 예제를 사용했습니다.

 Exception com.google.android.gms.common.api.ApiException: 12500: 
 at com.google.android.gms.common.internal.zzb.zzz(Unknown Source)
 at com.google.android.gms.auth.api.signin.GoogleSignIn.getSignedInAccountFromIntent(Unknown Source)
 at com.ewise.android.api.MainActivity.onActivityResult(SignInActivity.java:89)     at android.app.Activity.dispatchActivityResult(Activity.java:7010)
 at android.app.ActivityThread.deliverResults(ActivityThread.java:4187)
 at android.app.ActivityThread.handleSendResult(ActivityThread.java:4234)
 at android.app.ActivityThread.-wrap20(ActivityThread.java)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1584)
 at android.os.Handler.dispatchMessage(Handler.java:102)
 at android.os.Looper.loop(Looper.java:154)
 at android.app.ActivityThread.main(ActivityThread.java:6316)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)

암호

 public class SignInActivity extends AppCompatActivity implements
         View.OnClickListener {

     private static final String TAG = "SignInActivity";
     private static final int RC_SIGN_IN = 9001;

     private GoogleSignInClient mGoogleSignInClient;
     private TextView mStatusTextView;

     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);

         // Views
         mStatusTextView = findViewById(R.id.status);

         // Button listeners
         findViewById(R.id.sign_in_button).setOnClickListener(this);
         findViewById(R.id.sign_out_button).setOnClickListener(this);
         findViewById(R.id.disconnect_button).setOnClickListener(this);

         // [START configure_signin]
         // 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)
                 .requestEmail()
                 .build();
         // [END configure_signin]

         // [START build_client]
         // Build a GoogleSignInClient with the options specified by gso.
         mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
         // [END build_client]

         // [START customize_button]
         // Set the dimensions of the sign-in button.
         SignInButton signInButton = findViewById(R.id.sign_in_button);
         signInButton.setSize(SignInButton.SIZE_STANDARD);
         signInButton.setColorScheme(SignInButton.COLOR_LIGHT);
         // [END customize_button]
     }

     @Override
     public void onStart() {
         super.onStart();

         // [START on_start_sign_in]
         // Check for existing Google Sign In account, if the user is already signed in
         // the GoogleSignInAccount will be non-null.
         GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
         updateUI(account);
         // [END on_start_sign_in]
     }

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

         // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
         if (requestCode == RC_SIGN_IN) {
             // The Task returned from this call is always completed, no need to attach
             // a listener.
             Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
             handleSignInResult(task);
         }
     }
     // [END onActivityResult]

     // [START handleSignInResult]
     private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
         try {
             GoogleSignInAccount account = completedTask.getResult(ApiException.class);

             // Signed in successfully, show authenticated UI.
             updateUI(account);
         } catch (ApiException e) {
             // The ApiException status code indicates the detailed failure reason.
             // Please refer to the GoogleSignInStatusCodes class reference for more information.
             Log.w(TAG, "signInResult:failed code=" + e.getStatusCode());
             e.printStackTrace();
             updateUI(null);
         }
     }
     // [END handleSignInResult]

     // [START signIn]
     private void signIn() {
         Intent signInIntent = mGoogleSignInClient.getSignInIntent();
         startActivityForResult(signInIntent, RC_SIGN_IN);
     }
     // [END signIn]

     // [START signOut]
     private void signOut() {
         mGoogleSignInClient.signOut()
                 .addOnCompleteListener(this, new OnCompleteListener<Void>() {
                     @Override
                     public void onComplete(@NonNull Task<Void> task) {
                         // [START_EXCLUDE]
                         updateUI(null);
                         // [END_EXCLUDE]
                     }
                 });
     }
     // [END signOut]

     // [START revokeAccess]
     private void revokeAccess() {
         mGoogleSignInClient.revokeAccess()
                 .addOnCompleteListener(this, new OnCompleteListener<Void>() {
                     @Override
                     public void onComplete(@NonNull Task<Void> task) {
                         // [START_EXCLUDE]
                         updateUI(null);
                         // [END_EXCLUDE]
                     }
                 });
     }
     // [END revokeAccess]

     private void updateUI(@Nullable GoogleSignInAccount account) {
         if (account != null) {
             mStatusTextView.setText(getString(R.string.signed_in_fmt, account.getDisplayName()));

             findViewById(R.id.sign_in_button).setVisibility(View.GONE);
             findViewById(R.id.sign_out_and_disconnect).setVisibility(View.VISIBLE);
         } else {
             mStatusTextView.setText(R.string.signed_out);

             findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE);
             findViewById(R.id.sign_out_and_disconnect).setVisibility(View.GONE);
         }
     }

     @Override
     public void onClick(View v) {
         switch (v.getId()) {
             case R.id.sign_in_button:
                 signIn();
                 break;
             case R.id.sign_out_button:
                 signOut();
                 break;
             case R.id.disconnect_button:
                 revokeAccess();
                 break;
         }
     }
  }

내가 읽은 바에 따르면 문제는 SHA1 세대 로 인해 발생할 수 있습니다 .

나는 완전한 가이드를 따랐 지만 분명히 작동하지 않습니다.

gradle signingReport 에서 SHA1을 복사했습니다.

Variant: debug
Config: debug
Store: /Users/user/.android/debug.keystore
Alias: AndroidDebugKey
MD5: A3:16:3F:43:75:FE:07:62:6D:8D:CC:DD:21:9F:FA:1A
SHA1: 7B:21:26:7F:D8:18:BB:0E:36:1C:82:DD:B7:28:5F:C1:2F:5C:E4:EA
Valid until: Saturday, August 31, 2047
----------
Variant: release
Config: none
----------
Variant: debugAndroidTest
Config: debug
Store: /Users/user/.android/debug.keystore
Alias: AndroidDebugKey
MD5: A3:16:3F:43:75:FE:07:62:6D:8D:CC:DD:21:9F:FA:1A
SHA1: 7B:21:26:7F:D8:18:BB:0E:36:1C:82:DD:B7:28:5F:C1:2F:5C:E4:EA
Valid until: Saturday, August 31, 2047
----------
Variant: debugUnitTest
Config: debug
Store: /Users/user/.android/debug.keystore
Alias: AndroidDebugKey
MD5: A3:16:3F:43:75:FE:07:62:6D:8D:CC:DD:21:9F:FA:1A
SHA1: 7B:21:26:7F:D8:18:BB:0E:36:1C:82:DD:B7:28:5F:C1:2F:5C:E4:EA
Valid until: Saturday, August 31, 2047

이것의 가능한 원인은 무엇일까요?

감사

PS 이것이 가능한 원인 일 수 있습니까?

Google Play services out of date.  Requires 11720000 but found 10932470



답변

Google Play 서비스를 최신 버전 (이 경우 11720000)으로 업데이트하기 만하면됩니다. AVD를 사용하는 경우 Nexus 5 및 5X 이미지는 Google Play를 지원합니다. 에뮬레이터가 실행되면 확장 된 컨트롤 메뉴> Google Play로 이동 한 다음 업데이트합니다.


답변

오류 PlatformException (sign_in_failed, com.google.android.gms.common.api.ApiException : 12500 :, null)

이 12500 오류는 프로젝트 설정
에서 프로젝트에 지원 이메일 주소 를 추가하여 해결할 수 있습니다 . https://console.firebase.google.com/ 링크 열기

프로젝트를 선택하고 설정 탭을 엽니 다.

유효한 지원 이메일을 제공하고 지금 애플리케이션을 다시 시작하십시오.

여기에 이미지 설명 입력


답변

SHA-1 지문이 Firebase 프로젝트 설정에 추가되었는지 확인합니다. 그렇지 않은 경우 다음을 사용하여 SHA-1 지문을 찾습니다.

https://developers.google.com/android/guides/client-auth

또한 다음을 사용하여 릴리스 키의 SHA-1 지문을 찾습니다.

keytool -list -v -keystore <keystore path>

<keystore path>키 저장소의 경로로 제거하십시오 .

그런 다음 두 SHA-1 지문을 모두 Firebase 프로젝트 설정에 추가합니다.

NB : google-services.json을 업데이트 된 google-services.json을 새 지문으로 바꾸는 것을 잊지 마십시오. 나는 그것에 이틀을 잃었다.

디버그 중

Android 스튜디오 는 첫 번째 디버그 빌드 에서 자동으로 생성 ~/.android/debug.keystore 되고 이를 사용하여 앱에 서명합니다.

SHA-1 실행을 가져 오려면 (password android) ( doc ) :

keytool -exportcert -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore

이것은 SHA-1에서 응용 프로그램 설정에 추가해야합니다 firebase디버그 빌드를 테스트하는 동안 기능에 구글 기호의 사용을 허용 할 수 있습니다.


답변

 오류 12500의 경우 firebase 설정에서만 지원 Gmail을 추가하고 오류 10의 경우 그림에서 볼 수 있듯이 firebase 콘솔에 ssh 지문을 추가해야합니다.


답변

Google 로그인이 작동하려면 지원 이메일과 모든 프로젝트 및 개인 정보 링크 가 필요합니다. 그렇지 않으면 12500이 발생합니다.

“OAuth 동의 화면”이라는 두 번째 탭 하단의 https://console.developers.google.com/apis/credentials 에서 설정합니다. 여기에서 구성해야하는 세 개의 링크를 찾을 수 있습니다.

이것은 Firebase 가이드에서 어디에도 언급되어 있지 않습니다.


답변

https://console.developers.google.com/apis/credentials 에서 OAuth 동의 화면을 업데이트 해보세요.


답변

나는 잠시 동안 이것에 갇혀 있었다.

이 단계가 수행되었는지 확인하십시오.

  • Firebase 콘솔에 올바른 SHA 키가 저장되었습니다.
  • 최신 google-service.json 다운로드
  • 그리고 마지막이자 가장 중요한 Google api의 자격 증명 아래 OAuth 동의 저장,
    OAuth 화면 이것은 알아내는 데 오랜 시간이 걸렸습니다. 그리고 그 후에는 잘 작동했습니다.