一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。
区别
-
登录
身份认证
-
授权
由身份或持有的令牌确认享有某些权限(例如获取用户信息)
登录的过程,实质上的目的也是为了确认权限
HTTP中确认授权/登录的两种方式
Cookie
-
起源
[购物车]功能的需求,有Netscape浏览器开发团队打造
-
工作机制
- 服务器需要客户端保存的内容,放在
Set-Cookieheaders里返回,客户端会自动保存; - 客户端保存的Cookies,会在之后的所有请求里携带进
Cookieheader里发回给服务器; - 客户端保存Cookie是按照服务器域名来分类的。比如在baidu.com返回的Cookie保存下来以后,在之后向google.com的请求中并不会携带;
- 客户端保存的Cookie在超时以后会被删除,没有设置超时时间的Cookie(称作
Session Cookie)在浏览器关闭后就会自动删除;另外,服务器也可以主动删除还未过期的客户端Cookies;
- 服务器需要客户端保存的内容,放在
-
作用
- 会话管理:登录状态、购物车
- 个性化:用户偏好、主题
- Tracing:分析用户行为
-
XSS(Cross-site scripting):跨站脚本攻击。即使用JavaScript拿到浏览器的Cookie后,发送到自己的网站,以这种方式来盗取用户Cookie
- 应对方式:Server在发送Cookie时,敏感的Cookie加上HttpOnly,表明这个Cookie只能用于HTTP请求,不能被JavaScript调用。它可以防止本地代码滥用Cookie
-
XSRF(Cross-site request forgery):跨站请求伪造。即在用户不知情的情况下访问了已经保存了Cookie的网站,以此来越权操作用户账户(比如盗取用户资金)。
- 应对方式:Referer校验
Authorization Header
Basic
-
格式:
Authorization: Basic <username:password(Baase64ed)>
Bearer
-
格式
Authorization: Bearer <bearer token> -
Bearer token的获取方式:通过OAuth2.0的授权流程
- 第三方网站向授权方网站申请第三方授权操作,拿到
client id和client secret; - 用户在使用第三方网站时,点击[通过XX(如Github授权)]按钮,第三方网站将页面跳转到授权方网站,并传入client id作为自己的身份标识;
- 授权方网站根据
client id,将第三方网站的信息和第三方网站需要的用户权限展示给用户,并询问用户是否同意授权; - 用户点击[同意授权]按钮后,授权方网站将页面跳转回第三方网站,并传入
Authorization code作为用户认可的凭证; - 第三方网站将
Authorization code发送回自己的服务器; - 服务器将
Authorization code和自己的client secret一并发送给授权方服务器,授权方服务器在验证通过后,返回access token,至此,OAuth流程结束; - 第三方网站的服务器(有时候客户端也会)就可以使用
access token作为用户授权的令牌,向授权方网站发送请求,来获取用户信息或者操作用户账户;
- 第三方网站向授权方网站申请第三方授权操作,拿到
-
第三方app通过微信登录的流程,也是一个OAuth2流程
- 第三方app向腾讯申请第三方授权合作,拿到
client id和client secret; - 用户在使用第三方app时,点击[通过微信登录],第三方app将使用微信SDK跳转到微信,并传入自己的
client id作为自己的身份标识; - 微信通过和服务器交互,拿到第三方app的信息,并限制在界面中,然后询问用户是否同意授权该app使用微信来登录;
- 用户点击[使用微信登录]后,微信和服务器交互将授权信息提交,然后跳转回第三方app,并传入
Authorization code作为用认可的凭证; - 第三方app调用自己服务器的[微信登录]Api,并传入
Authorization code,然后等待服务器的响应; - 服务器在收到登录请求后,拿着收到的Authorization code去向微信的第三方授权接口发送请求,将
Authorization code和自己的client secret一起作为参数发送,微信在验证通过后,返回access token; - 服务器在收到
access token后,立即拿着access token去向微信的用户信息接口发送请求,微信验证通过后,返回用户信息; - 服务器在收到用户信息后,在自己的数据库中为用户创建一个账户,并使用从微信服务器拿来的用户信息填入自己的数据库,以及将用户的ID和用户的微信ID做关联;
- 用户创建完成后,服务器向客户端的请求发送响应,传送回刚创建好的用户信息;
- 客户端收到服务器响应,用户登录成功;
- 第三方app向腾讯申请第三方授权合作,拿到
-
在自家app中使用
Bearer token有的app会在api的设计中,将登录和授权设计成类似OAuth2的过程,但是简化掉Authorization code概念。即:登录接口请求成功时,会返回access token,然后客户端在之后的请求中,就可以使用这个access token来当作bearer token进行操作了。
-
Refresh token
-
用法
access token有失效时间,在它失效后,调用refresh token接口,传入refresh_token来获取新的access token -
目的
安全。当
access token失窃,由于它有失效时间,因此坏人只有较短的时间来做[坏事];同时,由于(在标准的OAuth2流程中)refresh token永远只存在于第三方服务的服务器中,因此refresh token几乎没有失窃的风险