Хобрук: Ваш путь к мастерству в программировании

Android — Oauth2, AccountManager и Google: получение данных профиля

Я делаю приложение, которое должно позволить пользователю зарегистрироваться через свою учетную запись Google. Я хочу автоматически получать как можно больше информации о профиле. Я нашел этот очень интересный пример, который позволил бы мне получить много информации (см. шаг 4 это демо). Теперь, как я могу использовать его на Android? Я видел много примеров того, как получить токен аутентификации с помощью AccountManager с Oauth2 (пример), но я не знаю что делать оттуда, чтобы сделать эти звонки и получить эту информацию. Кроме того, в этом примере код написан на javascript, и я не знаю, как правильно перенести его на java...
Я уже выполнил регистрацию в консоли разработчика Google.
Являются ли Oauth2 и OpenID одним и тем же? Если нет, то должен ли я использовать один ИЛИ другой?



Ответы:


1

Готово. Как и ожидалось, я нашел всю информацию в документах и ​​с помощью Oauth2 Playground Google помог понять, что нужно отправить на https://www.googleapis.com/oauth2/v1/userinfo, чтобы получить данные профиля.
В итоге оказалось, что для этого нам не нужно создавать идентификатор клиента в консоли разработчика Google.
Теперь перейдем к коду. Активность:

public class MainActivity extends Activity {

    public Activity mContext;
    private AccountManager accountManager;
    private final String SCOPES = "oauth2:https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile";
    private String authToken;
    private GetProfileDataTask googleTask;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);

        mContext = this;

        accountManager = AccountManager.get(mContext);

        //other stuff here...
    }

    public void getProfileData() {

        accountManager.getAuthTokenByFeatures(
                "com.google", 
                SCOPES, 
                null, mContext, null, null, 
                new AccountManagerCallback<Bundle>() {
                    public void run(AccountManagerFuture<Bundle> future) {

                        try {
                            Bundle bundle = future.getResult();

                            //bundle.getString(AccountManager.KEY_ACCOUNT_NAME);
                            //bundle.getString(AccountManager.KEY_ACCOUNT_TYPE);

                            authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);

                        } catch (Exception e) {
                            System.out.println("getAuthTokenByFeatures() cancelled or failed:");
                            e.printStackTrace();
                            authToken = "failure";
                        }

                        if(!authToken.equals("failure")) {

                            googleTask = new GetProfileDataTask();
                            googleTask.execute(authToken);
                        }
                    }
                }, null);
    }
}

AsyncTask, который получает данные:

public class GetProfileDataTask extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... tokens) {

        RestTemplate restTemplate = new RestTemplate(false);
        restTemplate.getMessageConverters().add(new StringHttpMessageConverter());

        String json = null;

        try {
                //the response is of type "application/json"
            json = restTemplate.getForObject(
                    "https://www.googleapis.com/oauth2/v1/userinfo" + 
                    "?access_token={token}" + 
                    "&access_token_type=bearer", 
                    String.class, 
                    tokens[0]); //this is the authToken from before, obv

        } catch(RestClientException er) {
            Log.e("GetProfileDataTask", er.toString(), er);
            json = null;
        }

        return json;
    }

    @Override
    protected void onPostExecute(String asyncResult) {

        if(asyncResult != null)
            //do something with your data, for example deserialize it
        else
            //do something else
    }
}

Полученный json выглядит так:

{
  "family_name": "Smith", 
  "name": "John Smith", 
  "picture": "https://lh3.googleusercontent.com/-randomlettersandnumbers/AAAAAAAAAAI/AAAAAAAAAAA/morerandomlettersandnumbers/photo.jpg", 
  "locale": "it", 
  "gender": "male", 
  "email": "[email protected]", 
  "link": "https://plus.google.com/133780085840848123456", 
  "given_name": "John", 
  "id": "133780085840848123456", 
  "verified_email": true
}
28.05.2014

2

Поскольку вы хотите разрешить пользователям входить в ваше приложение через их учетные записи Google, вы можете использовать OpenID, и Google поддерживает это.

Примечание. Если вы предоставляете функцию входа с помощью Google, мы рекомендуем использовать вход через Google+.

Если вы просто хотите получить информацию о нас в Google от имени пользователей, вы можете просто использовать Oauth2. Обратитесь к официальным документам Google'а, я думаю, что они подробные, авторитетные и простые для понимания.

Как сказано в в этом документе:

5. Получите информацию о пользователе из токена ID

Идентификационный токен — это объект JSON с криптографической подписью, закодированный в базе 64. Обычно очень важно проверить идентификатор идентификатора перед его использованием, но, поскольку вы общаетесь напрямую с Google без посредников Канал HTTPS и используя свой секрет клиента для аутентификации в Google, вы можете быть уверены, что токен, который вы получаете, действительно исходит от Google и действителен.

Одним словом, внимательно прочитайте эти документы, и вы поймете, как реализовать свое приложение.

19.05.2014
  • Да, я уже прочитал большую часть этих документов и только что нашел несколько полезных: один, два. Я чувствую, что я близок к решению этого. По сути, теперь этот вопрос для меня, и я опубликую ответ с кодом, когда у меня все получится. 19.05.2014
  • Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..