Вход в Google из приложения для Android — что делать после успешного входа?

Я прочитал этот вопрос на SO , но я до сих пор не понимаю, как аутентифицировать пользователя после успешного входа в Google. У меня есть идея, и я жду от вас одобрения. После успешного входа в Google у меня будет доступ к объекту GoogleSignInAccount. В этом объекте я могу сделать что-то вроде хранения токена и электронной почты пользователей в качестве учетных данных в удаленной базе данных, чтобы я мог распознать профиль пользователей на моем сервере Это может выглядеть примерно так со стороны клиента Android:

private void handleSignInResult(GoogleSignInResult result) {
    Log.d(TAG, "handleSignInResult:" + result.isSuccess());
    if (result.isSuccess()) {
        // Signed in successfully, show authenticated UI.
        GoogleSignInAccount acct = result.getSignInAccount();
        //now that i have an account lets store the token
        String loginToken=acct.getIdToken();
       storeTokenInRemoteDb(acct.getEmail(),loginToken);
        updateUI(true);
    } else {
        // Signed out, show unauthenticated UI.
        updateUI(false);
    }
}

Является ли это лучшей практикой для аутентификации после успешного входа в систему?


person j2emanue    schedule 04.01.2016    source источник
comment
Ознакомьтесь с разработчиками Android. blogspot.com/2016/01/ ... получите токен идентификатора, отправьте его через HTTPS на свой сервер, проверьте его на своем сервере, используйте тему в качестве ключа в своей пользовательской БД и выдайте токен сеанса или cookie для вашего приложения.   -  person Steven    schedule 16.01.2016


Ответы (3)


Для меня я отправляю токен на свой сервер, а затем проверяю его на стороне сервера, отправляя запрос на

https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=YOUR_TOKEN

Это вернет что-то вроде этого, если токен все еще действителен

{
  "audience":"8819981768.apps.googleusercontent.com",
  "user_id":"123456789",
  "scope":"profile email",
  "expires_in":436
}

И затем я также сохраню токен локально на случай, если пользователь выйдет из моего приложения и попытается повторно войти в систему с тем же идентификатором Google, а токен все еще действителен.

person Niko Adrianus Yuwono    schedule 04.01.2016

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

            Log.d(TAG, "handleSignInResult:" + result.isSuccess());
            if (result.isSuccess()) {
                // Signed in successfully, show authenticated UI.
                GoogleSignInAccount acct = result.getSignInAccount();
                final String name = acct.getDisplayName();
                final String email = acct.getEmail();

                signOut();

                if (name.contains(" ")) {

                    for (int i = 0; i < name.length(); i++) {

                        if (name.charAt(i) == ' ') {
                            firstName = name.substring(0, i);
                            lastName = name.substring((i + 1),
                                    name.length());

                            break;
                        }
                    }

                }
person Jotiram Chavan    schedule 04.01.2016
comment
это не имеет отношения к моему вопросу. Я говорю о том, как аутентифицировать пользователя на моем сервере после успешного процесса входа в Google. - person j2emanue; 04.01.2016
comment
Я пытаюсь сказать то же самое. Просто используйте полученную электронную почту и отправьте ее на свой сервер. Проверьте ее доступность в БД. Если да, то отправьте ее для входа в систему, иначе зарегистрируйте пользователя. - person Jotiram Chavan; 04.01.2016
comment
я вижу, что вы говорите. вы не беспокоитесь о жетоне. вы просто используете адрес электронной почты для идентификации профиля пользователя, верно? Как вы думаете, разумно ли хранить токен учетной записи пользователя в базе данных серверов? Токен может стать недействительным, верно? - person j2emanue; 04.01.2016
comment
Это зависит от логики вашего приложения - person Jotiram Chavan; 05.01.2016

Я хотел кое-что добавить. Адрес электронной почты не следует использовать в качестве первичного ключа для вашего локального хранилища или хранилища на веб-сервере после аутентификации учетной записи Google. Вы должны использовать идентификатор учетной записи, так как пользователь может иметь несколько учетных записей электронной почты, но всегда будет иметь один и тот же идентификатор учетной записи.

Таким образом, вы можете сделать это следующим образом:

String accountName=Plus.AccountApi.getAccountName(mGoogleApiClient);
String accountID = GoogleAuthUtil.getAccountId(accountName);

теперь, когда у нас есть идентификатор учетной записи, мы можем использовать его в качестве первичного ключа в любой базе данных локально или на веб-сервере. Как еще вы можете обрабатывать несколько учетных записей электронной почты? Или что, если пользователь изменил основной адрес электронной почты.

дополнительная информация находится здесь

Еще одна вещь, которую я хотел упомянуть, это то, что хакер может атаковать ваш сервер, просто продолжая угадывать адрес электронной почты пользователя, поэтому я бы не стал основывать его на адресе электронной почты. Я бы использовал жетон. После того, как я получу токен из процесса входа в Google, я позволю клиенту Android загрузить токен на мой сервер, но затем я позволю серверу связаться с серверами Google, чтобы снова проверить адрес электронной почты с этим токеном и проверить сам токен.

person j2emanue    schedule 09.01.2016