мы пытаемся добавить в наш проект опцию Google Sign. Мы успешно добавили эту опцию на сайт и в приложение ios. Но столкнулись с трудностями при добавлении в приложение android. Используя опцию «Настроить проект» на этой странице https://developers.google.com/identity/sign-in/android/start-integrating, я указываю SHA1 ключа отладки Andrid (Gradle -> android -> signatureReport) и имя пакета (com.my.app). Эта форма дает нам идентификатор клиента типа WEB. Я загрузил учетные данные. json и поместил их в папку приложения проекта. Я также нашел идентификатор клиента типа android с указанным SHA1 ha sh в консоли Google API, но я не понимаю, где его использовать (если мы используем клиент oauth типа android, мы получим ошибку "signInResult : failed code = 10 ", поэтому мы должны использовать клиент веб-типа, и без такого android клиента в консоли API мы получим ошибку 12500 и без токена).
Затем мы добавили образец кода для получения токена и передаем его нашему внутреннему серверу в соответствии с этим документом https://developers.google.com/identity/sign-in/android/backend-auth.
private void enterGoogle() {
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.requestIdToken("12345-OurWebTypeClient.apps.googleusercontent.com").build();
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);
}
private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
try {
GoogleSignInAccount account = completedTask.getResult(ApiException.class);
String accessToken = account.getIdToken();
authWithGoogleToken(accessToken);
} 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());
}
}
private void authWithGoogleToken(String accessToken) {
if (accessToken == null)
Toast.makeText(context, "Error", Toast.LENGTH_SHORT).show();
else
RetrofitFactory.getInstance().authGoogle(accessToken)
.enqueue(new retrofit2.Callback<JsonObject>() {
@Override
public void onResponse(retrofit2.Call<JsonObject> call, retrofit2.Response<JsonObject> response) {
try {
if (response.isSuccessful() && response.body() != null) {
if (!response.body().has("error")) {
Toast.makeText(MainActivity.this, "Success!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, response.body().get("error").getAsString(), Toast.LENGTH_SHORT).show();
}
}
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(context, "Error", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(retrofit2.Call<JsonObject> call, Throwable t) {
Toast.makeText(context, "Error", Toast.LENGTH_SHORT).show();
}
});
}
используя этот код, мы получаем длинный токен, который начинается с «eyJ». Если мы немного изменим код, чтобы использовать альтернативные методы:
.requestServerAuthCode("12345-OurWebTypeClient.apps.googleusercontent.com").build();
и
String accessToken = completedTask.getResult().getServerAuthCode();
, мы получим короткий токен, который начинается с «4/0». Мы не знаем, чем отличаются эти 2 типа токенов от 2 методов получения токенов, но на внутреннем сервере мы получаем по одной ошибке для обоих типов токенов:
{
"error": {
"code": 401,
"message": "Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
"status": "UNAUTHENTICATED"
}
}
У нас нет такой ошибки для токен из iOS SDK например. Пожалуйста, помогите разобраться, что не так с реализацией Google Sign In в приложении Android?