基于实践说规范

  网上看了一些OAuth 2.0的授权方法,尽管讲解的没有什么逻辑性错误,但是存在一个问题,那就是单纯的讲解协议规范却脱离了实际的应用,缺少干货,所以才有了这篇文章,内容基于实际业务进行讲解,力求基于实践说规范

OAuth 2.0

  OAuth 引入了一个授权层,用来分离两种不同的角色:客户端和资源所有者。......资源所有者同意以后,资源服务器可以向客户端颁发令牌。客户端通过令牌,去请求数据。

  OAuth 2.0 规定了四种获得令牌的流程。你可以选择最适合自己的那一种,向第三方应用颁发令牌。下面就是这四种授权方式。
授权码(authorization-code)
隐藏式(implicit)
密码式(password)
客户端凭证(client credentials)

分类解读

下面针对每一种进行详细的解读

  授权码(authorization code)

    该类型的授权最为常见也是最安全的授权方式,指的是第三方应用先申请一个授权码,然后再用该码获取令牌,微信、支付宝等大的开放平台使用的基本都是这种方式。

  案例讲解:A网站要实现微信用户的授权登录功能,首先A需要在微信公众平台注册一个应用,一般需要填写应用图标名称回调链接等信息(有些平台需要上传对应的非对称加密的公钥用于访问的非对称加密),审核通过后平台为该应用分配对应的参数一般包括:appId,appsecret等信息。

    

    A网站开发人员拿到对应的信息后,需要携带appid、appsecret等信息访问开放平台指定链接,例如:

         https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECTURI&response_type=code&scope=SCOPE&state=STATE
    
 
                          
    通过上述链接进入到授权页面,如果未登录平台会要求用户微信登录,登录后平台会展示授权页面

    当用户点击授权后,平台会回调A网站在注册应用时提供的回调地址(有些平台需要申请授权时实时的提供),并携带code码(如有必要需要同时携带其他参数比如state参数),A网站拿到code码后通过平台提供的sdk获取openid、token、expired、refresh_oken、refesh_time等信息(code为参数调用开放平台接口获取参数)

  用户拿到openidtoken(令牌)就可以调用开放平台提供的服务了,到此,一个标准的授权码授权流程就结束了。需要知道的是token是有有效期的,适用方需要指定token刷新策略,通过refresh_oken调用刷新接口获取最新的token;

     思考:为什么开放平台回调的时候是返回code,而不是直接返回token、openid等信息

  • 直接返回token时涉及到跳转本身就是明文,可能被篡改的问题,需要协定复杂的签名协议来保证安全,这和 OAuth2 希望设计简洁验证模式的初衷违背;
  • 一般情况下code是用后即失效并且时效较短,无法重复使用和超时使用,但是token的有效期较长,并且能重复使用,某个用户对应的openid对A网站来说是唯一的,不会发生变化;
  • 要想获取token值需要提供appsecret作为参数(由第三方后端保存,不对外暴露),如果直接返回token,那么在页面授权的时候需要将appsecret显示的作为连接参数提供个开放平台,这显然不合理;
隐藏式(implicit)
有些 Web 应用是纯前端应用,没有后端。这时就不能用上面的方式了,必须将令牌储存在前端。RFC 6749 就规定了第二种方式,允许直接向前端颁发令牌。这种方式没有授权码这个中间步骤,所以称为(授权码)"隐藏式"(implicit)。 隐藏式授权的流程相对简单,但安全性不高,所以只能用于以下安全性要求不高的场景,其基本步骤如下:
  
  
第一步,A 网站提供一个链接,要求用户跳转到 B 网站,授权用户数据给 A 网站使用,如下:
https://b.com/oauth2/authorize?res_type=token&
client_id=CLIENT_ID& .
redirect_uri=CALLBACK_URL&
scope=read

上面的url中res_type=token,标示返回的参数为token,也可以用其他的约定形式例如(authtype=implicit

第二步,用户跳转到 B 网站,登录后同意给予 A 网站授权。这时,B 网站就会跳回redirect_uri参数指定的跳转网址,并且把令牌作为 URL 参数,传给 A 网站。
https://a.com/callback#token=ACCESS_TOKEN

 注意,令牌的位置是 URL 锚点(fragment),而不是查询参数,这是因为 OAuth 2.0 允许跳转网址是 HTTP 协议,因此存在"中间人攻击"的风险,而浏览器跳转时,锚点不会发到服务器,就减少了泄漏令牌的风险。

关于token有效期的问题,一般采用隐藏式授权的的引用的有效期一般定为会话期间,随着浏览器关闭,令牌随之失效。一般不涉及到令牌的刷新问题(授权码授权需要定期的更新令牌)

密码式(password)

如果你高度信任某个应用,RFC 6749 也允许用户把用户名和密码,直接告诉该应用。该应用就使用你的密码,申请令牌,这种方式称为"密码式"(password)

tips:B验证通过后不进行页面跳转而是把令牌放到json数据里面,最晚http回应的形式,返回对应的数据,个人认为这种形式要暴露自己的用户名和密码,风险性太大,因此只适用于其他授权方式无法采用的情况,不建议使用,现实实践中一般情况下使用appkey+secret+solt+timstamp+body数据加密的形式代替这种授权方法

客户端凭证(client credentials)

适用于没有前端的应用,即:第三方应用直接将appid、secret等参数作为凭证,通过后台接口调用授权方接口,授权方验证通过后直接返回对应的token信息
https://b.com/oauth/token?
grant_type=refresh_token&
client_id=CLIENT_ID&
client_secret=CLIENT_SECRET&
refresh_token=REFRESH_TOKEN

  

  OAuth2.0仅仅是个协议或者说是个规范,本身没有什么意义,它的意义在于为尝试为某种授权场景提供思路和规范,在设计自己的授权协议或者对接某开放平台的时候,能够思路清理的理解每一个步骤,并且做出正确的选择,显示时间中授权码的形式经常遇到,另外三种暂未遇到过,一般都是带有加密算法的变形应用(接口鉴权),小伙伴们要灵活掌握;在后面的文章中我会详细讲解接口鉴权的集中形式。


												

OAuth 2.0 授权方式讲解,规范实践和应用的更多相关文章

  1. React + Node 单页应用「二」OAuth 2.0 授权认证 & GitHub 授权实践

    关于项目 项目地址 预览地址 记录最近做的一个 demo,前端使用 React,用 React Router 实现前端路由,Koa 2 搭建 API Server, 最后通过 Nginx 做请求转发. ...

  2. 理解OAuth 2.0授权

    一.什么是OAuth 二.什么场景下会用到OAuth授权 三.OAuth 2.0中的4个成员 四.OAuth 2.0授权流程 五.OAuth 2.0授权模式 1.    authorization c ...

  3. 转 OAuth 2.0授权协议详解

    http://www.jb51.net/article/54948.htm 作者:阮一峰 字体:[增加 减小] 类型:转载 时间:2014-09-10我要评论 这篇文章主要介绍了OAuth 2.0授权 ...

  4. OAuth 2.0授权框架详解

    目录 简介 OAuth的构成 refresh Token Authorization Code模式 隐式授权 Resource Owner 授权密码认证 Client 认证授权 github的OAut ...

  5. OAuth2.0 授权方式及步骤梳理总结

    OAuth 2.0授权协议使第三方应用程序可以通过协调资源所有者和HTTP服务之间的批准交互,或者通过允许第三方应用程序代表资源所有者来获得对HTTP服务的有限访问权,或者代表资源所有者. 代表自己获 ...

  6. 基于 IdentityServer3 实现 OAuth 2.0 授权服务【密码模式(Resource Owner Password Credentials)】

    密码模式(Resource Owner Password Credentials Grant)中,用户向客户端提供自己的用户名和密码.客户端使用这些信息,向"服务商提供商"索要授权 ...

  7. OAuth 2.0 认证的原理与实践

    摘要: 使用 OAuth 2.0 认证的的好处是显然易见的.你只需要用同一个账号密码,就能在各个网站进行访问,而免去了在每个网站都进行注册的繁琐过程. 本文将介绍 OAuth 2.0 的原理,并基于 ...

  8. OAuth 2.0 授权码请求

    关于OAuth 2.0,请参见下面这两篇文章(墙裂推荐): <OAuth 2.0> <Spring Security OAuth 2.0> 纸上得来终觉浅,绝知此事要躬行.理论 ...

  9. OAuth 2.0 授权认证详解

    一.认识 OAuth 2.0 1.1 OAuth 2.0 应用场景 OAuth 2.0 标准目前被广泛应用在第三方登录场景中,以下是虚拟出来的角色,阐述 OAuth2 能帮我们干什么,引用阮一峰这篇理 ...

随机推荐

  1. Linux rsyslogd日志服务

    日志基本格式 基本日志格式包含四列: 事件发生的时间 发生事件的服务器的主机名 产生事件的服务名或程序名 事件的具体信息 /etc/rsyslog.conf配置文件 mail.*            ...

  2. docker-compose mysql和node连接认证mongo问题

    前言 最近,想部署一个自己的项目,鉴于自己的服务器是VPS(虚拟主机),配置也不够,就想到了用 docker 直接部署好了,这样既方便部署也方便不用的时候卸载或更新 然后本地搭建了环境,踩了一些坑,在 ...

  3. java正则匹配 指定内容以外的 内容

    今天,遇到一个需要 匹配出 指定内容以外的 内容的需求. 乍一看,需求貌视很简单啊,直接上 非贪婪模式的 双向零宽断言(有的资料上也叫 预搜索.预查.环视lookaround): 比如,我要匹配 串内 ...

  4. zabbix 交换机端口显示端口描述

    ZABBIX 监控系统流量图显示端口描述   进入web 选择配置--主机 选择触发器原型 编辑触发器 随便点开一个触发器 选择触发器原型   逐个点开修改 {#IFDESCR}: ({#IFALIA ...

  5. 95题--不同的二叉搜索树II(java、中等难度)

    题目描述:给定一个整数 n,生成所有由 1 ... n 为节点所组成的 二叉搜索树 . 示例如下: 分析:这一题需要对比LeetCode96题来分析:https://www.cnblogs.com/K ...

  6. Javascript:跳转到指定页面

    <div> <input type="text" id="jumpPage"/> <input type="button ...

  7. mysql安装过程以及遇到问题的解决方法

    因为工作原因,配备了新电脑,需要装mysql,今天给大家分享一下安装的过程以及遇到的问题(在此仅介绍压缩包解压方式的安装) 1.准备mysql的压缩包(我使用的是5.7经典版本) 2.配置环境变量,这 ...

  8. Vue-websocket使用

    Vue中使用websocket 1.介绍:websocket是一个双向通行工具,解决了原来的http单向通信的弊端,可以让服务器主动向客户端推送数据 // 安装客户端的socket npm i soc ...

  9. Spring事务之@Transactional

    参考源API : https://docs.spring.io/spring/docs/current/javadoc-api/ org.springframework.transaction.ann ...

  10. Nice Jquery Validator 常用规则整理

    一些简单规则 numeric: [/^[0-9]*$/, '请填写数值'], money: [/^(?:0|[1-9]\d*)(?:\.\d{1,2})?$/, "请填写有效的金额" ...