Почему requestIdToken возвращает null?

Я следил за ниже, как эта ссылка

  • Я загрузил google-services.json в папку с моим приложением.
  • Мой уровень проекта gradle файл:

    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0'
        classpath 'com.google.gms:google-services:1.5.0-beta2'
    }
    
  • Мой уровень приложения gradle:

    apply plugin: 'com.android.application'
    apply plugin: 'com.google.gms.google-services'
    
    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        compile 'com.google.android.gms:play-services-identity:8.3.0'
        compile 'com.google.android.gms:play-services:8.3.0'
        compile 'com.google.android.gms:play-services-plus:8.3.0'
        compile 'com.google.android.gms:play-services-auth:8.3.0'
        ...
    }
    
  • Я создал идентификатор клиента OAuth 2.0 для моего серверного сервера и передал этот идентификатор клиента в файл strings.xml.

  • И, наконец, я создал объекты GoogleSignInOptions и GoogleApiClient, как показано ниже:

    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .requestIdToken(getString(R.string.server_client_id))
            .build();
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build();
    

    Но проблема заключается в result.isSuccess() всегда возвращает false в функции handleSignInResult. Я думаю, может быть, я делаю что-то неправильно на 1-м или 2-м шагах. И мои коды почти схожи с этим SignInActivity.java. Любая помощь будет оценена.

Ответы

Ответ 1

Как я ответил на следующий вопрос:

Запрос входа в систему GoogleIdToken возвращает null

Чтобы запросить Id Token успешно, вы должны использовать идентификатор клиента типа "Веб-приложение" вместо идентификатора клиента типа "Android".

Вы также найдете в документацию Google следующую информацию (пожалуйста, обратите внимание # 3):

Создайте идентификатор клиента OAuth 2.0 для вашего серверного сервера

Если ваше приложение проверяет подлинность с помощью серверного сервера или обращается к Google API с вашего серверного сервера, вы должны создать идентификатор клиента OAuth 2.0 для вашего сервера. Чтобы создать идентификатор клиента OAuth 2.0:

  • Откройте страницу учетных данных.
  • Нажмите Добавить учетные данные > идентификатор клиента OAuth 2.0.
  • Выберите Веб-приложение.
  • Нажмите "Создать".

Передайте этот идентификатор клиента в requestIdToken или requestServerAuthCode при создании объекта GoogleSignInOptions.


Обновление 26 марта:

Блог разработчиков Android - Регистрация клиентов OAuth для входа в Google

Ответ 2

В моем случае у меня был предыдущий y,

 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .build();

Я исправил это, добавив добавление метода requestToken,

 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .requestIdToken(getString(R.string.default_web_client_id))
            .build();

Теперь он работает для меня. Надеюсь, это может помочь кому-то, у кого есть такие проблемы, как я.

Ответ 3

Мы можем использовать метод requestServerAuthCode с "WebApplication ClientID" и создать метод для извлечения токена доступа, как показано ниже;

 new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)

                    .requestServerAuthCode("WEBAPPLICATION CLIENT ID")

                    .requestEmail()

                    .build())

Как видно, нам нужен идентификатор клиента WEBAPPLICATION, который можно получить по адресу https://console.developers.google.com;

получить идентификатор клиента веб-приложения следующим образом

void fetchGoogleAuthToken(){

    OkHttpClient okHttpclient = new OkHttpClient();
    RequestBody requestBody = new FormEncodingBuilder()
            .add("grant_type", "authorization_code")
            .add("client_id", "812741506391-
              h38jh0j4fv0ce1krdkiq0hfvt6n5amrf.apps.googleusercontent.com")
            .add("client_secret", "{clientSecret}")
            .add("redirect_uri","")
            .add("code", "4/4-GMMhmHCXhWEzkobqIHGG_EnNYYsAkukHspeYUk9E8")
            .build();

    final Request request = new Request.Builder()
            .url("https://www.googleapis.com/oauth2/v4/token")
            .post(requestBody)
            .build();

    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(final Request request, final IOException e) {
            Log.e(LOG_TAG, e.toString());                
        }

        @Override
        public void onResponse(Response response) throws IOException {
            try {
                JSONObject jsonObject = new 
                             JSONObject(response.body().string());
                final String message = jsonObject.toString(5);
                Log.i(LOG_TAG, message);                    
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    });
}

Пожалуйста, используйте compile 'com.squareup.okhttp: okhttp: 2.6.0' (версия 3-RC1 будет иметь разные классы), или вы можете использовать любой сетевой каркас для выполнения вышеуказанного вызова.

При успешном ответе у вас будет следующая информация в log-cat:

I/onResponse: {
          "expires_in": 3600,

          "token_type": "Bearer",

          "refresh_token": "1\/xz1eb0XU3....nxoALEVQ",

          "id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjQxMWY1Ym......yWVsUA",

     **"access_token": "ya29.bQKKYah-........_tkt980_qAGIo9yeWEG4"**
     }

как видно, acces_token доступен для дальнейшего использования.

Ответ 4

Я столкнулся с той же проблемой. Все, что я сделал, это просто снова загрузил файл google-services.json, заменил старый и все заработало. Не знаю, почему это произошло, я думаю, что-то изменилось, И перед перезаписью я забыл сравнить.