【问题标题】:Android, AccountManager and OAuthAndroid、AccountManager 和 OAuth
【发布时间】:2016-08-02 09:51:35
【问题描述】:

我确定这是基本的,但我遗漏了一些东西。我已经阅读了关于 SO 的其他答案,我用谷歌搜索过,我已经阅读了资源,但我无法理解我需要做什么。

我试图弄清楚如何编写一个连接到 Twitch API 的应用程序,特别是如何使用 Twitch 的 API 进行身份验证。他们的文档在这里:https://github.com/justintv/Twitch-API/blob/master/authentication.md

我创建了一个应用程序并存储了我的密钥。

现在是我希望我的用户单击在其网站上启动身份验证的按钮的部分。据我所知,我是通过使用 AccountManager 来做到这一点的。除了...我不知道我应该做什么。

这是我在网上找到的摘录:

AccountManager am = AccountManager.get(this);
        Bundle options = new Bundle();

        am.getAuthToken(
                myAccount_,                     // Account retrieved using getAccountsByType()
                "Manage your tasks",            // Auth scope
                options,                        // Authenticator-specific options
                this,                           // Your activity
                new OnTokenAcquired(),          // Callback called when a token is successfully acquired
                new Handler(new OnError()));    // Callback called if an error occurs

根据 twitch 的文档,我想将用户发送到:

https://api.twitch.tv/kraken/oauth2/authorize
    ?response_type=code
    &client_id=[your client ID]
    &redirect_uri=[your registered redirect URI]
    &scope=[space separated list of scopes]
    &state=[your provided unique token]

我根本不知道这两个东西需要如何结合。

【问题讨论】:

    标签: java android api oauth accountmanager


    【解决方案1】:

    首先,我建议阅读OAuth2 RFC。这应该涵盖您需要了解的所有内容。

    除非已经有一个为 Twitch 提供身份验证的应用程序,否则 AccountManager 代码 sn-p 不会对您有太大帮助。如果不是这种情况,您要么需要使用现有的 OAuth2 库,要么实现自己的。 您可以编写自己的 AccountAuthenticator,但这是一个不同的挑战(您仍然需要某种 OAuth2 客户端)。

    自己动手并不难,见下文。

    自己实现的步骤

    Twitch 建议对移动应用使用“隐式授权流程”。这就是我将在下面描述的内容。

    1。获取客户端 ID

    按照Developer Setup 中的说明注册您的应用以获取客户端 ID

    作为redirect URI,您可以使用https://localhost:12398/ 之类的东西,实际端口并不重要。

    2。构建身份验证 URL

    在您的客户端应用程序中,您需要像这样构建身份验证 URL:

    https://api.twitch.tv/kraken/oauth2/authorize?
        response_type=token&
        client_id=[your client ID]&
        redirect_uri=[your registered redirect URI]&
        scope=[space separated list of scopes]
    

    显然[your client ID] 应该替换为您从 Twitch 收到的客户端 ID,[your registered redirect URI] 也是如此(即上面的 URL,即https://localhost:12398/)。 [space separated list of scopes] 是范围列表(即您想要访问的功能),请参阅 Scopes。确保正确地对参数值进行 URL 编码。

    假设您的客户端 ID 是 123456 并且您需要的范围是 user_readchannel_read 您的 URL 将如下所示:

    https://api.twitch.tv/kraken/oauth2/authorize?
        response_type=token&
        client_id=123456&
        redirect_uri=https%3A%2F%2Flocalhost%3A12398%2F&
        scope=user_read%20channel_read
    

    请注意,您还应该传递一个state 参数,只需使用随机生成的值即可。您还可以附加(非标准) force_verify 参数以确保用户每次确实需要登录(而不是继续前一个会话),但我认为您可以通过清除 cookie 存储来实现相同的目的(假设您在您打开登录页面之前,在您的应用上下文中的 web 视图中打开 URL。

    在随机状态下,URL 如下所示:

    https://api.twitch.tv/kraken/oauth2/authorize?
        response_type=token&
        client_id=123456&
        redirect_uri=https%3A%2F%2Flocalhost%3A12398%2F&
        scope=user_read%20channel_read&
        state=82hdknaizuVBfd9847guHUIhndzhuehnb
    

    再次,确保状态值是正确的 URL 编码。

    3。打开认证网址

    理想情况下,您只需在应用内的 WebView 中打开 URL。在这种情况下,您需要使用 WebViewClient.shouldOverrideUrlLoading 拦截所有加载新 URL 的请求

    将客户端重定向到您的redirect URL 后,您可以关闭网络视图并继续执行第 4 步。

    理论上可以使用默认浏览器进行身份验证,但我会担心安全问题,因为外部应用程序可以了解您的客户端 ID 和访问令牌。

    4。提取访问令牌

    您在第 3 步中被重定向到的实际 URL 将具有以下形式:

    https://[your registered redirect URI]/#access_token=[an access token]&scope=[authorized scopes]
    

    或者举个例子

    https://localhost:12398/#access_token=xxx&scope=user_read%20channel_read
    

    其中xxx 是实际的访问令牌。

    如果您传递了state,它将像这样显示:

    https://localhost:12398/#access_token=xxx&scope=user_read%20channel_read&state=82hdknaizuVBfd9847guHUIhndzhuehnb
    

    您现在要做的就是解析(URL 编码的)访问令牌、范围和状态。将范围和状态与您实际发送的范围和状态进行比较。如果它们匹配,您可以开始使用 access_token 进行身份验证。

    注意根据 OAuth2 RFC,响应 URL 还必须包含 token_type 并且应该包含 expires_in 持续时间(以秒为单位)。

    收到访问令牌后,您可以使用它进行身份验证,如here 所述。

    由隐式授权流颁发的访问令牌通常在一定时间后过期,用户需要再次进行身份验证。 Twitch 文档没有提及任何到期时间,因此令牌可能永远有效。因此,请确保您的应用不存储它或以安全的方式存储它(例如使用Android's key store provider 生成和存储密钥以加密访问令牌)。

    如果隐式颁发的访问令牌过期,您可以考虑使用“授权代码流程”。这非常相似,但它包含一个额外的步骤来接收访问令牌和可用于更新访问令牌的“刷新令牌”。我让你来弄清楚它是如何工作的。

    【讨论】:

      猜你喜欢
      • 2011-10-02
      • 2016-12-24
      • 2011-07-28
      • 1970-01-01
      • 2015-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多