编程语言
首页 > 编程语言> > Java-Android,AccountManager和OAuth

Java-Android,AccountManager和OAuth

作者:互联网

我确定这是基本知识,并且我缺少一些东西.我已经阅读了有关SO的其他答案,我已经在Google上搜索过,已经阅读了资源,但是我无法将自己的头全都放在要做的事情上.

我试图弄清楚如何编写连接到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 one rror()));    // 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.这应该涵盖您需要了解的所有内容.

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

自己动手并不难,请参阅下文.

自己实施的步骤

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

1.获取客户ID

按照Developer Setup中所述注册您的应用以获取客户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]

显然,[您的客户ID]应该替换为您从Twitch收到的客户ID,[您的注册重定向URI](即上面的URL,即https:// localhost:12398 /)也是如此. [以空格分隔的范围列表]是范围的列表(即您要访问的功能),请参见Scopes.请确保您对参数值进行了正确的URL编码.

假设您的客户ID为123456,所需的范围为user_read和channel_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

请注意,您还应该传递一个状态参数,只需使用随机生成的值即可.您还可以附加(非标准)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.打开身份验证URL

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

将客户端重定向到您的重定向URL后,您可以关闭Web视图并继续执行步骤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是实际的访问令牌.

如果您通过了状态,则状态将如下所示:

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生成并存储用于加密访问令牌的密钥).

如果隐式颁发的访问令牌到期,则可以考虑使用“授权代码流”.这非常相似,但是它包含接收访问令牌的附加步骤和可用于更新访问令牌的“刷新令牌”.我让您自己弄清楚它是如何工作的.

标签:accountmanager,api,oauth,java,android
来源: https://codeday.me/bug/20191118/2031026.html