仅仅关注推特已经满足不了项目方的需求了,不少项目方还要求用户留下 Discord 账号,本文讲一下如何集成 Discord 授权获取用户信息。
可以先看一下效果:https://koor.github.io/discord-oauth/
创建 Application
- 打开 https://discord.com/developers/ ,填写一些信息即可。
- 进入创建好的 Application 从左侧打开 OAuth2,记录
CLIENT ID
和CLIENT SECRET
。 - 点击 Add Redirect,配置 Redirect URI,我理解的这个就是回调 URL,在 Discord 登录成功或失败后都会跳转到这个 URL,可以设置多个。
- 左侧打开 URL Generator,勾选 SCOPE 即需要用户授权的信息,然后生成 OAuth2 授权链接,记录下这个链接。
链接格式像这样:https://discord.com/api/oauth2/authorize?client_id=CLIENT_ID
&redirect_uri=REDIRECT_URI
&response_type=code&scope=SCOPE
&state=STATE
。可以看到除上面3个参数外,还有一个可选参数 state,用于传递自定义数据,比如用户 cookie 的 hash 等,增强安全性,防止 CSRF 攻击。
发起授权,获取授权码 code
- 页面上放一个“授权 Discord”按钮,按钮跳转到前面生成的 OAuth2 授权链接。
- 登录完成后会跳转到配置的 “Redirect URI”,同时 URL 上会加一个 code 参数,还有之前带的 state 参数。
获取 token
使用上一步拿到的 code 给 Token URL(https://discord.com/api/oauth2/token
) 发一个 POST 请求来获取 token,需要以下参数:
client_id
- Application 的 CLIENT IDclient_secret
- Application 的 CLIENT SECRETgrant_type
- 固定设置为authorization_code
code
- 上一步拿到的 coderedirect_uri
- Application 里配置好的 Redirect URI,和 OAuth 2 授权链接中的一致
返回数据:
{
"access_token": "6qrZcUqja7812RVdnEKjpzOL4CvHBFG",
"token_type": "Bearer",
"expires_in": 604800,
"refresh_token": "D43f5y0ahjqew82jZ4NViEr2YafMKhue",
"scope": "identify"
}
可以看到已经拿到了 token。
另外还有一种隐式授权的方法,可以不用提前获取 code 直接获取 token,这里就不展开了,详见官方文档。
获取用户数据
拿到 token 之后就可以获取用户数据了,给接口 https://discord.com/api/users/@me
发一个 GET 请求,请求头带上 token:
fetch('https://discord.com/api/users/@me', {
method: 'GET',
headers: {
authorization: 'Bearer 6qrZcUqja7812RVdnEKjpzOL4CvHBFG'
}
})
返回数据:
{
"id": "80351110224678912",
"username": "Nelly",
"discriminator": "1337",
"avatar": "8342729096ea3675442027381ff50dfe",
"verified": true,
"email": "nelly@discord.com",
"flags": 64,
"banner": "06c16474723fe537c283b8efa61a30c8",
"accent_color": 16711680,
"premium_type": 1,
"public_flags": 64
}
这样 Discord 的用户信息就拿到了。
在实际项目中,拿到 code 之后的操作都是由后端来完成,这个文章是把整个流程还原了一遍,前端开发者利用本文自己需要的部分即可。项目和代码示例已提交 GitHub。