OAuth 2.0规范于2012年发布,很多大型互联网公司(比如:微信、微博、支付宝)对外提供的SDK中,授权部分基本上都是按这个规范来实现的。

OAuth 2.0提供了4种基本的标准授权流程,最为复杂的是Code(授权码)这种类型,流程图如下:(摘自RFC6749官方文档)

上图中有几个术语解释一下:

Resource: 受保护的资源,比如:用户abc在微信上的用户资料(头像,朋友圈之类)

Resource Owner:资源所有人,即:上面讲的用户abc

Client:指第三方应用,比如:微信

Authorization Server:授权服务器,可以理解成微信对外开放的SDK授权API

User-Agent: 用户代理,在一般的互联网应用中,这个通常就是指浏览器

其实这张图中,还隐藏了一个身份:Resource Server资源服务器,即真正提供资源访问接口的服务

整个流程如下:

A: 浏览器(User-Agent)请求第三方应用比如微信(Client)上的资源,这时候还没有access_token,所以微信会请求重定向到认证服务器(Authorization Server)

B: 认证服务器这时会呈现出一个授权界面(即:我们经常在手机遇到的微信授权认证界面,告诉用户XXX应用正在请求您在微信上的资料,然后下面有一个"同意授权"的按钮)

C: 用户同意授权后,认证服务器会返回浏览器一个code(本文称为授权码),通俗的理解,相当于浏览器这时候取了一个号(就象我们去银行办业务,大堂经理先给你一个排队号,这个号码并非敏感信息,被其它人知道了, 一般问题也不大),浏览器拿着这个号再去请求微信上的资源

D:再次被重定向到认证服务器,用code来换真正的访问令牌(access_token) (有点类似于银行排到你的号了,你拿这个号去X号柜台真正办理业务,这时人家会让你出示身份证,卡号等敏感信息,只不过在oAuth 2中,这些敏感信息是动态生成,有时效限制的),最终浏览器拿到了access_token

E: 有了access_token,浏览器访问微信上受保护的资源时,资源服务器校验access_token的合法性后,返回用户想要的资源。

注:上面提到的银行取号办理业务,这个示例可能有点牵强,大家主要记住[授权->拿Code->用Code换Access_Token->带着Access_Token访问资源]这一套流程。

下面这张图可能更容易理解一些:

除了授权码这种常用流程外,还有一种用户名、密码的流程也被广泛使用,序列图如下:

password模式与code模式最大的不同,在于没有code换access_token这一步。另外:由于access_token的有效期比较短,为了避免频繁按上述流程重新获取新access_token,oAuth还有一个refresh_token的概念,通常refresh_token过期时间比较长(比如:一周甚至更长),当发现access_token快过期时,可以主动用refresh_token去获取一个新的access_token,序列图如下:

流程搞清楚了,最后谈谈实现,spring-security有一个oAuth2的"插件",可以直接在spring-security的基础上支持oAuth2.0,项目地址:https://github.com/spring-projects/spring-security-oauth,项目的/samples/oauth2/下有二个示例,对应oAuth server与oAuth client端,有兴趣的可以研究下。

此外,oschina还有二个国人提供的优秀示例,我已经搬到github上了,地址:

https://github.com/yjmyzz/spring-oauth-server

https://github.com/yjmyzz/spring-oauth-client

不过关于spring-security-oauth2有几点要注意一下:

a)默认access_token的时间非常长,大约是12小时,建议调小

b)在access_token未过期时,多次请求将返回同一个access_token

c)在code模式下,client_secrect在第二步code换access_token时,才需要,第一步申请code不需要

参考文章:

1、帮你深入理解OAuth2.0协议

2、理解OAuth 2.0

3、spring-security-oauth 教程

4、OAuth2.0 RFC6749官方文档

5、OAuth 2 Developers Guide

oAuth 2.0 笔记的更多相关文章

  1. OAuth 2.0学习笔记

    文章目录 OAuth的作用就是让"客户端"安全可控地获取"用户"的授权,与"服务商提供商"进行互动. OAuth在"客户端&quo ...

  2. IdentityServer4 实现 OpenID Connect 和 OAuth 2.0

    关于 OAuth 2.0 的相关内容,点击查看:ASP.NET WebApi OWIN 实现 OAuth 2.0 OpenID 是一个去中心化的网上身份认证系统.对于支持 OpenID 的网站,用户不 ...

  3. OAuth 2.0 授权认证详解

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

  4. OAuth2.0笔记

    OAuth2.0笔记 角色 一般资源服务器和授权服务器是一个 资源拥有者 客户端应用 资源服务器 授权服务器 客户端类型 OAuth 2.0规范定义了两种客户端类型: 保密的:web应用 公有的:用户 ...

  5. ASP.NET WebApi OWIN 实现 OAuth 2.0

    OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth 允许用户提供一个令牌, ...

  6. 简述 OAuth 2.0 的运作流程

    本文将以用户使用 github 登录网站留言为例,简述 OAuth 2.0 的运作流程. 假如我有一个网站,你是我网站上的访客,看了文章想留言表示「朕已阅」,留言时发现有这个网站的帐号才能够留言,此时 ...

  7. IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API

    IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...

  8. [转]An introduction to OAuth 2.0 using Facebook in ASP.NET Core

    本文转自:http://andrewlock.net/an-introduction-to-oauth-2-using-facebook-in-asp-net-core/ This is the ne ...

  9. [转]OAuth 2.0 - Authorization Code授权方式详解

    本文转自:http://www.cnblogs.com/highend/archive/2012/07/06/oautn2_authorization_code.html I:OAuth 2.0 开发 ...

随机推荐

  1. Vertica节点宕机处理一例

    Vertica节点宕机处理一例: 查询数据库版本和各节点状态 常规方式启动宕机节点失败 进一步查看宕机节点的详细日志 定位问题并解决 1. 查询数据库版本和各节点状态 dbadmin=> sel ...

  2. JavaWeb——tomcat安装及目录介绍

    一.web web可以说,就是一套 请求->处理->响应 的流程.客户端使用浏览器(IE.FireFox等),通过网络(Network)连接到服务器上,使用HTTP协议发起请求(Reque ...

  3. .Net语言 APP开发平台——Smobiler学习日志:如何快速实现地图定位时的地点微调功能

    Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 样式一 一.目标样式 我们要实现上图中的效果,需要如下的操作: 二.地点微调代码 VB: Dim ...

  4. C++ tinyXML使用

    tinyXML下载: http://sourceforge.net/projects/tinyxml/ 加载到项目: 这六个文件添加到你的c++工程中,分别是tinystr.h.tinystr.cpp ...

  5. SQL SERVER 多数据导入

    public bool CreateTB_PROPERTY_MODELLByList(List<TB_PROPERTY_MODEL> entity) { try { //将集合转换成Dat ...

  6. C#开发微信门户及应用(9)-微信门户菜单管理及提交到微信服务器

    微信公众号(包括服务号和订阅号)都可以对菜单进行自定义设置,我们为了方便管理,一般先把菜单数据在本地管理维护,需要更新的时候,把它们更新到微信服务器上就可以了.本文基于这个方式,介绍我的微信门户平台管 ...

  7. STL的std::find和std::find_if

    std::find是用来查找容器元素算法,但是它只能查找容器元素为基本数据类型,如果想要查找类类型,应该使用find_if. 小例子: #include "stdafx.h" #i ...

  8. 细谈Slick(5)- 学习体会和将来实际应用的一些想法

    通过一段时间的学习和了解以及前面几篇关于Slick的讨论后对Slick这个函数式数据库编程工具有了些具体的了解.回顾我学习Slick的目的,产生了许多想法,觉着应该从实际的工作应用角度把我对Slick ...

  9. 《连载 | 物联网框架ServerSuperIO教程》- 3.设备驱动介绍

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  10. 子div设置浮动无法把父div撑开。

    <div class="mainBox"> <div class="leftBox"></div> <div clas ...