Как сделать авторизацию в приложении через Google+?

Здравствуйте!
Сейчас разрабатываю приложение под Android и хочу дать возможность пользователям авторизоваться/зарегистрироваться по email и через социальные сети(Google+, VK, Facebook, etc). Авторизацию по email сделал, все работает, но вот возникли трудности с авторизацией через соц. сети, например, с Google+. Прошу Вас ответить на возникшие вопросы!

  1. Какая должна быть структура таблиц для хранения информации о пользователе? Сейчас создал такую структуру:
    Table 'Users'        Table 'Social Account'
    _________________     _________________
    | id_user       |     | id
    | email         |     | id_user                
    | hash_password |     | name_network  
    | token         |     | id_user_network

    Правильно ли это? И стоит ли создать отдельно таблицу "Provider" для хранения информации о соц. сетях (например, название, адрес и т.д.)?

  2. Какая общая схема действий для авторизации через Google+?Правильно ли я понимаю:
    - 1 - Пользователь нажимает кнопку "Войти с помощью Google+
    - 2 - Дает разрешение на использование его данных
    - 3 - Мы делаем запрос на получение токена
    - 4 - Если токен пришел, то вызываем на сервере функцию авторизации и передаем ей наш токен
    - 5 - Делаем запрос на получение информации о юзере с помощью этого токена
    - 6 - Если все ок, то получаем информацию и производим проверку пользователя
    - 7 - Сначала ищем пользователя в таблице "Social Account" по полю "id_user_network"
    - 8 - Если находим то авторизуем
    - 9 - Если нет, то ищем пользователя по email в таблице "Users"
    - 10 - Если находим, то создаем запись в таблице "Social Account" и авторизуем пользователя
    - 11 - Если пользователя с таким email не нашли, значит он зашел в первый раз и тогда добавляем данные в таблицы "Users" и "Social Account"

  3. Как сделать проверку токена на сервере?.
    Сейчас я научился получать токен на стороне клиента:
    ...
     GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.server_client_id))
            .build();
    ...
    
    GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
    if (result.isSuccess()) {
        GoogleSignInAccount acct = result.getSignInAccount();
        String idToken = acct.getIdToken();
        mIdTokenTextView.setText("ID Token: " + idToken);
        // Вот здесь нужно отправить полученный токен на сервер и вызвать функцию проверки этого токена
    } else {
        mIdTokenTextView.setText("ID Token: null");
    }

    Проблем с отправкой токена нет, но как его проверить на сервере? Можете пример показать или ссылку на статью дать?



Пока ограничусь этими вопросами) Заранее спасибо Вам за проявленный интерес и Ваши ответы.
  • Вопрос задан
  • 2564 просмотра
Пригласить эксперта
Ответы на вопрос 2
zoonman
@zoonman
⋆⋆⋆⋆⋆
Схема действий верная.

Насчет проверки токенов идем на официальный сайт и читаем
https://developers.google.com/identity/sign-in/web...
https://developers.google.com/api-client-library/p...
У Google есть готовое SDK, нужно просто его подключить.
Ответ написан
Комментировать
Вызов, возвращающий сведения о пользователе:

https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=(ваш_токен)


Должен вернуться HTTP 200 OK и JSON со списком полей.
{
  "aud": GOOGLE_CLIENT_ID,
  "sub": GOOGLE_USER_ID,
  ... Ещё какие-то поля ..
}

Проверяем, соответствует ли aud нашему GOOGLE_CLIENT_ID и если да, пользуемся значением sub для идентификации пользователя.

GOOGLE_CLIENT_ID - это идентификатор, завершающийся на ".apps.googleusercontent.com", который можно получить в консоли Google API (создать Web Application)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы