В запросе отсутствуют необходимые учетные данные для аутентификации. Ожидаемый токен доступа OAuth 2 - PullRequest
0 голосов
/ 29 мая 2020

мы пытаемся добавить в наш проект опцию 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?

1 Ответ

0 голосов
/ 30 мая 2020

мы решили это с помощью этого обходного пути

GoogleSignInAccount account = completedTask.getResult(ApiException.class);
            AsyncTask.execute(() -> {
                try {
                    String accessToken = GoogleAuthUtil.getToken(context, account.getAccount(), "oauth2:" + Scopes.PLUS_LOGIN);
                    runOnUiThread(() -> {
                        authWithGoogleToken(accessToken);
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });

            String accessToken = account.getIdToken();
            authWithGoogleToken(accessToken);
...