目录
- The tokens needed
- Register your application
- What is the OAuth Redirect URI
- Implicit grant flow
- Making the request
- Collecting the response
- What is next
代码
YouTube版本
简介
- 我已经开始了我的下一个应用程序,这是一个Twitch客户端应用。这个系列将是我创建此应用时所面临的所有笔记和问题。
获取访问令牌
- 在我们可以使用Twitch API做任何酷的事情之前,重要的是要了解开发人员为我们提供的两种代币类型。由于所有抽搐API端点都需要这两种令牌类型中的至少一个。
1)用户访问令牌:使我们访问需要用户访问权限的API。这种类型的代币的好处是,我们可以通过Implicit Grant flow检索它,并且如文档所述,我们不必提供客户的秘密。这意味着这种类型的令牌非常适合没有服务器的应用(例如移动应用程序)。不利的一面是,必须登录用户才能访问任何API数据。(this tutorial will be exploring this type of token)
2)应用程序访问令牌:不需要用户权限访问的API使用此类型的令牌。这种类型的令牌是通过authorization code grant flow获得的。此身份验证过程的缺点是需要使用client_secret
。这意味着我们不能在不使用反向代理服务器的情况下使应用程序100%安全。但是,好处是,用户不必登录其Twitch帐户即可访问API Data.(this tutorial will not be covering this type of token)
- 现在我们简要了解了我们使用的令牌,我们可以继续注册应用程序
注册申请
- 现在,如果我们查看Registering Your App文档,我们可以看到我们需要做的第一件事是create and register an application,它将看起来像这样:
-
现在,名称可以是您想要的,它必须在Twitch开发人员生态系统中是唯一的
-
我要引起您注意的部分是
OAuth Redirect URIs
。如果您以前从未听说过Oauth,我建议您观看此视频HERE,只需确保以2倍的速度观看。如果您不熟悉OAuth移动应用程序的流程,那么我想指出您以前的教程,找到了HERE。
Oauth重定向URI是什么?
- 您可能会注意到我已经使用
https://peanutbutterjelly
作为重定向URI,但是为什么呢?该URI的唯一限制部分是https
,因为Twitch将不允许任何其他类型的协议。peanutbutterjelly
部分纯粹由您决定,因为没有限制。但是,使用com.yourappname
(您的应用程序的名称) 是常见的做法
- 为了使我们正确使用此
OAuth Redirect URI
,我们必须使用适当的intent-filter。对于此特定的重定向URI,适当的意图过滤器是:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="peanutbutterjelly"
android:scheme="https"
/>
</intent-filter>
- 请注意,
host
和scheme
与重定向URI的完全相同。他们必须遵循这种模式:
<scheme>://<host>:<port>[<path>|<pathPrefix>|<pathPattern>|<pathAdvancedPattern>|<pathSuffix>]
- 可以找到该模式HERE
为什么我们需要一个意图过滤器?
-
一旦我们的用户通过浏览器登录到Twitch(我们这样做,因此我们的应用程序不知道用户的用户名或密码。这被认为是最佳实践)。 Android操作系统将发送一个Implicit Intent,以寻找可以使用
https://peanutbutterjelly
重定向URI处理意图的任何应用程序
-
您可以告诉您是否将意图过滤器弄乱了,如果成功的登录后,用户不是将用户引入您的应用程序,而是试图将重定向的URI加载到浏览器中。如果发生这种情况,则意味着您的意图过滤器未正确实现
隐式赠款流(应用程序访问令牌)
- 现在我们知道了我们正在使用的令牌并设置了一个意图过滤器。我们需要实施implicit grant flow
- 根据文档,我们需要向
https://id.twitch.tv/oauth2/authorize
提出请求,并为其提供Client_it
,redirect_uri
,response_type
和scope
的参数。最终,请求终点看起来像这样:
https://id.twitch.tv/oauth2/authorize?client_id=$clientId&redirect_uri=$redirectUri&response_type=token&scope=user:read:follows
- 只需将
$clientId
和$redirectUri
替换为您的应用程序所特有的值即可。 - 可以找到范围的范围。我正在使用
user:read:follows
,这将使我可以查看用户关注的频道列表。现在我们只需要提出一个请求
提出请求
- 现在,您可能会认为,为了提出请求,我们将使用Retrofit,但实际上我们将发出类似的隐含意图:
val twitchIntent = Intent(
Intent.ACTION_VIEW, Uri.parse(
"https://id.twitch.tv/oauth2/authorize?client_id=$clientId&redirect_uri=$redirectUri&response_type=token&scope=user:read:follows")
)
Button(onClick ={startActivity(twitchIntent)},modifier = Modifier.align(Alignment.Center)) {
Text("Login with Twitch", fontSize = 30.sp)
}
- 单击按钮时,将使用
startActivity(twitchIntent)
创建隐式意图,并且用户将直接转到默认浏览器应用程序,并将被要求登录
收集响应
- 从技术上讲,我们将收到隐性意图,并且我们已经设置了意图过滤器来做到这一点。但是现在我们必须从意图中获取数据
- 为了从意图中检索响应,我们可以在onresume()方法中这样做:
override fun onResume() {
super.onResume()
val uri:Uri? = intent.data
if(uri != null){
Log.d("Twitch",uri.toString())
}
}
- 如果一切都正确,我们应该得到:
https://peanutbutterjelly/#access_token=px4db8qo0uuaq75350id57h0ub6sze&scope=user%3Aread%3Afollows&token_type=bearer
下一步是什么?
- 在下一个教程中,我们将考虑使用此令牌来访问所有人遵循的所有流媒体
结论
- 感谢您抽出宝贵的时间阅读我的博客文章。如果您有任何疑问或疑虑,请在下面发表评论或在Twitter上与我联系。