OAuth 2.0 实践篇

895 阅读1分钟

OAuth

用户想要登录 A 网站,A 网站让用户提供第三方网站的数据,证明自己的身份。获取第三方网站的身份数据,就需要 OAuth 授权。

比如 A 网站允许 B 网站 登录,流程大致如下:

  • A 网站让用户跳转到 B。
  • B 要求用户登录,然后询问 "A 网站要求获得 xx 权限,你是否同意?"
  • 用户同意,B 就会重定向回 A 网站,同时发回一个授权码。
  • A 网站使用授权码,向 B 请求令牌。
  • B 返回令牌。
  • A 网站使用令牌,向 B 请求用户数据。

第三方登录的实质就是 OAuth 授权。

应用登记

首先,A 网站允许用 B 登录,必须先到对方网站登记,让对方知道是谁在请求。

  • application name: 随便填
  • homepageURL: 网站首页地址
  • Authorization callback URL: 重定向的地址(用来拿code 和 token 的页面)

提交之后会生成 client_id 和 client_secret

简单写一个页面支持 GitHub 登录, 只有一个按钮 login with github 是一个 a 链接, 地址是 https://github.com/login/oauth/authorize?client_id=${client_id}&redirect_uri=${redirect_uri}

点击登录之后会让登录github

Sign in 之后返回的链接会带上生成的code, 用来获取token http://127.0.0.1:8080/oauth/redirect.html?code=f180cff926a4830b5d99

然后就可以用 code 获取 token

axios({
    method: 'post',
    url: `https://github.com/login/oauth/access_token?client_id=${client_id}&client_secret=${client_secret}&code=${code}&redirect_uri=${redirect_uri}&grant_type='authentication_code'`,
    headers: {
      accept: 'application/json'
    }
  })

返回的数据格式大致是这样的

{
  access_token: '50a72978875323e1936fd09d5459ebb9510b0d1aafafew12sf',
  token_type: 'bearer',
  scope: ''
}

Github OAuth 2.0 文档