仅仅关注推特已经满足不了项目方的需求了,不少项目方还要求用户留下 Discord 账号,本文讲一下如何集成 Discord 授权获取用户信息。
可以先看一下效果:https://koor.github.io/discord-oauth/

创建 Application

  1. 打开 https://discord.com/developers/ ,填写一些信息即可。
  2. 进入创建好的 Application 从左侧打开 OAuth2,记录 CLIENT IDCLIENT SECRET
  3. 点击 Add Redirect,配置 Redirect URI,我理解的这个就是回调 URL,在 Discord 登录成功或失败后都会跳转到这个 URL,可以设置多个。
  4. 左侧打开 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

  1. 页面上放一个“授权 Discord”按钮,按钮跳转到前面生成的 OAuth2 授权链接。
  2. 登录完成后会跳转到配置的 “Redirect URI”,同时 URL 上会加一个 code 参数,还有之前带的 state 参数。

获取 token

使用上一步拿到的 code 给 Token URL(https://discord.com/api/oauth2/token) 发一个 POST 请求来获取 token,需要以下参数:

  • client_id - Application 的 CLIENT ID
  • client_secret - Application 的 CLIENT SECRET
  • grant_type - 固定设置为 authorization_code
  • code - 上一步拿到的 code
  • redirect_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