OAuth 2.0 概念及授权流程梳理

 更新时间:2020年08月18日 10:06:06   作者:东北小狐狸  
这篇文章主要介绍了OAuth 2.0 概念及授权流程梳理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

OAuth2 的概念

OAuth是一个关于授权的开放网络标准,OAuth2是其2.0版本。

它规定了四种操作流程(授权模式)来确保安全

应用场景有第三方应用的接入、微服务鉴权互信、接入第三方平台、第一方密码登录等

Java王国中Spring Security也对OAuth2标准进行了实现。

OAuth2授权模式

OAuth2定义了四种授权模式(授权流程)来对资源的访问进行控制

  • 授权码模式(Authorization Code Grant)
  • 隐式授权模式(Implicit Grant)
  • 用户名密码模式(Resource Owner Password Credentials Grant)
  • 客户端模式(Client Credentials Grant)

无论哪个模式(流程)都拥有三个必要角色:客户端授权服务器资源服务器,有的还有用户(资源拥有者),下面简单介绍下授权流程

授权码模式(Authorization Code Grant)

授权码模式是OAuth2目前最安全最复杂的授权流程,先放一张图,稍做解释

如上图,我们可以看到此流程可大致分为三大部分

  • Client Side:用户+客户端与授权服务器的交互
  • Server Side:客户端与授权服务器之间的交互
  • Check Access Token:客户端与资源服务器之间的交互 + 资源服务器与授权服务器之间的交互

整体上来说,可以用一句话概括授权码模式授权流程

客户端换取授权码,客户端使用授权码换token,客户端使用token访问资源

接下来对这三部分进行一些说明 :

前提条件:

  • 第三方客户端需要提前与资源拥有方(同时也是授权所有方)协商客户端id(client_id),客户端密钥(client_secret)
  • 文中暂时未将scope、state等依赖具体框架的内容写进来,这里可以参考Spring Security OAuth2的实现

Client Side

客户端换取授权码

这个客户端可以是浏览器,

  • 客户端将client_id + client_secret + 授权模式标识(grant_type) + 回调地址(redirect_uri)拼成url访问授权服务器授权端点
  • 授权服务器返回登录界面,要求用户登录(此时用户提交的密码等直接发到授权服务器,进行校验)
  • 授权服务器返回授权审批界面,用户授权完成
  • 授权服务器返回授权码到回调地址

Server Side

客户端使用授权码换token

  • 客户端接收到授权码,并使用授权码 + client_id + client_secret访问授权服务器颁发token端点
  • 授权服务器校验通过,颁发token返回给客户端
  • 客户端保存token到存储器(推荐cookie)

Check Access Token

客户端使用token访问资源

  • 客户端在请求头中添加token,访问资源服务器
  • 资源服务器收到请求,先调用校验token的方法(可以是远程调用授权服务器校验端点,也可以直接访问授权存储器手动校对)
  • 资源服务器校验成功,返回资源

这里的说明省去了一些参数,如scope(请求token的作用域)、state(用于保证请求不被CSRF)、redirect_uri(授权服务器回调uri),先理解概念,实现的时候再去要求

隐式授权模式(Implicit Grant)

隐式授权模式大致可分为两部分:

  • Client Side:用户+客户端与授权服务器的交互
  • Check Access Token:客户端与资源服务器之间的交互 + 资源服务器与授权服务器之间的交互

用一句话概括隐式授权模式授权流程

客户端让用户登录授权服务器换token,客户端使用token访问资源

Client Side

客户端让用户登录授权服务器换token

  • 客户端(浏览器或单页应用)将client_id + 授权模式标识(grant_type)+ 回调地址(redirect_uri)拼成url访问授权服务器授权端点
  • 授权服务器跳转用户登录界面,用户登录
  • 用户授权
  • 授权服务器访问回调地址返回token给客户端

Check Access Token

客户端使用token访问资源

  • 客户端在请求头中添加token,访问资源服务器
  • 资源服务器收到请求,先调用校验token的方法(可以是远程调用授权服务器校验端点,也可以直接访问授权存储器手动校对)
  • 资源服务器校验成功,返回资源

密码模式(Resource Owner Password Credentials Grant)

密码模式大体上也分为两部分:

  • Client Side: 用户与客户端交互,客户端与授权服务器交互
  • Check Access Token:客户端与资源服务器之间的交互 + 资源服务器与授权服务器之间的交互

一句话概括用户名密码模式流程:

用户在客户端提交账号密码换token,客户端使用token访问资源

Client Side
用户在客户端提交账号密码换token

  • 客户端要求用户登录
  • 用户输入密码,客户端将表单中添加客户端的client_id + client_secret发送给授权服务器颁发token端点
  • 授权服务器校验用户名、用户密码、client_id、client_secret,均通过返回token到客户端
  • 客户端保存token

Check Access Token

客户端使用token访问资源

  • 客户端在请求头中添加token,访问资源服务器
  • 资源服务器收到请求,先调用校验token的方法(可以是远程调用授权服务器校验端点,也可以直接访问授权存储器手动校对)
  • 资源服务器校验成功,返回资源

客户端模式(Client Credentials Grant)

客户端模式大体上分为两部分:

  • Server Side: 客户端与授权服务器之间的交互
  • Check Access Token: 客户端与资源服务器,资源服务器与授权服务器之间的交互

一句话概括客户端模式授权流程:

客户端使用自己的标识换token,客户端使用token访问资源

Server Side

客户端使用自己的标识换token

  • 客户端使用client_id + client_secret + 授权模式标识访问授权服务器的颁发token端点
  • 授权服务器校验通过返回token给客户端
  • 客户端保存token

Check Access Token

客户端使用token访问资源

  • 客户端在请求头中添加token,访问资源服务器
  • 资源服务器收到请求,先调用校验token的方法(可以是远程调用授权服务器校验端点,也可以直接访问授权存储器手动校对)
  • 资源服务器校验成功,返回资源

OAuth2授权模式的选型

考虑到授权场景的多样性,可以参考以下两种选型方式

按授权需要的多端情况

按客户端类型与所有者

后记

学习OAuth2有一段时间了,把学到的知识分享出来,行文中难免有错误,如果发现还请留言指正,谢谢合作

参考文章与资料:

https://time.geekbang.org/course/intro/84 作者:杨波

https://blog.csdn.net/sinat_25295611/article/details/84980987 作者:Kayfen

How OAuth 2.0 works and how to choose the right flow 作者:Lorenzo Spyna

原文出处https://www.cnblogs.com/hellxz/p/oauth2_process.html

到此这篇关于OAuth 2.0 概念及授权流程梳理的文章就介绍到这了,更多相关OAuth2.0 授权流程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Webpack基础教程之名词解释

    Webpack基础教程之名词解释

    webpack 是一个现代JavaScript 应用程序的静态模块打包器,这次为大家简单介绍一下webpack及关于webpack的一些专属名词入口(entry),输出(output),loader,插件(plugins)
    2020-02-02
  • Unicode编码大揭秘

    Unicode编码大揭秘

    这篇文章主要介绍了Unicode编码大揭秘,本文介绍了编码的历史,Unicode的出现原因等,需要的朋友可以参考下
    2014-07-07
  • 详解使用内网穿透工具Ngrok代理本地服务

    详解使用内网穿透工具Ngrok代理本地服务

    本文主要介绍了使用内网穿透工具Ngrok代理本地服务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-03-03
  • DVWA下载、安装、使用(漏洞测试环境搭建)的详细教程

    DVWA下载、安装、使用(漏洞测试环境搭建)的详细教程

    这篇文章主要介绍了DVWA下载、安装、使用(漏洞测试环境搭建)的详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Atlassian系列产品及插件激活方法[JIRA8.19.0+]

    Atlassian系列产品及插件激活方法[JIRA8.19.0+]

    Atlassian家有很多产品,都真的非常好用。比如公司使用JIRA做项目管理,使用Confluence做文档、知识管理等(我个人用它来做笔记)。本文给大家分享Atlassian系列产品及插件激活方法[JIRA8.19.0+],感兴趣的朋友参考下吧
    2021-12-12
  • spark通过kafka-appender指定日志输出到kafka引发的死锁问题

    spark通过kafka-appender指定日志输出到kafka引发的死锁问题

    这篇文章主要介绍了spark通过kafka-appender指定日志输出到kafka引发的死锁,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 关于Interlij 无法使用中文输入法的解决方法(适用于Interlij全家桶 Linux环境)

    关于Interlij 无法使用中文输入法的解决方法(适用于Interlij全家桶 Linux环境)

    这篇文章主要介绍了关于Interlij 无法使用中文输入法的解决方法(适用于Interlij全家桶 Linux环境),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Caffe图像数据转换成可运行leveldb lmdb文件

    Caffe图像数据转换成可运行leveldb lmdb文件

    这篇文章主要为大家介绍了Caffe图像数据转换成可运行leveldb lmdb文件教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • SSL常用专业缩略语汇总

    SSL常用专业缩略语汇总

    这篇文章主要介绍了SSL常用专业缩略语汇总,需要的朋友可以参考下
    2017-09-09
  • 使用Spark进行实时流计算的方法

    使用Spark进行实时流计算的方法

    这篇文章主要介绍了用Spark进行实时流计算的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08

最新评论