Android、AccountManager 和 OAuth

Android, AccountManager and OAuth

我确定这是基本的,我遗漏了一些东西。我已经阅读了关于 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]

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

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

AccountManager 代码片段不会对您有多大帮助,除非已经有一个应用程序可以为 Twitch 提供身份验证。如果不是这种情况,您要么需要使用现有的 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 存储来实现相同的目的(假定您在应用上下文中的网络视图中打开了 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。开启认证URL

理想情况下,您只需在 WebView inside of your app. In that case you need to intercept all request to load a new URL using 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 生成和存储密钥来加密访问令牌)。

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