Authentication 授权登录
OAuth 2.0是一个行业标准的授权协议,它允许对应用程序的范围进行更多的控制,并且可以在多个设备之间进行授权流程。OAuth 2.0允许你选择具体的精细化范围,这些范围为你代表一个用户提供特定的权限。 要在你的应用程序中启用OAuth 2.0,你必须在开发者门户的应用设置部分找到并启用你应用的认证设置中的OAuth 2.0。
Twitter免费版仅允许一个应用进行授权登录
除非在scope中设置了offline.access。默认情况下,通过带PKCE的授权代码流程创建的access token只会保持有效期两个小时。
应用设置你可以选择你的应用的认证设置为OAuth 1.0a或OAuth 2.0。你还可以启用应用同时访问OAuth 1.0a和OAuth 2.0。 OAuth 2.0只能与Twitter API v2一起使用。
如果你选择了OAuth 2.0,你将能够在应用的“密钥和令牌”部分看到客户端ID。机密客户端机密客户端可以安全地持有凭证,不会将它们暴露给未经授权的第三方,并能够与它们保存客户端密钥的授权服务器安全认证。公开客户端通常在浏览器或移动设备上运行,无法使用你的客户端密钥。如果你选择了一种机密客户端的应用类型,你将获得一个客户端密钥。
如果你在开发者门户中选择了一种机密客户端类型,你还将能够看到一个客户端密钥。你的选项有原生应用、单页应用、网络应用、自动化应用或机器人。原生应用和单页应用是公开客户端,网络应用和自动化应用或机器人是机密客户端。
对于带有有效授权头的机密客户端,你不需要Client ID。对于公开客户端的请求,你仍然需要在请求体中包含Client ID。
授权范围
- tweet.read / tweet.write 查看的所有推文及当前账户转发和发出的推文
- follows.read / follows.write 关注和被关注的用户
- like.read / like.write 点赞
...
授权流程
授权流程如下图所示:

实战流程
在Developer Portal中创建好APP后,在User Authentication settings这里点击Edit。

在APP Permissions中选择Read and write and Direct message。在Type of App中选择Native App
目前由于处于开发环境我们可以在回调URL中填写http://127.0.0.1:3000/twitter_auth。准备好Client ID。
将如下URL给到前端开发Button,用户点击后会跳转到前端/twitter_auth路由中,该路由将会获取twitter官方发出的code参数值。
https://twitter.com/i/oauth2/authorize?response_type=code&client_id=MWVjYmJKS2x4aFl2TkVYYnRCMkQ6MTpjaQ&redirect_uri=http://127.0.0.1:3000/twitter_auth&scope=tweet.read%20users.read%20follows.read%20offline.access&state=state&code_challenge=challenge&code_challenge_method=plain
当然我们也可以简单起见:
1. 发起授权
2. 验证
curl --location 'https://api.twitter.com/2/oauth2/token'
--header 'Content-Type: application/x-www-form-urlencoded'
--header 'Cookie: guest_id=v1%3A166539399762736297; guest_id_ads=v1%3A166539399762736297; guest_id_marketing=v1%3A166539399762736297; personalization_id="v1_VfKYUIP1Z7FdzmaqEs4KTw=="'
--data-urlencode 'code=OEZDQ2FRU2FiR1hFcXhRRlhTWHNkZWl5WW1ONEtNU2xWRXJPX3NmWV9JV0N1OjE3MTA0MDA1ODk3NjA6MToxOmFjOjE'
--data-urlencode 'grant_type=authorization_code'
--data-urlencode 'client_id=MWVjYmJKS2x4aFl2TkVYYnRCMkQ6MTpjaQ'
--data-urlencode 'redirect_uri=http://127.0.0.1'
--data-urlencode 'code_verifier=challenge'
获取数据
curl --location 'https://api.twitter.com/2/tweets/1307290179556630528'
--header 'Authorization: Bearer SkpGUGt2Skcyd1F5T1ZYTTZMTnVQM2s1NkktZnNYYkVieGFkSThwOERYeThkOjE3MTA0MDA1OTgxNjg6MTowOmF0OjE'
--header 'Cookie: guest_id=v1%3A166539399762736297; guest_id_ads=v1%3A166539399762736297; guest_id_marketing=v1%3A166539399762736297; personalization_id="v1_VfKYUIP1Z7FdzmaqEs4KTw=="'