手把手教你搭建Oauth2授权服务(上)
用户认证授权是绝大多数系统中都会涉及到的业务需求,除了常规的账号密码授权、手机验证码授权外,基于第三方的Oauth2授权也是很常用的授权方式,接下来就系统地给大家讲解一下Oauth2的授权服务。本篇文章我们先来学习一下Oauth2的概念及授权模式。
Oauth2协议简介
1.简介
OAuth2是一个对外开放的第三方授权协议,允许用户不提供第三方应用的账号信息的前提下以授权的方式获得第三方应用资源的访问令牌,从而能够访问第三方资源。
2.相关概念
在Oauth2授权服务中,我们首先要了解几个技术名词:
Client :第三方应用客户端
Resource Owner:资源所有者(用户)
Authorizetion Server :授权服务器
Resource Server :资源服务器
3.授权模式
Oauth2提供了四种授权模式分别为、客户端模式、密码模式、授权码模式和简易模式,这四种方式说白了就是4种获取访问令牌的方式,接下来我们详细介绍每种模式的执行流程。
客户端模式
执行流程:
资源服务客户端向授权服务发送请求,并携带保留在授权服务的clientId和secret;
授权服务校验客户端身份是否合法,如果合法返回access token;
资源服务通过access token访问资源服务服务端(当然资源服务的服务端并不是必要的,可以不存在)。
说明:
这种模式适用于只有客户端没有服务端的场景,比如问卷调查等。这种模式不安全会导致客户端账号向用户泄漏,要求客户端与授权服务的完全互信。
密码模式
执行流程:
资源拥有者向资源服务客户端发送登录请求;
响应登录界面(这个登录界面由第三方应用提供);
资源拥有者填写账户信息(注意:由于界面是第三方应用提供的,并不是授权服务提供的,所以这里存在泄漏账户风险);
资源拥有者向授权服务发送登录请求,授权服务校验用户信息;
如果用户信息合法那么响应access token;
资源服务客户端携带access token 访问资源服务服务端。
说明:
这种模式由于存在账号泄漏的风险,所以只能适用于授权服务与第三方应用完全互信的场景,例如公司内部系统。
授权码模式
授权码模式是四种模式中最安全的,也是流程最复杂,交互次数最多的一种模式。具体流程如下:
资源拥有者请求登录界面;
资源拥有者点击授权登录,例如QQ登录(这一步直接携带clientId请求授权服务端点);
授权服务响应qq登录授权登录界面(注意这个界面是授权服务提供的,所以不存在账号泄漏);
用户同意授权;
授权服务响应授权码(授权码具备一次性特性);
资源服务客户端获取授权码,再次向授权服务发起请求,请求获取access token;
授权服务校验授权码,并响应access token;
资源服务客户端获取access token 通过access token访问资源服务服务端。
说明:
这种模式由于不泄露用户账户信息,所以非常安全,适用于授权服务与第三方应用完全不互信场景。
简易模式
最后,我们再来看一下Oauth2的第四种授权模式,如下图所示:
执行流程:
资源拥有者请求登录界面;
资源拥有者点击授权登录,例如QQ登录(这一步直接携带clientId请求授权服务端点);
授权服务响应qq登录授权登录界面(注意这个界面是授权服务提供的,所以不存在账号泄漏);
用户同意授权;
授权服务响应access token;
资源服务客户端通过access token访问资源服务服务端。
说明:
简易模式相当于授权服务的简化版,省去了校验授权码的过程。由于不存在泄漏用户账号,所以适用于授权服务与第三方应用不互信的场景。
小结
本篇主要讲解了Oauth2授权服务的四种授权方式,其中授权码模式是广泛应用的一种模式,因为授权模式比较安全。授权码模式既可以对内系统授权也可以开放对外授权。QQ、微信、支付宝对外授权基本采用的是Oauth2授权模式中的授权码模式。
相关推荐HOT
更多>>如何添加Java环境变量?
要添加Java环境变量,可以按照以下步骤:并安装Java开发工具包(JDK)、找到Java安装路径、设置JAVA_HOME环境变量、添加Java可执行文件路径到PATH...详情>>
2023-05-04 11:00:56从零开始学Java之String字符串的编码
对很多小白来说,可能不明白什么是字符编码,也不知道为什么要有字符编码,所以先来给大家简要地介绍一下字符编码。详情>>
2023-05-04 10:21:02新手速来!几步带你掌握MyBatis Plus
Mybatis-Plus(简称MP)是一款Mybatis的增强工具,它是在Mybatis的基础上实现的简化开发工具。Mybatis-Plus给我们提供了开箱即用的CRUD操作、自动...详情>>
2023-04-28 10:57:09学习java需要什么基础?基础知识有哪些?
网络编程:了解基本的网络编程概念和协议,熟悉 Java 网络编程 API。建议在学习 Java 之前,先学习一些基础的编程语言,如 C 或 Python 等,这...详情>>
2023-04-28 10:41:14