通过Android中的AccountManager请求多个oauth2范围

时间:2012-07-14 16:12:33

标签: android api authentication oauth

我遇到的情况是我需要为两个范围(来自我的Android应用程序)请求访问令牌,https://www.googleapis.com/auth/userinfo.emailhttps://www.googleapis.com/auth/userinfo.userinfo

我希望在getAuthToken的单个调用中获得两个权限,但无法找出要传递authTokenType参数的字符串。我尝试了几种合理的组合,没有积极的结果:(

有没有人解决过这个问题?有可能吗?

2 个答案:

答案 0 :(得分:10)

我遇到了同样的问题。 Shah几乎是正确的,但他的范围字符串是错误的。它应该是

"oauth2:<scope_url> <scope_url>"

"oauth2:<scope_url> oauth2:<scope_url>"

答案 1 :(得分:6)

如果您需要多个OAuth 2.0范围use a space-separated list

oauth2:https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.userinfo

您要求提供示例代码,因此请查看Google Docs Upload Sample应用程序,并在此应用程序中查看this sample Android screen中完成的身份验证流程(忽略它是关于Google Docs的,它仍然授权第一)。您可以获取整个应用程序并在存在Google API的模拟器中运行它,也可以在手机上运行它。授权工作流程从buttonAuthorize click,Authorize()开始,您对此方法特别感兴趣:

private void gotAccount(Account account)
{

    Bundle options = new Bundle();

    accountManager.getAuthToken(
            account,                     // Account retrieved using getAccountsByType()
            "oauth2:https://www.googleapis.com/auth/userinfo.email oauth2:https://www.googleapis.com/auth/userinfo.userinfo",            // Auth scope
            //"writely",            // Auth scope, doesn't work :(
            options,                        // Authenticator-specific options
            this,                           // Your activity
            new OnTokenAcquired(),          // Callback called when a token is successfully acquired
            null);    // Callback called if an error occurs
}

用户获取此访问请求屏幕:

enter image description here

请注意,这是使用“本地”OAuth2机制,而不是打开网络浏览器,而是使用首次启动Android手机时提供的身份验证。

另请注意,用户会看到范围的完整网址而不是友好名称,我haven't找到了解决此问题的方法,如果您确实发现它会很好,如果您可以分享答案。