0

我已经在 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);
    }
}

这是良好登录成功后进行身份验证的最佳做法吗?

4

3 回答 3

1

对我来说,我将令牌发送到我的服务器,然后我在服务器端通过发送请求来验证它

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 id 重新登录并且令牌仍然有效。

于 2016-01-04T02:46:47.483 回答
0

使用以下代码访问姓名、电子邮件等数据

            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;
                        }
                    }

                }
于 2016-01-04T13:12:06.823 回答
0

我想补充一点。验证 google 帐户后,不应将电子邮件地址用作本地或网络服务器存储的主键。您应该使用帐户 ID,因为用户可以拥有多个电子邮件帐户,但总是具有相同的帐户 ID。

所以你可以这样做:

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

现在我们有了 accountID,我们可以继续使用它作为本地或网络服务器上任何数据库的主键。您还能如何处理多个电子邮件帐户?或者如果用户更改了主电子邮件地址怎么办。

更多信息在这里

我想提到的另一件事是,黑客可以通过不断猜测用户的电子邮件地址来攻击您的服务器,所以我不会基于电子邮件地址。我会使用令牌。在我从谷歌登录过程中获得令牌后,我会让 android 客户端将令牌上传到我的服务器,但随后我会让服务器与谷歌服务器对话,以再次使用此令牌验证电子邮件地址并验证令牌本身。

于 2016-01-09T23:08:34.317 回答