OAuth2.0这个名词你是否在项目中时常听到呢?是否觉得好像懂,又好像不太懂呢?

最近一直想写篇关于OAuth2.0的东西,记录下我的学习与感悟,然各种理由的拖延,直到今日才静下心来写下这篇博客。当然,这里仅代表个人理解,如有纰漏之处,望园内大佬们不吝赐教~

好了,话不多说,干货顶上。


几个基本概念

认证(Authentication)和授权(Authorization)

在接触OAuth2.0时是不是经常听到认证和授权这两个词呢?刚接触时,一直以为这两个词是一个意思,只是大家说法的不同而已。然,在看完官方开发文档后才知道,这根本是两个东西,不能混为一谈。下面详细说说:

认证:主要用于验证身份。比如,我们进出火车站,身份证证明自己是张三而不是李四,这就是认证。

授权:主要用于判断是否拥有相应的权限。比如,我们进出火车站,火车票证明我们有乘坐列车的权限,这就是授权。

现在看看,是不是挺简单的概念,顿时清晰起来?

OAuth定义的四个角色

资源拥有者:受保护资源的拥有者,可以对他人授权,让其访问该资源。

资源服务器:托管受保护资源的服务器,只要认证和授权通过,便可响应该资源。

客户端:提出请求受保护资源的应用程序。

授权服务器:当认证和授权成功后,给客户端发布访问令牌(access token)。

访问令牌

访问令牌,其实就是可以访问受保护资源的一个凭证。一般而言,这是一串加密过的字符串,颁发给客户端,用于替换用户名和密码,避免每次请求都携带用户名密码,增加安全风险。

协议流程

上面这张图便是OAuth 2.0抽象的协议流程,描述了其定义的四个角色之间的交互关系。我将这个流程分为了前期准备和获取资源两个部分,详细如下:

前期准备(这是一次性操作,可通过界面申请,与资源拥有者的用户代理沟通等):

  • 客户端向资源拥有者申请受保护资源的访问权限;
  • 客户端得到拥有者的授权,表示客户端可以访问该受保护资源。

获取资源(Restful请求,每次访问资源都得经过该操作):

  • 客户端携带用户名、密码或clientId、secret等方式,向授权服务器发起认证和授权;
  • 授权通过,授权服务器向客户端返回访问令牌(access token);
  • 客户端携带访问令牌,向资源服务器访问受保护资源;
  • 资源服务器验证访问令牌的有效性之后,向客户端返回受保护资源。

授权

授权成功其实就是资源拥有者颁发的可以访问受保护资源的凭证。当然客户端直接拿着凭证是无法访问资源的,还需拿着这个凭证去授权服务器拿访问令牌,凭着令牌便可直接访问受保护资源。

OAuth 2.0官方给出的规范,授权的具体方式共有四种(可自定义):资源拥有者密码凭证,客户端凭证,授权码和隐式授权,;当然自定义机制也是支持的。

资源拥有者凭证授权

资源拥有者密码凭证的授权方式仅适用于资源拥有者和客户端高度信任的场景。

  • 资源拥有者提供客户端密码凭证(resourId: secret)
  • 客户端携带密码凭证直接去授权服务器获取访问令牌

客户端凭证授权

客户端携带自身凭证(clientId: secret)直接去授权服务器获取访问令牌

授权码授权

一次性操作(授权码只需要获取一次即可):

  • 客户端重定向URI和身份信息直接访问资源拥有者或者拥有者的用户代理(一般为前端)
  • 用户代理拿着客户端身份信息和重定向URI,重定向至访问授权服务器;
  • 授权服务器对客户端的信息进行认证和授权;
  • 认证和授权通过后,将授权码返回至用户代理;
  • 用户代理将授权码返回给客户端

获取资源:

  • 客户端拿着授权码和去授权服务器获取访问令牌;
  • 客户端携带访问令牌,向资源服务器访问受保护资源;
  • 资源服务器验证访问令牌的有效性之后,向客户端返回受保护资源。

优势:对客户端进行认证;访问令牌没有直接返回至客户端,所以没有经历第三方(用户代理),减少暴露令牌的可能。

隐式授权

隐士授权是个简化的授权流程,适用于前端页面由脚本语言(如Javascript)编写的场景,对于React,Angular等编写的前端,建议使用授权码的授权方式。

  • 客户端携带身份信息和重新向URI(一般为前端主界面地址)访问用户代理;
  • 用户代理将客户端身份信息和重定向URI发往授权服务器,并进行用户认证;
  • 认证授权通过后,将访问令牌拼进重定向URI,并将这个新的URI发往用户代理;
  • 用户代理直接重定向至新的URI,加载主界面(所需数据,可根据访问令牌去资源服务器获取);
  • 用户代理将访问令牌返回客户端。

注意:一般隐式授权,可以利用重定向URI进行客户端验证。


作者:吴家二少

博客地址:https://www.cnblogs.com/cloudman-open/

本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接

OAuth2.0的那点荒唐小秘密 -几个简单概念和原理的更多相关文章

  1. (十一) 整合spring cloud云架构 - SSO单点登录之OAuth2.0登录流程(2)

    上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名+密码实现OAuth2.0的 ...

  2. oauth2.0授权协议

    参考文章 一.OAuth是什么? OAuth的英文全称是Open Authorization,它是一种开放授权协议.OAuth目前共有2个版本,2007年12月的1.0版(之后有一个修正版1.0a)和 ...

  3. SpringBootSecurity学习(16)前后端分离版之 OAuth2.0 加密配置

    示例代码的改进 前面使用spring cloud security和spring cloud oauth2写了一个第三方授权的例子,例子非常的简单,主要目的是用来熟悉OAuth2.0 申请授权的整个流 ...

  4. Spring Cloud云架构 - SSO单点登录之OAuth2.0登录流程(2)

    上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名+密码实现OAuth2.0的 ...

  5. OAuth2.0分布式系统环境搭建

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 介绍 OAuth(开放授权)是一 ...

  6. OAuth2.0实战!使用JWT令牌认证!

    大家好,我是不才陈某~ 这是<Spring Security 进阶>的第3篇文章,往期文章如下: 实战!Spring Boot Security+JWT前后端分离架构登录认证! 妹子始终没 ...

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

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

  8. 分享一个单点登录、OAuth2.0授权系统源码(SimpleSSO)

    SimpleSSO 关于OAuth 2.0介绍: http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 系统效果: 登录界面: 首页: 应用界面: ...

  9. 【OAuth2.0】Spring Security OAuth2.0篇之初识

    不吐不快 因为项目需求开始接触OAuth2.0授权协议.断断续续接触了有两周左右的时间.不得不吐槽的,依然是自己的学习习惯问题,总是着急想了解一切,习惯性地钻牛角尖去理解小的细节,而不是从宏观上去掌握 ...

随机推荐

  1. 2019-9-20-SharpDx-的代替项目

    title author date CreateTime categories SharpDx 的代替项目 lindexi 2019-09-20 09:13:59 +0800 2019-09-20 0 ...

  2. Linux 内核 启动时间

    为见到 PCI 如何工作的, 我们从系统启动开始, 因为那是设备被配置的时候. 当一个 PCI 设备上电时, 硬件保持非激活. 换句话说, 设备只响应配置交易. 在上电时, 设备没有内存并且没有 I/ ...

  3. Vue CLI 介绍安装

    https://cli.vuejs.org/zh/guide/ 介绍 警告 这份文档是对应 @vue/cli 3.x 版本的.老版本的 vue-cli 文档请移步这里. Vue CLI 是一个基于 V ...

  4. Pycharm学生版安装教程(2019-12月更新)

    以下方法全部是官方渠道正版激活,可选择学生版(免费) 或企业版(付费) 我的机器学习教程「美团」算法工程师带你入门机器学习  以及 「三分钟系列」数据结构与算法  已经开始更新了,欢迎大家订阅~这篇专 ...

  5. 洛谷$P$3168 任务查询系统 $[CQOI2015]$ 主席树

    正解:主席树 解题报告: 传送门! 首先考虑如果是单点修改,那就是个线段树板子嘛$QwQ$ 然后现在是区间修改,对于区间修改,显然就考虑差分下,就变成单点修改辣$QwQ$ 同时单点查询前$k$小也就变 ...

  6. 动态规划之用最少的字符操作将字符串A转换为字符串B

    1.试用动态规划算法实现下列问题:设A和B是两个字符串.我们要用最少的字符操作,将字符串A转换为字符串B,这里所说的字符操作包括: (1)删除一个字符. (2)插入一个字符. (3)将一个字符改为另一 ...

  7. StatePattern(状态模式)-----Java/.Net

    在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式. 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context ...

  8. 在Mac/linux上查找(并终止)进程锁定特定端口的几种方法

    前言  无论是做网站还是做产品,经常使用到杀死某个进程的方法.制作脚本并熟悉运用是一个非常节省时间的方法. 基本命令  查找: [sudo] lsof -i :3000  杀戮 kill -9 方法一 ...

  9. 兄弟们,你们天天吊打面试官,面试官很难受啊。 metasploit免S客户端

    metasploit生成的exe文件很小,但是免杀效果不行, 找了很多资料, 只有生成c语言shellcode,然后c#重新编译, 这种免杀效果,挺让人满意的 首先需要生成客户端,客户端使用了ngro ...

  10. WIN10高清壁纸

    下面给大家分享我自己收集的WIN10的壁纸(大家可以存在在自己网盘里) 百度网盘下载 提取码:dsf5