文章目录

  • 学习资源来自:扔物线
  • 登录和授权的区别
  • HTTP 中确认授权(或登录)的两种方式
  • Cookie
  • Authorization
  • 主流用法:Basic
  • 主流用法:Bearer:
  • OAuth2 的流程:
  • 第三方 App 通过微信登录的流程
  • Refresh token
  • 课后题


学习资源来自:扔物线

登录和授权的区别

登录:身份认证,即确认「你是你」的过程。
授权:由身份或持有的令牌确认享有某些权限(例如获取用户信息)。而登录过
程实质上的目的也是为了确认权限。
因此,在实际的应用中,多数场景下的「登录」和「授权」界限是模糊的。

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

  1. 通过 Cookie
  2. 通过 Authorization Header

Cookie

起源:「购物⻋」功能的需求,由 Netscape 浏览器开发团队打造。

工作机制:

  1. 服务器需要客户端保存的内容,放在 Set-Cookie headers 里返回,客户端会自动保存。
  2. 客户端保存的 Cookies,会在之后的所有请求里都携带进 Cookie header里发回给服务器。

android 内置第三方应用不让显示在桌面_服务器


3. 客户端保存 Cookie 是按照服务器域名来分类的,例如 shop.com 发回的Cookie 保存下来以后,在之后向 games.com 的请求中并不会携带。

4. 客户端保存的 Cookie 在超时后会被删除、没有设置超时时间的 Cookie(称作 Session Cookie)在浏览器关闭后就会自动删除;另外,服务器也可以主动删除还未过期的客户端 Cookies。

android 内置第三方应用不让显示在桌面_App_02


android 内置第三方应用不让显示在桌面_App_03

  • Cookie 的作用
  • 会话管理:登录状态、购物⻋
  • 个性化:用户偏好、主题
  • Tracking:分析用户行为
  • XSS (Cross-site scripting)(了解即可):跨站脚本攻击。即使用 JavaScript 拿到浏览器的 Cookie 之后,发送到自己的网站,以这种方式来盗取用户Cookie。应对方式:Server 在发送 Cookie 时,敏感的 Cookie 加上HttpOnly。
  • 应对方式:HttpOnly——这个 Cookie 只能用于 HTTP 请求,不能被JavaScript 调用。它可以防止本地代码滥用 Cookie。
  • XSRF (Cross-site request forgery)(了解即可):跨站请求伪造。即在用户不知情的情况下访问已经保存了 Cookie 的网站,以此来越权操作用户账户(例如盗取用户资金)。应对方式主要是从服务器安全⻆度考虑,就不多说了。
  • 应对方式:Referer 校验

Authorization

主流用法:Basic

格式:

Authorization: Basic <username:password(Base64ed)>

主流用法:Bearer:

格式:

Authorization: Bearer <bearer token>
  • bearer token 的获取方式:通过 OAuth2 的授权流程

OAuth2 的流程:

  1. 第三方网站向授权方网站申请第三方授权合作,拿到 client id 和 client secret
  2. 用户在使用第三方网站时,点击「通过 XX (如 GitHub) 授权」按钮,第三方
    网站将⻚面跳转到授权方网站,并传入 client id 作为自己的身份标识
  3. 授权方网站根据 client id ,将第三方网站的信息和第三方网站需要的用户权
    限展示给用户,并询问用户是否同意授权
  4. android 内置第三方应用不让显示在桌面_学习_04

  5. 用户点击「同意授权」按钮后,授权方网站将⻚面跳转回第三方网站,并传入 Authorization code 作为用户认可的凭证。

android 内置第三方应用不让显示在桌面_android_05


5. 第三方网站将 Authorization code 发送回自己的服务器

android 内置第三方应用不让显示在桌面_服务器_06

  1. 服务器将 Authorization code 和自己的 client secret 一并发送给授权方的服务器,授权方服务器在验证通过后,返回 access token。OAuth授权流程结束。
  2. android 内置第三方应用不让显示在桌面_服务器_07

  3. 在上面的过程结束之后,第三方网站的服务器(或者有时客户端也会)就可以使用 access token 作为用户授权的令牌,向授权方网站发送请求来获取用户信息或操作用户账户。但这已经在 OAuth 流程之外。
  4. android 内置第三方应用不让显示在桌面_App_08

  • 为什么 OAuth 要引入 Authorization code,并需要申请授权的第三方将Authorization code 发送回自己的服务器,再从服务器来获取 access token,而不是直接返回 access token ?这样复杂的流程意义何在? 为了安全。OAuth不强制授权流程必须使用 HTTPS,因此需要保证当通信路径中存在窃听者时,依然具有足够高的安全性。

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

第三方 App 通过微信登录的流程,也是一个 OAuth2 流程

  1. 第三方 App 向腾讯申请第三方授权合作,拿到 client id 和 client secret
  2. 用户在使用第三方 App 时,点击「通过微信登录」,第三方 App 将使用微信 SDK 跳转到微信,并传入自己的 client id 作为自己的身份标识
  3. 微信通过和服务器交互,拿到第三方 App 的信息,并限制在界面中,然后询问用户是否同意授权该 App 使用微信来登录
  4. 用户点击「使用微信登录」后,微信和服务器交互将授权信息提交,然后跳转回第三方 App,并传入 Authorization code 作为用户认可的凭证
  5. 第三方 App 调用自己服务器的「微信登录」Api,并传入 Authorizationcode,然后等待服务器的响应
  6. 服务器在收到登录请求后,拿收到的 Authorization code 去向微信的第三方授权接口发送请求,将 Authorization code 和自己的 client secret 一起作为参数发送,微信在验证通过后,返回 access token
  7. 服务器在收到 access token 后,立即拿着 access token 去向微信的用户信息接口发送请求,微信验证通过后,返回用户信息
  8. 服务器在收到用户信息后,在自己的数据库中为用户创建一个账户,并使用从微信服务器拿来的用户信息填入自己的数据库,以及将用户的 ID 和用户的微信 ID 做关联
  9. 用户创建完成后,服务器向客户端的请求发送响应,传送回刚创建好的用户信息
  10. 客户端收到服务器响应,用户登录成功
  • 在自家 App 中使用 Bearer token
    有的 App 会在 Api 的设计中,将登录和授权设计成类似 OAuth2 的过程,但简化掉 Authorization code 概念。即:登录接口请求成功时,会返回 accesstoken,然后客户端在之后的请求中,就可以使用这个 access token 来当做bearer token 进行用户操作了。

Refresh token

{
"token_type": "Bearer",
"access_token": "xxxxx",
"refresh_token": "xxxxx",
"expires_time": "xxxxx"
}

用法:access token 有失效时间,在它失效后,调用 refresh token 接口,传入refresh_token 来获取新的 access token。

android 内置第三方应用不让显示在桌面_服务器_09


目的:安全。当 access token 失窃,由于它有失效时间,因此坏人只有较短的时间来「做坏事」;同时,由于(在标准的 OAuth2 流程中)refresh token 永远只存在与第三方服务的服务器中,因此 refresh token 几乎没有失窃的⻛险。

课后题

1.【单选题】HTTP 中会被用来使用登录授权的两个 Header 是什么?
A. Cookie 和 Authorization
B. Cookie 和 Authentication
C. Cache 和 Authorization
D. Cache 和 Authentication

答案: A
答案解析:HTTP 中用于登录授权的两个 Header 是 Cookie 和 Authorization。其中,Cookie 用于保存用户登录后的身份信息,而 Authorization 则用于在每次请求中携带用户的授权信息,以证明用户已经通过身份验证并具有相应的权限。因此选 A

2.【单选题】Cookie 的工作机制?
A. 服务器使用 Cookie header 返回希望客户端保存的信息,客户端在下次请求中使用 Cookie Header 将内容附上,然后删掉 Cookie
B. 服务器使用 Set-Cookie header 返回希望客户端保存的信息,客户端在下次请求中使用 Cookie Header 将内容附上,然后删掉 Cookie
C. 服务器使用 Cookie header 返回希望客户端保存的信息,客户端在以后的每次请求中使用 Cookie Header 将内容附上
D. 服务器使用 Set-Cookie header 返回希望客户端保存的信息,客户端在以后的每次请求中使用 Cookie Header 将内容附上

答案: D
答案解析:Cookie 是服务器在客户端上存储数据的一种方式。当客户端向服务器发送请求时,服务器会将 Set-Cookie header 包含在响应头中返回给客户端,以指示客户端保存特定的信息。客户端会将保存的 Cookie 数据附加在后续的请求头中,以供服务器使用。服务器可以使用 Cookie header 来获取客户端保存的数据,以实现用户的个性化体验。因此选 D

3.【多选题】Cookie 的作用?
A. 会话管理:登录状态、购物车
B. 个性化:用户偏好、主题
C. 用户追踪:分析用户行为、定向广告

答案: ABC
答案解析:

4.【单选题】当使用 Basic Authorization 进行授权的时候,格式是?
A. Authorization: Basic username:password
B. Authorization: Basic username:password(Base64ed)
C. Authorization: Basic username:password(MD5ed)

答案: B
答案解析:

5.【单选题】OAuth 流程中,Authorization code 的作用是?
A. 保证用户不会篡改授权信息
B. 保证恶意的监听者不会获取到真正可用的授权信息
C. 保证获取授权的第三方服务方不会滥用自己的授权信息
D. 保证授权信息可以正确到达申请授权的第三方服务方

答案: B
答案解析:在 OAuth 授权流程中,Authorization code 是由授权服务器颁发给客户端的临时授权码,其作用是保证授权码不会被篡改,从而防止恶意的监听者获取到真正可用的授权信息。因此,答案为 B。

6.【单选题】refresh token 的作用是?
A. 让用户保持每过一段时间登录一次,用委婉的方式保证用户在线时长
B. 强制性经常更换一下 access token,可以让服务器上不会有很久不用的 access token,提高系统的稳定性
C. 当 access token 失窃时,可以保证盗窃者在未被发现的情况下也只能在一段时间内使用 token,并且在发现 token 失窃之后可以立即换上新的 token 而无需用户重新授权

答案: C
答案解析:Refresh token 是用于在 access token 失效之前,用来获取新的 access token 的凭证。在 OAuth 2.0 授权机制中,Refresh token 可以用于延长 access token 的有效期,或者在 access token 丢失或被盗的情况下重新生成新的 access token,以保护应用的安全性。因此选 C