使用Google OpenID进行Android身份验证。接下来是什么?

时间:2012-02-13 10:51:54

标签: android openid

我不是程序员,但我需要自己做。我需要一些帮助。

我一直在寻找过去两天的解决方案,我找不到任何解决方案。

确定。我正在编写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 个答案:

答案 0 :(得分:8)

实际上,OAuth 2是您想要的,而不是OpenID - OpenID本质上是基于Web的,因此您需要使用WebView或浏览器跳过一些环节。 OAuth 2允许您直接从应用程序使用AccountManager中的令牌与Google API。

在致电getAuthToken()时,authTokenType参数是OAuth 2范围,您希望userinfo.profileuserinfo.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令牌与Google用户信息API一起使用,如Using OAuth 2.0 for Login中所述验证电子邮件并获取用户名。