文章目录
- 学习资源来自:扔物线
- 登录和授权的区别
- HTTP 中确认授权(或登录)的两种方式
- Cookie
- Authorization
- 主流用法:Basic
- 主流用法:Bearer:
- OAuth2 的流程:
- 第三方 App 通过微信登录的流程
- Refresh token
- 课后题
学习资源来自:扔物线
登录和授权的区别
登录:身份认证,即确认「你是你」的过程。
授权:由身份或持有的令牌确认享有某些权限(例如获取用户信息)。而登录过
程实质上的目的也是为了确认权限。
因此,在实际的应用中,多数场景下的「登录」和「授权」界限是模糊的。
HTTP 中确认授权(或登录)的两种方式
- 通过 Cookie
- 通过 Authorization Header
Cookie
起源:「购物⻋」功能的需求,由 Netscape 浏览器开发团队打造。
工作机制:
- 服务器需要客户端保存的内容,放在 Set-Cookie headers 里返回,客户端会自动保存。
- 客户端保存的 Cookies,会在之后的所有请求里都携带进 Cookie header里发回给服务器。
3. 客户端保存 Cookie 是按照服务器域名来分类的,例如 shop.com 发回的Cookie 保存下来以后,在之后向 games.com 的请求中并不会携带。
4. 客户端保存的 Cookie 在超时后会被删除、没有设置超时时间的 Cookie(称作 Session Cookie)在浏览器关闭后就会自动删除;另外,服务器也可以主动删除还未过期的客户端 Cookies。
-
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 的流程:
-
第三方网站向授权方网站申请第三方授权合作,拿到 client id 和 client secret
-
用户在使用第三方网站时,点击「通过 XX (如 GitHub) 授权」按钮,第三方
网站将⻚面跳转到授权方网站,并传入 client id 作为自己的身份标识 -
授权方网站根据 client id ,将第三方网站的信息和第三方网站需要的用户权
限展示给用户,并询问用户是否同意授权
-
用户点击「同意授权」按钮后,授权方网站将⻚面跳转回第三方网站,并传入 Authorization code 作为用户认可的凭证。
5. 第三方网站将 Authorization code 发送回自己的服务器
-
服务器将 Authorization code 和自己的 client secret 一并发送给授权方的服务器,授权方服务器在验证通过后,返回 access token。OAuth授权流程结束。
-
在上面的过程结束之后,第三方网站的服务器(或者有时客户端也会)就可以使用 access token 作为用户授权的令牌,向授权方网站发送请求来获取用户信息或操作用户账户。但这已经在 OAuth 流程之外。
- 为什么 OAuth 要引入 Authorization code,并需要申请授权的第三方将Authorization code 发送回自己的服务器,再从服务器来获取 access token,而不是直接返回 access token ?这样复杂的流程意义何在? 为了安全。OAuth不强制授权流程必须使用 HTTPS,因此需要保证当通信路径中存在窃听者时,依然具有足够高的安全性。
第三方 App 通过微信登录的流程
第三方 App 通过微信登录的流程,也是一个 OAuth2 流程
-
第三方 App 向腾讯申请第三方授权合作,拿到 client id 和 client secret
-
用户在使用第三方 App 时,点击「通过微信登录」,第三方 App 将使用微信 SDK 跳转到微信,并传入自己的 client id 作为自己的身份标识
-
微信通过和服务器交互,拿到第三方 App 的信息,并限制在界面中,然后询问用户是否同意授权该 App 使用微信来登录
-
用户点击「使用微信登录」后,微信和服务器交互将授权信息提交,然后跳转回第三方 App,并传入 Authorization code 作为用户认可的凭证
-
第三方 App 调用自己服务器的「微信登录」Api,并传入 Authorizationcode,然后等待服务器的响应
-
服务器在收到登录请求后,拿收到的 Authorization code 去向微信的第三方授权接口发送请求,将 Authorization code 和自己的 client secret 一起作为参数发送,微信在验证通过后,返回 access token
-
服务器在收到 access token 后,立即拿着 access token 去向微信的用户信息接口发送请求,微信验证通过后,返回用户信息
-
服务器在收到用户信息后,在自己的数据库中为用户创建一个账户,并使用从微信服务器拿来的用户信息填入自己的数据库,以及将用户的 ID 和用户的微信 ID 做关联
-
用户创建完成后,服务器向客户端的请求发送响应,传送回刚创建好的用户信息
-
客户端收到服务器响应,用户登录成功
- 在自家 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。
目的:安全。当 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