什么是授权
授权就是由身份或持有的令牌确认享有某些权限(例如获取用户信息)。
HTTP 中确认授权(或登录)的两种方式
Cookie
略。有机会再写。
Authorization Header
两种主流方式:Basic和Bearer
Basic
- 格式:Authorization:Basic<username:password(Base64ed)>
举个🌰
GitHub 用户名:MarioLu 密码:MarioLu666666666 MarioLu:MarioLu666666666进行Base64编码:TWFyaW9MdTpNYXJpb0x1NjY2NjY2NjY2
Header中传入Authorization:Basic<TWFyaW9MdTpNYXJpb0x1NjY2NjY2NjY2>
注意⚠️
安全风险,信息被截获,Base64可以被解码。可以使用Https来解决,截获了也没关系,都是密文。其实不是Base64的风险,而是HTTP的风险。 Basic token的信息会保存在本地,手机中。当手机被root的时候,给了某些应用高级权限,获取到了该信息。当如果被窃取了,唯一的解决办法就是改密码。
Bearer
- 格式:Authorization:Bearer<bearer token>
- bearer token 获取方式通过OAuth2的授权流程。
OAuth2
OAuth2流程
GitHub授权掘金
流程图
OAuth2过程
拿到access token之后的过程
具体流程
- 第三方网站(juejin)向授权方网站(GitHub)申请第三方授权合作,拿到client id和client secret。
- 用户在使用第三方网站(juejin)时,点击「通过XX(如GitHub)授权」按钮,第三方网站(juejin)将⻚面跳转到授权方网站,并传入 client id 作为自己的身份标识。
- 授权方网站根据client id,将第三方网站的信息和第三方网站需要的用户权限展示给用户,并询问用户是否同意授权。
- 用户点击「同意授权」按钮后,授权方网站(GitHub)将⻚面跳转回第三方网站(juejin),并传入Authorization code 作为用户认可的凭证。
- 第三方网站将Authorization code发送回自己的服务器。
- 服务器将Authorization code和自己的client secret一并发送给授权方的 服务器,授权方服务器在验证通过后,返回 access token。OAuth 流程结束。
- 在上面的过程结束之后,第三方网站的服务器就可以使用 access token 作为用户授权的令牌,向授权方网站发送请求来获取用户信息或操作用户账户。但这已经在 OAuth 流程之外。
注意⚠️
OAuth2正规的流程是服务器和服务器之间的通信,有很多人为了方便,客服端直接拿着access token直接请求第三方授权服务器。这样是不安全的。因为在过程中access token是可以被获取的。
第三方 App 通过微信登录的流程
-
第三方App向腾讯申请第三方授权合作,拿到client id和client secret。
-
用户在使用第三方App时,点击「通过微信登录」,第三方App将使用微信 SDK 跳转到微信,并传入自己的 client id 作为自己的身份标识。
-
微信通过和服务器交互,拿到第三方App的信息,并限制在界面中,然后询问用户是否同意授权该 App 使用微信来登录。
-
第三方App调用自己服务器的「微信登录」Api,并传入Authorization code,然后等待服务器的响应。
-
服务器在收到登录请求后,拿收到的Authorization code去向微信的第三方授权接口发送请求,将Authorization code 和自己的 client secret 一起作为参数发送,微信在验证通过后,返回 access token。
-
服务器在收到access token后,立即拿着access token去向微信的用户信息接口发送请求,微信验证通过后,返回用户信息。
-
服务器在收到用户信息后,在自己的数据库中为用户创建一个账户,并使用从微信服务器拿来的用户信息填入自己的数据库,以及将用户的 ID 和用户的微信 ID 做关联。
-
用户创建完成后,服务器向客户端的请求发送响应,传送回刚创建好的用户信息。
-
客户端收到服务器响应,用户登录成功。
Refresh token
调用 refresh token 接口,传入 refresh_token 来获取新的 access token。
到达失效时间的时候,获取新的access token。
不需要每次更换新token客户端都重新登陆。直接走server对第三方授权server过程。
第三方授权服务器返回token格式,一般如下:
目的:安全。当 access token 失窃,由于它有失效时间,因此坏人只有较短的 时间来「做坏事」。