2015-12-05 3 views
16

Я последовал below steps as this linkПочему requestIdToken возвращает null?

  1. Я скачал Google-services.json в моей папке приложения.
  2. уровня Моего проекта Gradle Файл:

    dependencies { 
        classpath 'com.android.tools.build:gradle:1.3.0' 
        classpath 'com.google.gms:google-services:1.5.0-beta2' 
    } 
    
  3. Моего уровень приложения 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' 
        ... 
    } 
    
  4. Я создал OAuth клиента 2.0 ID для моего бэкэнда сервера и передать этот идентификатор клиента для строк. xml-файл.

  5. И, наконец, я создал 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() всегда возвращает ложь в функции handleSignInResult. Я думаю, может быть, я делаю что-то неправильно на 1-м или 2-м шагах. И мои коды почти схожи с этим SignInActivity.java. Любая помощь будет оценена по достоинству.

+0

IdToken Я думаю, что это https://github.com/googlesamples/google-services/blob/master/android/signin/app/src/main/java/com/google/samples/quickstart/signin/IdTokenActivity.java – BNK

+0

Я сделал то же самое, это действительный идентификатор клиентского сервера, но в функции onActivityResult result.isSuccess() снова возвращает false. – melomg

+0

У вас есть идентификатор клиента «OAuth 2.0», это его «веб-приложение» или «Android»? – BNK

ответ

29

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

Google Sign-In requestIdToken returns null

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

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

Создание OAuth клиента 2,0 ID для вашего бэкэнда сервера

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

  1. Открыть страницу учетных данных.
  2. Нажмите Добавить учетные данные> идентификатор клиента OAuth 2.0.
  3. Выбрать Веб-приложение.
  4. Нажмите «Создать».

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


Update 26 марта:

Android Developers Blog - Registering OAuth clients for Google Sign-In

+0

- это токен доступа? – neobie

+1

@neobie это токен для проверки подлинности на бэкэнд, пожалуйста, прочитайте на http://android-developers.blogspot.com/2016/03/registering-oauth-clients-for-google.html, однако я никогда не пробовал с ' GoogleIdTokenVerifier', который вы найдете на странице http://android-developers.blogspot.com/2016/01/using-google-sign-in-with-your-server.html. О токен доступа для доступа к API Google, также по этой ссылке вы найдете еще одну ссылку на http://android-developers.blogspot.com/2016/02/using-credentials-between-your-server.html – BNK

+1

@neobie Еще одна хорошая ссылка: https://developers.google.com/identity/sign-in/android/migration-guide#migrate_to_the_id_token_flow, пожалуйста, обратите внимание на «Если вам нужно только идентификатор пользователя, адрес электронной почты, имя или изображение профиля URL, используйте поток токенов ID. »И« Если вашему серверу необходимо получить доступ к другим API Google, таким как Google Диск, Youtube или Контакты, используйте поток аутентификации сервера ». Там вы найдете еще две ссылки с некоторыми примерами коды – BNK

11

В моем случае я имел previousl у,

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(); 

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

+0

У меня была та же проблема, и это исправлено. Это исправление отлично работает и в версии apk? –

+0

Да, это работает. Но для выпуска не забудьте поставить свой ключ sha1 для выпуска. –

+0

в консоли google api прямо? Я обновляю это на консоли api. Должен ли я также вводить код выпуска в код? –

0

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

new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 

        .requestServerAuthCode("WEBAPPLICATION CLIENT ID") 

        .requestEmail() 

        .build()) 

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

obtain web application client id as follows

аннулируются 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(); 
     } 
    } 
}); 

}

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

С успешным ответом у вас будет следующая информация в лог-коте:

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 доступен для дальнейшего использования.

+0

использует GoogleSignInAccount.getServerAuthCode(), чтобы получить код authcode для вышеуказанного вызова .add («код», «4/4-GMMhmHCXhWEzkobqIHGG_EnNYYsAkukHspeYUk9E8») –

Смежные вопросы