白话OAuth2用户认证及鉴权标准流程

一、OAuth2需求场景
在说明OAuth2需求及使用场景之前,需要先介绍一下OAuth2授权流程中的各种角色:
- 资源拥有者(User) - 指应用的用户
- 认证服务器 (Authorization Server) - 提供登录认证接口的服务器,比如:github等
- 资源服务器 (Resources Server) - 提供资源接口及服务的服务器,通常和认证服务器是同一个应用。
- 第三方客户端(Client) - 第三方应用,希望使用资源服务器提供的资源
- 服务提供商(Provider): 认证服务和资源服务归属于一个机构,该机构就是服务提供商
如果您对这些角色承担的作用还不清晰,也请先记住这些角色,继续往下看:
- 从资源拥有者,即用户的角度:举个例子,用户在B应用上,想使用自己在A应用中的保存的图片等资源。所以用户希望A应用开放接口给B应用,从而使用自己的这些图片资源。
- 从资源提供者的角度:我想让其他厂商的应用都使用我提供的资源,以增强用户对我的的粘性。越多的第三方应用依赖于我开放的接口,就表示会有越多的用户依赖于我。参考:某某平台开放扫码登录接口。
- 从第三方客户端,即资源申请者的角度:A应用是一个大厂开发的,它那里用户量大。A应用既然提供了基于OAuth2的接口,我可以获取一些基本用户数据信息,我干嘛不用呢。特别是扫码登录功能接口,给我自己的用户也带来了极大的方便,增强了我的应用的用户体验。
二、OAuth2授权的流程
OAuth2授权的流程的授权流程还是有点复杂的,用专业的术语很容易把大家弄糊涂,所以我希望给大家举一个生活中的例子,来帮助理解。
背景:我经营着一个考研自习室,向考研学生出租提供自习室资源。李小明是一位考研学生,自习室资源拥有者,我的用户。
- 资源拥有者 - 考研同学李小明
- 资源服务器 - 考研自习室及自习室内的资源(书包)
- 认证服务器 - 我(考研自习室管理员)
- 第三方客户端 - 考研同学李小明家长,第三方申请者
下面我们来结合这张图理解OAuth2授权的流程:

- 第一步(第三方申请资源):一个自称是考研学生家长的人给我打电话:“李小明是在你这里自习吧?他的书包放在自习室了,我要帮他取一下。”
- 第二步(验证资源拥有者): 我此时将信将疑,于是让家长等一下,同时拨通了李小明视频,李小明向我确认,的确有这回事。
- 第三步(认证通过发授权码):我一看这情况,就和小明家长说:李小明的自习室是“XXXX”地址,但是我不在那,你来我这取一下钥匙吧。
- 第四部(申请token令牌):小明家长来到我的地址,告诉我说:来取“XXXX”地址自习室的钥匙。哦,我一听就明白了。
- 第五步(颁发token令牌):于是我找出自习室的钥匙交给了小明的家长。
从上面的例子中我们看到,小明(用户)是明显受益方,他不用跑腿了。我作为自习室经营者(认证服务器),对外提供这种服务的目的是为了增加用户粘性,增强用户体验。小明的家长作为第三方,他获取了资源(自习室书包),是为了增强自己的儿子小明的用户体验。
以上的授权模式,就是OAuth2最典型的最常被使用的授权码模式。“XXXX”地址是授权码,钥匙是Access Token。用相对专业的说法再说明一次,大家可以对比学习:
- 第三方应用,向认证服务器请求授权。
- 用户告知认证服务器同意授权(通常是通过用户扫码或输入用户名密码的方式)
- 认证服务器向第三方应用告知授权码(code)
- 第三方应用使用授权码(code)申请Access Token
- 认证服务器验证授权码,颁发Access Token
这样第三方应用就可以使用Access Token,访问服务提供商的接口资源了。(小明家长用钥匙去自习室取书包)
三、OAuth2四种授权模式
- 授权码模式(authorization code)
- 简化模式(implicit)
- 密码模式(resource owner password credentials)
- 客户端模式(client credentials)
在第二节中为大家讲述的是授权码模式。密码模式也很简单:
- 用户将用户名密码交给第三方客户端应用
- 客户端将用户名密码发送给认证服务器,认证服务器验证后颁发AccessToken
- 客户端请求资源接口携带AccessToken,服务端对AccessToken进行校验。
- 校验通过,才能获得接口正确的数据结果响应。
密码模式与授权码模式最大的区别在于:授权码模式申请授权码的过程是用户直接与认证服务器进行交互,然后授权结果由认证服务器告知第三方客户端,也就是不会向第三方客户端暴露服务提供商的用户密码信息。而密码模式,是用户将用户密码信息交给第三方,然后由第三方向服务提供商进行认证和资源请求。绝大多数的服务提供商都会选择使用授权码模式,避免自己的用户密码暴漏给第三方。所以密码模式只适用于服务提供商对第三方厂商高度信任的情况下才能使用。
其他两种模式的应用很少,所以不做过多的介绍。想深入了解的,自行学习!
期待您的关注
- 向您推荐博主的系列文档:《手摸手教您学习SpringBoot系列-16章97节》
- 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。
白话OAuth2用户认证及鉴权标准流程的更多相关文章
- spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法
spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法 前言 本篇接着<spring boot / cloud ...
- 使用SpringSecurity Oauth2.0实现自定义鉴权中心
Oauth2.0是什么不在赘述,本文主要介绍如何使用SpringSecurity Oauth2.0实现自定义的用户校验 1.鉴权中心服务 首先,列举一下我们需要用到的依赖,本文采用的是数据库保存用户信 ...
- Spring Cloud Gateway + Jwt + Oauth2 实现网关的鉴权操作
Spring Cloud Gateway + Jwt + Oauth2 实现网关的鉴权操作 一.背景 二.需求 三.前置条件 四.项目结构 五.网关层代码的编写 1.引入jar包 2.自定义授权管理器 ...
- Tomcat 容器的安全认证和鉴权
大量的 Web 应用都有安全相关的需求,正因如此,Servlet 规范建议容器要有满足这些需求的机制和基础设施,所以容器要对以下安全特性予以支持: 身份验证:验证授权用户的用户名和密码 资源访问控制: ...
- shiro,基于springboot,基于前后端分离,从登录认证到鉴权,从入门到放弃
这个demo是基于springboot项目的. 名词介绍: ShiroShiro 主要分为 安全认证 和 接口授权 两个部分,其中的核心组件为 Subject. SecurityManager. Re ...
- 深入理解k8s中的访问控制(认证、鉴权、审计)流程
Kubernetes自身并没有用户管理能力,无法像操作Pod一样,通过API的方式创建/删除一个用户实例,也无法在etcd中找到用户对应的存储对象. 在Kubernetes的访问控制流程中,用户模型是 ...
- .NET 统一用户管理 -- 统一鉴权
统一鉴权 目的 为什么要统一鉴权了,每一个业务系统几乎都离不开,用户,角色,权限 这个 3个基础功能,为了避免各个系统各自去开发一套权限管理等基础功能,也同时轻松管理每个用户的全部权限. 怎么做 ...
- web系统认证与鉴权中的一些问题
认证鉴权系统的初心: 空间管理: 1.他是谁? 他登陆了没有? 2.他要做什么? 2.1 他要使用什么功能? 他是否有这个功能的权限. 2.2 他要使用这个功能做什么操作? 他是否有这个功能的这个操作 ...
- 【Python】Django用户、认证、鉴权模块使用
此文是总结Django官方网站里面的Document的文章 User authentication in Django http://www.djangoproject.com/documentati ...
随机推荐
- Django学习day2——Django安装与环境配置
安装 Django 文章中python版本为3.65 这里以windows7为例,在pip目录下运行pip install Django就能安装django最新版本(本文为django2.2版本) 也 ...
- Feign设置assessToken
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.an ...
- python爬虫-携程-eleven参数
携程-eleven分析 一.eleven的位置 通过对旁边栈的分析,它是在另一个js文件中调用的.那个js文件是一个自调用的函数,所以我们可以直接copy下来,用浏览器执行看看 执行运行是会报错的,u ...
- 转:java 看好的一些书
地址 : http://www.cnblogs.com/xrq730/p/4994545.html
- linux 打包 | autoconf 使用方法
面试题 嵌入式 0x10道题目 宏定义 #define 宏体 宏体 (大写) #define SECOND_OF_YEAR (365*24*3600)UL 可移植性 数据声明 一个存有10个指针的数组 ...
- 文件输入输出函数fgetc/fputc及fgets/fputs等文件指针位置的变化
文件打开后才可以对文件进行操作.也就是说,文件必须经历打开-操作-关闭的过程.如前所述,C语言对文件的操作都是通过调用标准I/O库函数来实现的.文件操作实际是指对文件的读写.文件的读操作就是从文件中读 ...
- html与css连接代码
demo01.html: <!DOCTYPE html><html> <head> <meta charset="utf-8"> ...
- Redis持久化的几种方式——深入解析RDB
Redis 的读写都是在内存中,所以它的性能较高,但在内存中的数据会随着服务器的重启而丢失,为了保证数据不丢失,我们需要将内存中的数据存储到磁盘,以便 Redis 重启时能够从磁盘中恢复原有的数据,而 ...
- lqb 基础练习 闰年判断
基础练习 闰年判断 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个年份,判断这一年是不是闰年. 当以下情况之一满足时,这一年是闰年: 1. 年份是4的倍数而不是100的倍 ...
- 理解Spark SQL(二)—— SQLContext和HiveContext
使用Spark SQL,除了使用之前介绍的方法,实际上还可以使用SQLContext或者HiveContext通过编程的方式实现.前者支持SQL语法解析器(SQL-92语法),后者支持SQL语法解析器 ...