Ответ 1
Собственно, OAuth 2 - это то, что вы хотите, а не OpenID. OpenID по своей сути основан на веб-интерфейсе, поэтому вам нужно перепрыгнуть через некоторые обручи с помощью WebView
или браузера. OAuth 2 позволяет использовать токен из AccountManager с API Google прямо из приложения.
При вызове getAuthToken()
параметр authTokenType
- это область OAuth 2, для которой вы хотите быть userinfo.profile
и userinfo.email
для аутентификации адреса электронной почты (у вас уже есть это, но у вас нет проверили его, теоретически можно было подделать) и получить имя пользователя.
Вот то, что я использую для полного объема в подобной ситуации:
private static final String OAUTH2_SCOPE =
"oauth2:" +
"https://www.googleapis.com/auth/userinfo.profile" +
" " +
"https://www.googleapis.com/auth/userinfo.email";
Конечно, вы можете просто использовать весь строковый литерал, но я предпочитаю его создавать и быть понятным, и это облегчает изменение позже, если это необходимо.
В моем случае я использую getAuthTokenByFeatures()
, что-то вроде этого:
am.getAuthTokenByFeatures("com.google", OAUTH2_SCOPE, null, this, null, null,
new AccountManagerCallback<Bundle>()
{
public void run(AccountManagerFuture<Bundle> future) {
try {
Bundle bundle = future.getResult();
System.out.println("Got Bundle:\n" +
" act name: " +
bundle.getString(AccountManager.KEY_ACCOUNT_NAME) +
"\n act type: " +
bundle.getString(AccountManager.KEY_ACCOUNT_TYPE) +
"\n auth token: " +
bundle.getString(AccountManager.KEY_AUTHTOKEN));
} catch (Exception e) {
System.out.println("getAuthTokenByFeatures() cancelled or failed:");
e.printStackTrace();
}
}
}, null);
но вы можете применить ту же идею к своему коду. Затем вы можете использовать токен OAuth с API-интерфейсом пользователя Google, как описано в Использование OAuth 2.0 для входа в систему, чтобы проверить электронную почту и получить имя пользователя.