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: ''
}