安卓,账户管理器和OAuth

5
我相信这是基础内容,我可能遗漏了什么。我已经阅读了其他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]

我完全不知道这两件事情该如何结合在一起。

1个回答

5
首先,我建议阅读OAuth2 RFC。这应该涵盖你需要了解的一切。
除非已经有一个提供Twitch认证的应用程序,否则AccountManager代码片段对你帮助不大。如果这不是情况,你要么需要使用现有的OAuth2库,要么实施自己的库。 你可以编写自己的AccountAuthenticator,但这是一个不同的挑战(你仍然需要某种OAuth2客户端)。
自己实现不难,见下文。

实现步骤

Twitch建议移动应用程序使用“隐式授权流”。下面我将介绍这个。

1. 获取客户端ID

按照开发者设置中的说明注册你的应用程序以获取客户端ID。

作为“重定向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存储(假设您在应用程序的上下文中在webview中打开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中打开URL。在这种情况下,您需要拦截所有请求以使用WebViewClient.shouldOverrideUrlLoading加载新的URL。

一旦客户端被重定向到您的重定向URL,您可以关闭Webview并继续执行第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持续时间。
一旦收到访问令牌,您可以使用它进行身份验证,如此处所述。
通过Implicit Grant Flow发出的访问令牌通常会在一定时间后过期,并且用户需要重新进行身份验证。Twitch文档没有提到任何过期时间,因此令牌可能永久有效。因此,请确保您的应用程序不会存储它或以安全的方式存储它(例如使用Android的密钥存储提供程序生成和存储加密访问令牌的密钥)。
如果隐式颁发的访问令牌过期,您可以考虑使用“授权码流”。这与隐式流非常相似,但包含一个额外的步骤来接收访问令牌和“刷新令牌”,该令牌可用于更新访问令牌。我将其留给您自己去了解其工作原理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接