理解 OAuth
本次分享的是阮一峰老师 2019 年写的介绍 OAuth 的 3 篇系列文章,深入浅出,值得一看。
下面是我总结的要点:
一、OAuth 是什么?
OAuth 2.0 是一种授权机制,主要用来给颁发令牌(token),获得用户在第三方网站上的数据。
比如,A 网站可以不要求用户在本网站注册,只要让用户提供 Ta 在某个第三方网站(比如 Github)上的数据,那么就能登录 A 网站。
其中,用户数据是从第三方网站授权得到的 token 中拿到的;同时,A 网站还要在第三方网站上登记,这样在请求 token 时,第三方能知道是谁在要我的用户数据。
二、OAuth 如何实现?
现在最常用的是通过授权码(authorization code)的方式进行 OAuth 授权,获取访问令牌(access token)。
以 Github OAuth 授权为例,步骤如下:
- A 网站让用户跳转到 GitHub。
- GitHub 要求用户登录,然后询问”A 网站要求获得 xx 权限,你是否同意?”
- 用户同意,GitHub 就会重定向回 A 网站,同时发回一个授权码。
- A 网站使用授权码,向 GitHub 请求令牌。
- GitHub 返回令牌.
- A 网站使用令牌,向 GitHub 请求用户数据。
具体如下:
- 先在 Github 上 登记应用,
- 使用登记信息,访问
https://github.com/login/oauth/authorize?client_id=7e015d8ce32370079895&redirect_uri=http://localhost:8080/oauth/redirect
, - 在 Github 上同意授权后,GitHub 跳转到 redirect_uri 指定的地址,携带授权码,如
http://localhost:8080/oauth/redirect?code=859310e7cecc9196f4af
, oauth/redirect
是我们的后端接口,接口内部 POST 请求https://github.com/login/oauth/access_token?client_id=${clientID}&client_secret=${clientSecret}&code=${requestToken}
,得到 access_token,- 最后使用 access_token,就能请求得到用户数据了
const result = await axios({
method: 'get',
url: `https://api.github.com/user`,
headers: {
accept: 'application/json',
Authorization: `token ${accessToken}`
}
});
(完)