一、什么是OAuth?
OAuth是一个授权规范,可以使A应用在受限的情况下访问B应用中用户的资源(前提是经过了该用户的授权,而A应用并不需要也无法知道用户在B应用中的账号和密码),资源通常以REST API的方式暴露。
 
二、什么是OAuth2.0?
有2.0自然有1.0,相比1.0,2.0有如下不同:
  • 授权过程比1.0更简洁
  • 全程使用https,保证安全的同时,又省去了1.0中对每个token都要加密的要求
  • 2.0针对客户端的各种类型,提出了多种获取访问令牌的途径
三、为什么要用OAuth?
传统的client-server 认证模式下,客户端一般通过资源所有者的账号/密码,来向服务端请求某个受保护的资源。那么,为了能让第三方应用访问这些受保护的资源,资源所有者可能需要与第三方应用共享自己的账号/密码,但是这么做存在一些问题:
  • 第三方应用需要存储资源所有者的账号/密码,以便将来再次使用,并且通常会以明文的方式存储。
  • 第三方应用能访问资源所有者全部的受保护资源,资源所有者无法约束其访问的期限以及能够访问的资源边界。
  • 资源所有者无法单独取消个别第三方应用的访问权限,要么全部允许,要么全部不允许。
OAuth 可以解决这些问题,方法是引入一个授权层,并且将客户端与资源所有者的角色分离。OAuth下,客户端可以访问哪些资源受资源所有者控制,并且客户端的访问凭证与资源所有者是不同的。客户端不再使用资源所有者的凭证访问受保护的资源,而是通过获取一个access token(一个字符串,能够表 示访问的边界,访问的期限等访问属性)。在经过用户授权后,access token会由一个授权服务器发布给第三方客户端。然后,第三方客户端使用access token到资源服务器访问受保护的资源。
 
四、进一步理解OAuth2.0
1、OAuth中涉及的几个角色:
  • resource owner:资源所有者,通常就是指终端用户。
  • resource server:资源服务器,持有受保护的资源,能够捕获请求中的access token。
  • client:第三方应用,需访问资源所有者受保护资源的应用。“client”在auth中只是一个术语,统指第三方应用,与该应用的执行是在服务器,桌面或其它设备上无关。
  • authorization server:授权服务器,负责颁发access token 给client,前提是client已经获取了资源所有者的授权。
       2、协议流示意图
C:\Users\jiabao\AppData\Local\Temp\enhtmlclip\Image.png
  • (1)client请求用户授权以访问资源;
  • (2)如果用户授权,client会接收到一个授权许可;
  • (3)client凭借授权许可及客户端身份标识,请求access token;
  • (4)如果client身份和授权许可都认证通过,授权服务器会颁发令牌;
  • (5)client凭借访问令牌到资源服务器请求资源;
  • (6)如果访问令牌有效,资源服务器会返回相应资源给client。
3、该协议流是总体概念,实际会根据使用的授权许可的类型不同而有所差异,OAuth2.0有4种授权许可类型:
  • Authorization Code:授权码
授权码从授权服务器获得,授权服务器充当client和resource owner的中间者。client不会直接从Resource Owner请求授权,而是引导Resource Owner到授权服务器,授权服务器会反向引导Resource Owner至client,并带上授权码。返回授权码之前,由授权服务器验证Resource Owner的身份以及授权情况,因为ResourceOwner只会在授权服务器做认证,Resource Owner的凭证信息是不会让client知晓的。授权码在安全方面带来了一些重要的好处,比如对客户端认证的能力,以及避免了直接通过Resource Owner的user-agent(比如浏览器)来传输access token,使得access token对其他人不可见,包括Resource Owner自己,大大降低了access token泄露的风险。
  • Implicit:隐式
Implicit许可类型是针对clients简化过的授权码许可类型,在浏览器利用脚本语言来实现。使用Implicit类型,用户授权后,client直接获取一个access token,而不是获取一个授权码。由于没有像授权码一样的中间凭证产生,所以授权许可是隐式的。由于这种特性,在某些使用浏览器进行URI重定向的场景下,access token可能会暴露。Implicit改善了一些clients的响应效率,但是也带来了安全隐患,所以建议一般只在Mobile Apps等不那么容易从URI中获取信息的应用中并且授权码类型不可用的场景下使用。
  • Resource Owner Password Credentials:
直接使用资源所有者的密码凭证(比如:用户名和密码)作为授权许可来获取access token。该类型下虽然client知晓了Resource Owner的凭证,但是可以通过换取一个长生命周期的access token或 refresh token 来避免长期存储凭证以便将来再次使用的需要。但是除非client是被高度受信任的,并且授权码类型不能使用的场景外不建议使用。
  • Client Credentials:
客户端凭证(或其它的认证形式)可以直接用作授权许可。适用于授权边界不需要Resource Owner控制或者能够在授权服务器预先配置的场景,比如在多个资源服务器共用统一用户中心的场景下,资源服务器之间需要相互访问,此时client可能也是resource owner 或者resource server。
 
五、如何实现OAuth2.0?
开源界有很多基于各种语言实现的OAuth2.0的框架,我们可以根据自身的需要选择符合自己要求的框架,但是很有可能分析下来,我们会发现有些语言领域的OAuth2.0框架并不能满足实际的需求。
比如我们只想实现类似“一处登录,处处同行(单点登录);或者一个帐号多处登录(联合登录,比如使用QQ、微信帐号登录)”的特性,使用类似Spring Security OAuth就有些太重了(除非你已经再用并且非常熟悉了),而Apache Oltu又过于粗糙,基本只提供了空架子,还要依赖它的各种包,Light OAuth2倒是很轻量,但又和undertow紧耦合,所以自研一套更轻量级的、可扩展的、适用自身业务场景的OAuth2.0框架会显得更合适。
笔者曾花费一些时间自研了一套OAuth2.0的框架,目前只包含OAuth2.0的授权码许可类型,支持联合登录和单点登录,拥有完整的统一用户中心体系,支持用户登录认证层和缓存层的自定义。其详细的时序图如下:
联合登录时序图:
       
 
单点登录时序图:

ok,本篇就这么多内容啦~,感谢阅读O(∩_∩)O。

OAuth2.0概念以及实现思路简介的更多相关文章

  1. Spring Cloud Zuul 网关使用与 OAuth2.0 认证授权服务

    API 网关的出现的原因是微服务架构的出现,不同的微服务一般会有不同的服务地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 客户端会 ...

  2. IdentityServer4:IdentityServer4+API+Client实践OAuth2.0客户端模式(1)

    一.OAuth2.0 1.OAuth2.0概念 OAuth2.0(Open Authorization)是一个开放授权协议:第三方应用不需要接触到用户的账户信息(如用户名密码),通过用户的授权访问用户 ...

  3. OAuth2.0 原理简介

    写在前面: 在正式介绍OAuth2.0之前我们先来看一个场景:小李是一个文艺小青年, 经常喜欢出去旅游并且把自己旅行中的美景照片分享到各大社交网站上,比如朋友圈,新浪微博.小李马上要向女朋友求婚了,他 ...

  4. OAuth2.0的那点荒唐小秘密 -几个简单概念和原理

    OAuth2.0这个名词你是否在项目中时常听到呢?是否觉得好像懂,又好像不太懂呢? 最近一直想写篇关于OAuth2.0的东西,记录下我的学习与感悟,然各种理由的拖延,直到今日才静下心来写下这篇博客.当 ...

  5. OAuth2.0系列之基本概念和运作流程(一)

    @ 目录 一.OAuth2.0是什么? 1.1 OAuth2.0简介 1.2 OAuth2.0官方文档 二.OAuth2.0原理 2.1 OAuth2.0流程图 三. OAuth2.0的角色 四.OA ...

  6. Spring Cloud Security OAuth2.0 认证授权系列(一) 基础概念

    世界上最快的捷径,就是脚踏实地,本文已收录[架构技术专栏]关注这个喜欢分享的地方. 前序 最近想搞下基于Spring Cloud的认证授权平台,总体想法是可以对服务间授权,想做一个基于Agent 的无 ...

  7. Oauth2.0 协议简介及 php实例代码

    转自:http://www.dahouduan.com/2017/11/21/oauth2-php/ https://blog.csdn.net/halsonhe/article/details/81 ...

  8. SimpleSSO:使用Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端

    目录 前言 OAuth2.0简介 授权模式 (SimpleSSO示例) 使用Microsoft.Owin.Security.SimpleSSO模拟OpenID认证 通过authorization co ...

  9. 深入理解OAuth2.0协议

    1. 引言 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间.是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题.豪车一般配备两种钥匙:主钥匙和泊车钥匙.当你到酒店 ...

随机推荐

  1. vue 组件评论 的同时进行刷新

    注意:1.最重要理解这里的父组件的刷新功能,通过v-on事件绑定委托给子组件执行,因为子组件的提交按钮和父组件的刷新评论的功能是分开的. 2.没有数据时直接点击提交按钮时会出bug,并且关闭后重新加载 ...

  2. vbox ubuntu虚拟机中加载笔记本内置摄像头

    使用C:\Program Files\Oracle\VirtualBox\VBoxManage.exe工具加载摄像头 1,显示可用摄像头 C:\Program Files\Oracle\Virtual ...

  3. oracle merge into 新增或者修改

    merge into sn_balance b1 using(select 'admin' as userid,1 as type1 from dual) b2 on(b1.userid=b2.use ...

  4. Python type hints 之 Optional,Union

    1,前言 type hint 在pep484加入,我个人觉得这种类似于类型约束的(机制)有点违背了python简单.简洁的初衷,在慢慢向c# java 这种强类型语言看齐的节奏. 不过好在不强制使用, ...

  5. jquery实用应用之jquery操作radio、checkbox、select

    本文收集一些jquery的实用技巧,非常实用的哦,其中对radio.checkbox.select选中与取值的方法. 获取一组radio被选中项的值var item = $('input[@name= ...

  6. HTML--CSS样式表--基本概念(超链接的状态)

    样式表的基本概念 一.样式表的分类 1.内联样式表 和HTML联合显示,控制精确,但是可重用性差,冗余较多. 例:<p style="font-size:14px;"> ...

  7. Vue 语法的一些小问题

    设置 sty行内样式 :style="{width:mapWidth,height:mapHeight}" This指向   axios 使用axios 的时候 ,在生命周期函数  ...

  8. Django入门3--Models

  9. js基础——基本包装类型

    1.基本包装类型String   var bz = new String("Li.Linda"); //引用类型(object)         bz.name= bz.subst ...

  10. iview+vue查询分页实现

    本文为实战坑记录 子组件(共用的搜索组件) <template> <div> <h2>{{pdbTitle}}</h2> <Form ref=&q ...