your programing

Google 로그인 오류 12500

lovepro 2020. 10. 6. 18:52
반응형

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이 발생합니다.

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 화면 이것은 알아내는 데 오랜 시간이 걸렸습니다. 그리고 그 후에는 잘 작동했습니다.

Google Play 스토어에서 귀하의 SHA1을 덮어 쓴 것 같습니다. Google Play 스토어, 실행 패널, 앱 서명 아래에서 Google Play에 추가 SHA1이 추가되었는지 확인합니다.

그리고 SHA1을 복사하여 관련 장소에 추가하면 작업을 수행 할 수 있습니다.


Firebase 인증을 사용하고 있습니다. 내 SHA-1이 올바르게 표시되고 클라이언트 ID도 정확했지만 여전히 12500을 얻었습니다.

내 문제는 내 프로젝트 설정에서 지원 이메일표시하지 않았다는 것이 밝혀졌습니다 . (설정-> 일반 탭-> 프로젝트 (공용 설정) 섹션).


여전히 비슷한 문제가있는 사람이있는 경우 사용자 지정 범위를 추가하는 경우 유효한 범위인지 확인합니다. 제 경우에는 페이스 북 스코프와 구글 스코프를 섞어서 알아 내는데 시간이 걸렸습니다!


Firebase 콘솔에서 프로젝트로 이동하여 프로젝트 설정을 열고 거기에 SHA 인증서 지문을 추가합니다. 업데이트 된 google-services.json 파일을 다운로드하고 프로젝트 앱 폴더에 추가합니다.

이것은 나를 위해 일했습니다.

Firebase 콘솔 스크린 샷


먼저 Google 개발자 콘솔에 앱을 등록했는지 확인하세요.

Firebase 애플리케이션에 debugrelease가 모두 있는지 확인하세요 . 이 오류가 프로덕션에서 나타나면 SHA-1 release key기본 앱에 추가하십시오 . 개발중인 경우 SHA-1 debug key.

SHA-1 지문을 추가 할 위치

디버그 / 릴리스 키 얻기 :

keytool -exportcert -list -v -alias [your alias] -keystore [path/to/debug or release.keystore]

google-services.json앱에 업데이트 된 파일을 다운로드하십시오 .


나에게 문제는 디버그 구성 앱에서 '릴리스'ClientID를 사용하는 것이 었습니다. 각 SHA-1을 각각 사용하여 릴리스 및 디버그 키가 있는지 확인하십시오.


잘못된 SHA1에서 오류가 발생한 것 같습니다. Android 스튜디오의 릴리스 및 디버그 모드간에 SHA1이 다르다는 점을 잊지 마십시오. keytool을 사용하여 SHA1을 가져 오는 대신 Android 스튜디오에서 Gradle 프로젝트-> 작업-> android-> signingReport (메뉴보기-> 도구 창-> gradle에서 열 수 있음)를 사용하여 SHA1을 릴리스하고 디버그 할 수 있습니다. 그런 다음 쉽게 작업하려면 Google 클라우드 콘솔에서 두 개의 SHA1을 사용하여 별도의 자격 증명 2 개를 만들어야합니다 (Google은 릴리스 SHA1을 사용하여 1 개를 만들도록 지시합니다. 개발시 디버그 SHA1을 사용하므로 작동하지 않습니다).


Cordova 컴파일러가 적절한 키 저장소 파일을 찾지 못할 수도 있습니다.



솔루션 : 실행하기 전에 서명 속성ionic cordova build android 지정

1 단계 : 디버그 키 저장소 파일 생성

명령 실행

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

비밀번호 사용 : android

스텝 2 : (키 저장소 파일을 복사 debug.keystore에서) ~/.androidplatform/android현재 프로젝트의 디렉토리

스텝 3 : 파일을 이름 만들기 release-signing.properties 에서 platform/android디렉토리를

4 단계 : 파일에 내용 추가

storeFile=debug.keystore
keyAlias=androiddebugkey
storePassword=android
keyPassword=android

참고 : 이것이 기본값입니다. 사용자 지정 별칭과 암호를 제공 한 경우 적절하게 사용하십시오.

5 단계 : 이제 빌드ionic cordova build android


다른 컴퓨터 (다른 Android Studio)에서 프로젝트를 연 후에도 동일한 문제가 발생했습니다. 제 경우에는 처음에 Firebase를 설정하는 데 사용한 Firebase Assistant를 사용하여 문제를 해결했습니다. Firebase Assistant (도구> Firebase)를 열고 인증> 연결을 선택합니다. 이렇게하면 프로젝트가 Firebase에 다시 연결되고 구성이 업데이트되었습니다.


앱이 백엔드 서버로 인증하거나 백엔드 서버에서 Google API에 액세스하는 경우 사용자의 기본 프로필 정보에 액세스하기 위해 GoogleSignInOptions 객체를 만들 때 서버용으로 생성 된 OAuth 2.0 클라이언트 ID를 requestIdToken 메소드에 전달해야합니다. 그런 다음 API 콘솔의 자격 증명 페이지에있는 OAuth 동의 화면에서 지원 이메일을 제출하는 것을 잊지 마십시오.


2 주 이후로 Google 로그인 문제에 갇혀 마침내 잘 분류했습니다. 이유를 설명하겠습니다. 이 문제는 firebase와 관련이 있습니다. 파이어베이스에서 그들은 "지원 이메일"필드를 선택 사항으로 언급했습니다. 그러나 일단 추가하면 (개인 이메일 중 하나) 문제가 분류되고 응답을 받았습니다. 12501 오류가 발생하면 Google 계정의 설정과 관련된 것입니다.


flutter 에서 여기 로 오는 경우 : 이것은 여기 문서에 따라 수정해야하는 코너 케이스 중 하나입니다. https://pub.dev/packages/google_sign_in 여기에 이미지 설명 입력

  • Google API 및 서비스로 이동
  • Google 로그인을 구현할 앱을 선택하십시오.
  • 그런 다음 APIS 및 서비스 활성화를 클릭하십시오.

여기에 이미지 설명 입력

  • 그런 다음 Google Peoples API를 검색합니다.

여기에 이미지 설명 입력

  • Google People API 카드를 열고 사용을 클릭하면 앱에서 문제를 해결할 수 있습니다.

제 경우에는 잘못된 Google 클라이언트 ID 때문입니다. 내 키를 google-services.json( oauth_client객체 아래 )에 나열된 키로 변경 합니다.


다음 사항이 올바르게 설정되었는지 확인하십시오.

  1. Google 프로젝트에서 클라이언트 ID를 생성합니다.
  2. 해당 클라이언트 ID에 적절한 SHA-1 키를 제공하십시오. (디버그 / 릴리스)
  3. 해당 클라이언트 ID에 대한 적절한 패키지 이름을 제공하십시오.
  4. 만들기 확실히 당신은 고객 ID에서 생성 한 strings.xml, google-services.json또는 credentials.json파일을.

https://developers.google.com/identity/sign-in/android/sign-in 은이 API 문서를 따르지만 WEB_CLIENT_ID 내에서 google-services.json 파일 내에서 생성 된 클라이언트 ID 값을 사용한다는 점에 유의하세요.

class MainActivity : AppCompatActivity(), GoogleApiClient.OnConnectionFailedListener {
private val TAG = "JSAGoogleSignIn"
private val REQUEST_CODE_SIGN_IN = 1234
private val WEB_CLIENT_ID = "354298333018-XXXXXXXXXXXXXXXXXXXXXXX.apps.googleusercontent.com"
private var mAuth: FirebaseAuth? = null

private var mGoogleApiClient: GoogleApiClient? = null
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    var txt_register = findViewById<TextView>(R.id.txt_register)
    txt_register.setOnClickListener {
        var intent = Intent(this@MainActivity, RegisterActivity::class.java)
        finish()
        startActivity(intent)
    }
    val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(WEB_CLIENT_ID)
            .requestEmail()
            .build()
    mGoogleApiClient = GoogleApiClient.Builder(this)
            .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build()

    mAuth = FirebaseAuth.getInstance()
    sign_in_button.setOnClickListener {
        val intent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient)
        startActivityForResult(intent, REQUEST_CODE_SIGN_IN)
    }

}


override fun onConnectionFailed(p0: ConnectionResult) {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}


private fun updateUI(user: FirebaseUser?) {
    if (user != null) {
        Log.e("Email", "Value" + user.email)
    }

}

fun signIn() {

}

override fun onStart() {
    super.onStart()
    val currentUser = mAuth!!.currentUser
    updateUI(currentUser)
}

public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
    if (requestCode == REQUEST_CODE_SIGN_IN) {
        val result = Auth.GoogleSignInApi.getSignInResultFromIntent(data)
        if (result.isSuccess) {
            // successful -> authenticate with Firebase
            val account = result.signInAccount
            firebaseAuthWithGoogle(account!!)
        } else {
            // failed -> update UI
            updateUI(null)
            Toast.makeText(applicationContext, "SignIn: failed!" + result.status,
                    Toast.LENGTH_SHORT).show()
        }
    }
}

private fun firebaseAuthWithGoogle(acct: GoogleSignInAccount) {
    Log.e(TAG, "firebaseAuthWithGoogle():" + acct.id!!)

    val credential = GoogleAuthProvider.getCredential(acct.idToken, null)
    mAuth!!.signInWithCredential(credential)
            .addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    // Sign in success
                    Log.e(TAG, "signInWithCredential: Success!")
                    val user = mAuth!!.currentUser
                    updateUI(user)
                } else {
                    // Sign in fails
                    Log.w(TAG, "signInWithCredential: Failed!", task.exception)
                    Toast.makeText(applicationContext, "Authentication failed!",
                            Toast.LENGTH_SHORT).show()
                    updateUI(null)
                }
            }
}

제 경우에는 Firebase 콘솔에 지문을 추가 한 후 Google 개발자 콘솔에서 자동으로 선택하여 지문을 표시했습니다. 그러나 로그인이 작동하지 않았습니다. 모든 단계를 살펴본 후 Google이 내 매니페스트 파일 패키지를 이와 같이 뒤집 었다는 것을 알았습니다 com.xxxxxxxx.app. 그러나 실제로 app.xxxxxxxx.com는 Google 개발자 콘솔에서입니다. 그래서 자동 생성 지문을 삭제하고 올바른 패키지 이름으로 지문을 추가했습니다. 팔!!. 효과가있었습니다.


이미지와 같이 Google 옵션이 활성화되지 않았을 때 오류가 나타났습니다 .

Google 계정을 변경하고 Google 연결 옵션을 설정하는 것을 잊었을 때 발생했습니다.


프로젝트에 숫자 또는 기호를 포함한 특수 문자가 포함되지 않아야합니다 (프로젝트 이름은 com.google.testproject와 같이 간단해야합니다).


필자의 경우 비 프로덕션 앱에서 작업하고 있었는데 문제는 firebase 콘솔에서 프로젝트를 만들 때 Firebase 및 Google 개발자 콘솔에서 SHA-1 키를 앞뒤로 동기화하는 데 문제가 있다는 것입니다. 그래서 먼저 Google Developer Console에서 프로젝트를 만든 다음 Firebase 콘솔에서 새 프로젝트를 만들 때 선택하기로 결정했습니다.

나는 또한 이것에 대한 튜토리얼만들었습니다 .


다음 옵션을 시도하십시오.

keytool -list -v -keystore C:\Users\MG\Desktop\test.jks -alias test

암호를 묻는 메시지가 표시되고 암호 만 입력하면됩니다. SHA1, MD5 지문을 볼 수 있습니다.

여기에 이미지 설명 입력


내 솔루션 : (편집 : 2019 년 1 월 4 일) 여기에 이미지 설명 입력

여기에 이미지 설명 입력

여기에 이미지 설명 입력

참고 URL : https://stackoverflow.com/questions/47632035/google-sign-in-error-12500

반응형