登录和第三方授权

336 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

区别

  • 登录

    身份认证

  • 授权

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

登录的过程,实质上的目的也是为了确认权限

HTTP中确认授权/登录的两种方式

Cookie

  • 起源

    [购物车]功能的需求,有Netscape浏览器开发团队打造

  • 工作机制

    1. 服务器需要客户端保存的内容,放在Set-Cookie headers里返回,客户端会自动保存;
    2. 客户端保存的Cookies,会在之后的所有请求里携带进Cookie header里发回给服务器;
    3. 客户端保存Cookie是按照服务器域名来分类的。比如在baidu.com返回的Cookie保存下来以后,在之后向google.com的请求中并不会携带;
    4. 客户端保存的Cookie在超时以后会被删除,没有设置超时时间的Cookie(称作Session Cookie)在浏览器关闭后就会自动删除;另外,服务器也可以主动删除还未过期的客户端Cookies;
  • 作用

    1. 会话管理:登录状态、购物车
    2. 个性化:用户偏好、主题
    3. 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的授权流程

    1. 第三方网站向授权方网站申请第三方授权操作,拿到client idclient secret
    2. 用户在使用第三方网站时,点击[通过XX(如Github授权)]按钮,第三方网站将页面跳转到授权方网站,并传入client id作为自己的身份标识;
    3. 授权方网站根据client id,将第三方网站的信息和第三方网站需要的用户权限展示给用户,并询问用户是否同意授权;
    4. 用户点击[同意授权]按钮后,授权方网站将页面跳转回第三方网站,并传入Authorization code作为用户认可的凭证;
    5. 第三方网站将Authorization code发送回自己的服务器;
    6. 服务器将Authorization code和自己的client secret一并发送给授权方服务器,授权方服务器在验证通过后,返回access token,至此,OAuth流程结束;
    7. 第三方网站的服务器(有时候客户端也会)就可以使用access token作为用户授权的令牌,向授权方网站发送请求,来获取用户信息或者操作用户账户;
  • 第三方app通过微信登录的流程,也是一个OAuth2流程

    1. 第三方app向腾讯申请第三方授权合作,拿到client idclient secret
    2. 用户在使用第三方app时,点击[通过微信登录],第三方app将使用微信SDK跳转到微信,并传入自己的client id作为自己的身份标识;
    3. 微信通过和服务器交互,拿到第三方app的信息,并限制在界面中,然后询问用户是否同意授权该app使用微信来登录;
    4. 用户点击[使用微信登录]后,微信和服务器交互将授权信息提交,然后跳转回第三方app,并传入Authorization code作为用认可的凭证;
    5. 第三方app调用自己服务器的[微信登录]Api,并传入Authorization code,然后等待服务器的响应;
    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概念。即:登录接口请求成功时,会返回access token,然后客户端在之后的请求中,就可以使用这个access token来当作bearer token进行操作了。

  • Refresh token

iShot2022-04-01_18.38.57.png

  • 用法

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

  • 目的

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