HTTP 中确认授权(或登录)的方式

1,772 阅读4分钟

什么是授权

授权就是由身份或持有的令牌确认享有某些权限(例如获取用户信息)。

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之后的过程

具体流程
  1. 第三方网站(juejin)向授权方网站(GitHub)申请第三方授权合作,拿到client id和client secret。
  2. 用户在使用第三方网站(juejin)时,点击「通过XX(如GitHub)授权」按钮,第三方网站(juejin)将⻚面跳转到授权方网站,并传入 client id 作为自己的身份标识。
  3. 授权方网站根据client id,将第三方网站的信息和第三方网站需要的用户权限展示给用户,并询问用户是否同意授权。
  4. 用户点击「同意授权」按钮后,授权方网站(GitHub)将⻚面跳转回第三方网站(juejin),并传入Authorization code 作为用户认可的凭证。
  5. 第三方网站将Authorization code发送回自己的服务器。
  6. 服务器将Authorization code和自己的client secret一并发送给授权方的 服务器,授权方服务器在验证通过后,返回 access token。OAuth 流程结束。
  7. 在上面的过程结束之后,第三方网站的服务器就可以使用 access token 作为用户授权的令牌,向授权方网站发送请求来获取用户信息或操作用户账户。但这已经在 OAuth 流程之外。
注意⚠️

OAuth2正规的流程是服务器和服务器之间的通信,有很多人为了方便,客服端直接拿着access token直接请求第三方授权服务器。这样是不安全的。因为在过程中access token是可以被获取的。

第三方 App 通过微信登录的流程

  1. 第三方App向腾讯申请第三方授权合作,拿到client id和client secret。

  2. 用户在使用第三方App时,点击「通过微信登录」,第三方App将使用微信 SDK 跳转到微信,并传入自己的 client id 作为自己的身份标识。

  3. 微信通过和服务器交互,拿到第三方App的信息,并限制在界面中,然后询问用户是否同意授权该 App 使用微信来登录。

  4. 第三方App调用自己服务器的「微信登录」Api,并传入Authorization code,然后等待服务器的响应。

  5. 服务器在收到登录请求后,拿收到的Authorization code去向微信的第三方授权接口发送请求,将Authorization code 和自己的 client secret 一起作为参数发送,微信在验证通过后,返回 access token。

  6. 服务器在收到access token后,立即拿着access token去向微信的用户信息接口发送请求,微信验证通过后,返回用户信息。

  7. 服务器在收到用户信息后,在自己的数据库中为用户创建一个账户,并使用从微信服务器拿来的用户信息填入自己的数据库,以及将用户的 ID 和用户的微信 ID 做关联。

  8. 用户创建完成后,服务器向客户端的请求发送响应,传送回刚创建好的用户信息。

  9. 客户端收到服务器响应,用户登录成功。

Refresh token

调用 refresh token 接口,传入 refresh_token 来获取新的 access token。

到达失效时间的时候,获取新的access token。

不需要每次更换新token客户端都重新登陆。直接走server对第三方授权server过程。

第三方授权服务器返回token格式,一般如下:

目的:安全。当 access token 失窃,由于它有失效时间,因此坏人只有较短的 时间来「做坏事」。