Идентификация Android с помощью Google OpenID. Что дальше?

Я не программист, но мне нужно сделать это сам. Мне нужна помощь.

Я искал решение в течение последних двух дней, и я не могу найти его.

Ok. Я пишу Android Native App. Моя первая цель - добиться возможности входа в систему через аккаунт Google (который уже установлен на телефоне).

Итак, я использую AccountManager для получения учетной записи "com.google", я получаю токен аутентификации следующим образом:

Account[] mAccounts = mAccountManager.getAccountsByType("com.google"); 
AccountManagerFuture<Bundle> response = 
    mAccountManager.getAuthToken(mAccounts[0], "android", null, this, null, null);

Bundle authTokenBundle;
String authToken;

try {
    authTokenBundle = response.getResult();
    authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN).toString();
} catch (OperationCanceledException e) {
    Log.e(TAG, e.getMessage());
} catch (AuthenticatorException e) {
    Log.e(TAG, e.getMessage());
} catch (IOException e) {
    Log.e(TAG, e.getMessage());
}

И мой вопрос: каким должен быть следующий шаг? Как я могу продолжить этот процесс аутентификации? Как использовать этот токен?

Я нашел некоторые ресурсы, но большинство из них использует OAuth или работает в Интернете. Мне нужно только проверить подлинность и (если это возможно) получить имя пользователя (у меня уже есть адрес электронной почты), мне не нужно обращаться к каким-либо службам Google.

Спасибо заранее.

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