OAuth是什么
“Auth”表示 “授权”, “O” 是 Open 简称,表示 “开放” ,表示 “开放授权”。OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资
源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。
OAuth2.0是什么
OAuth2.0是OAuth协议的下一版本,但不向后兼容OAuth 1.0。 OAuth 2.0关注客户端开发者的简易 性,同时为Web应用,桌面应用和手机,和起居室设备提供专⻔的认证流程。2012年10月,OAuth 2.0协议正式发布为RFC 6749
OAuth2.0和OAuth1.0的区别
首先一点相对于1.0的Request_Token换Authorization_Code,Authorization_Code再换Access_Token的授权模式,2.0授权码模式提供了一种更简洁给力的授权码方式:Authorization_Code直接换Access_Token模式。
OAuth2.0里的Access_Token与1.0里的不同。1.0里包含3个字段: UserID, AccessToken, AccessTokenSecret。2.0里也包含3个字段: AccessToken,ExpiresIn (AccessToken的过期时间,按秒 计,很短,默认可能是1个小时)
RefreshToken (AccessToken过期时,用来获取新的AccessToken,具体做法是当使用AccessToken时 收到类似TokenInvalid或者TokenExpired的错误时,调用oauth2/accesstoken接口传递RefreshToken以获取新的AccessToken)
OAuth协议在生活中的应用场景
当有一天我正在公司工作时,自如管家突然给我通电话说,有新家具到了需要放到我的公寓里,询问我
是否可以申请一个临时密码,进入我的公寓摆放家具,我核实她的声音和预留的电话号码没有问题之
后,允许她申请临时密码进入我的公寓摆放家具。
我 ---> 资源拥有者
自如平台--->授权服务
自如管家 ----> 第三方平台
我的公寓 ------>资源服务
临时密码 ----> access_token
OAuth2.0在互联网中的应用场景
1.使用微信登录豆瓣
2.微信扫码授权
3.和手机号绑定
4.授权成功,获取到用户的微信昵称和微信头像
OAuth2.0的四种授权模式
1.隐式许可授权流程
适用场景:适用于没有后端的纯前端web应用,因此token令牌会存放在前端,由于没有授权码这个中间 步骤所以称之为“隐式许可”。
整体流程如下图
1) 第三方网站前端提供一个链接
https://qq.com/oauth/authorize? response_type=token& client_id=CLIENT_ID& redirect_uri=https://third.com/callback& scope=read
2) 授权服务校验,校验通过后会回调到https://third.com/callback这个回调地址,并拼接token参数
https://third.com/callback#token=ACCESS_TOKEN
2.客户端凭据许可
适用场景:适用于没有明确的资源拥有者,第三方软件后端直接使用注册的app_id和app_secret来获取访问令牌
1)第三方后端服务发起请求
https://oauth.qq.com/token? grant_type=client_credentials& client_id=CLIENT_ID& client_secret=CLIENT_SECRET
2) 授权服务校验后返回access_token
整体流程如下图:
3.资源拥有者凭据许可
适用场景:资源凭据就是用户的用户名和密码,该模式会直接暴露用户名和密码给接入服务,所以适用于接入服务和授权服务一样是同一个平台出品的场景。
1.第三方服务携带一下参数向授权服务发起请求,获取accessToken
整体流程如下图:
4.授权码模式
整体流程如下图:
1.用户访问第三方网站,第三方网站拼接上之前在开放平台注册的app_id和redirect_uri参数并设置response_type参数的值为code请求授权服务。重定向url携带参数:
2.授权服务根据第三方平台提供的appid和redirect_url对第三方平台进行合法性校验,生成对应的授权 ⻚面。
3.用户授权,授权服务队用户进行认证,认证通过,授权服务重定向到第三方平台提供的回调⻚面并且 携带code参数
4.第三方平台前端发起请求,后端携带上app_id和app_secret以及code等参数请求授权服务生成accessToken,
请求参数如下:
5.授权服务返回参数到第三方后台,第三方后台以session方式存储access_token等信息
OAuth2.0使用不当会导致哪些安全问题
1.互联网中常⻅的安全漏洞CSRF、XSS、水平越权
2.OAuth2.0专属的安全⻛险:重定向url被篡改、授权码失窃
1.跨站请求伪造(CSRF)
CSRF简单来说就是恶意软件已完成用户身份认证的网站发起请求,并执行有害操作在OAuth2.0中CSRF攻击示例:
跨站请求伪造解决方案:
1.验证HTTP Referer字段
2.state参数
2.跨站脚本攻击(XSS攻击)
XSS简单来说就是将恶意脚本注入到请求中,当受保护资源把输入内容回显到用户界面,浏览器解
析后用户触发这些代码遭到攻击
对于受保护资源可以做一些防御,比如对非法信息做转义过滤,比如包含、、等标签的信息 简单的XSS攻击示例
3.水平越权
水平越权是指,在请求受保护资源服务数据的时候,服务端应用程序未校验这条数据是否归属于当前授 权的请求用户,导致A用户获取到B用户的数据。
4.授权码失窃
授权码失窃后导致的安全问题简单示例:
5.重定向URl被篡改
简单实例图:
OAuth2.0 的架构参考案例
以下是携程基础架构部总监杨波给出的OAuth2.0可落地架构 第三方web应用+授权码许可模式:
- IDP(identity provider)服务:主要负责OAuth2.0授权,令牌的颁发和管理,通过login服务进行用 户认证。IDP的技术选型可以是当前主流的Spring Security OAuth
- 领域服务:领域服务在整个微服务架构的底层,这些服务包含业务逻辑,通常有自己独立的数据库 存在。领域服务是独立的开发、测试和发布单位,领域服务是无状态的
参考文档
阮一峰 - OAuth 2.0 的一个简单解释
阮一峰 - OAuth 2.0 的四种方式
极客时间OAuth2.0实战课
腾讯开放平台OAuth2.0简介
阿里云OAuth2.0应用概述