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 파일을 다운로드하고 프로젝트 앱 폴더에 추가합니다.
이것은 나를 위해 일했습니다.
먼저 Google 개발자 콘솔에 앱을 등록했는지 확인하세요.
Firebase 애플리케이션에 debug
및 release
키 가 모두 있는지 확인하세요 . 이 오류가 프로덕션에서 나타나면 SHA-1 release key
기본 앱에 추가하십시오 . 개발중인 경우 SHA-1 debug key
.
디버그 / 릴리스 키 얻기 :
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
에서) ~/.android
에 platform/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
객체 아래 )에 나열된 키로 변경 합니다.
다음 사항이 올바르게 설정되었는지 확인하십시오.
- Google 프로젝트에서 클라이언트 ID를 생성합니다.
- 해당 클라이언트 ID에 적절한 SHA-1 키를 제공하십시오. (디버그 / 릴리스)
- 해당 클라이언트 ID에 대한 적절한 패키지 이름을 제공하십시오.
- 만들기 확실히 당신은 고객 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 지문을 볼 수 있습니다.
참고 URL : https://stackoverflow.com/questions/47632035/google-sign-in-error-12500
'your programing' 카테고리의 다른 글
Django에서 DISTINCT 개별 열을 선택 하시겠습니까? (0) | 2020.10.06 |
---|---|
null 가능성이있는 개체에 대해 ToString을 수행하는 방법은 무엇입니까? (0) | 2020.10.06 |
msbuild를 사용하여 모든 파일 및 폴더 복사 (0) | 2020.10.06 |
django.core.exceptions.ImproperlyConfigured : MySQLdb 모듈로드 오류 : MySQLdb라는 모듈이 없습니다. (0) | 2020.10.06 |
Laravel-Ajax 요청 여부 확인 (0) | 2020.10.06 |