Почему 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, заменил старый и все заработало. Не знаю, почему это произошло, я думаю, что-то изменилось, И перед перезаписью я забыл сравнить.