授权服务器与资源服务器分离
密码模式个人理解

认证(授权)服务器(Authorization Server):用于认证用户,如果客户端认证通过,则发放给其访问资源服务器的令牌
资源服务器(Resource Server):拥有受保护资源,如果请求包含正确的访问令牌,则可以访问资源,可以是提供管理后台、客户端 API 的服务
客户端(Client):可以是浏览器、客户端,也可以是内部服务
资源拥有者(Resource Owner):最终用户,他有访问资源的账号与密码,可以简单把资源拥有者理解成人,他在使用客户端访问资源
(A)用户打开客户端以后,客户端要求用户给予授权
(B)用户同意给予客户端授权
(C)客户端使用上一步获得的授权,向认证服务器申请令牌
(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌
(E)客户端使用令牌,向资源服务器申请获取资源
(F)资源服务器确认令牌无误,返回资源信息
上述步骤中,(B)是关键,即用户怎样才能给于客户端授权,oauth2有四种授权方式
- 授权码模式(authorization code)
- 简化模式(implicit)
- 密码模式(resource owner password credentials)
- 客户端模式(client credentials)
密码模式
用户向客户端提供自己的用户名和密码,客户端使用这些信息,向"服务商提供商"索要授权
(AB)用户向客户端提供用户名和密码(username、password)
(C)客户端(携带client_id、client_secret)将用户名和密码发给认证服务器,向后者请求令牌(access_token)
(D)认证服务器确认无误后,向客户端提供访问令牌
(E)客户端使用令牌,向资源服务器申请获取资源
(F)资源服务器确认令牌无误(与access_token包含的信息resource_id相匹配),返回资源信息
密码模式开发过程中的参数理解
access_token:令牌,包含有该客户端拥有的resource_ids和用户信息
client_id、client_secret:证明“该客户端是可信的”,确定你是什么客户端,可以访问什么资源服务器(可对应多个resource_id)等,没有无法获取token
username、password:具体的用户,确定你是谁,没有token无法携带用户信息
resource_id:资源服务器的标识
获取token: /oauth/token
- username:用户名
- password:用户密码
- grant_type:授权方式(password)
- client_id:客户端id
- client_secret:客户端密码
项目实践
授权服务器与资源服务器在同一个应用中的实现可见:【springboot】OAuth2+SpringSecurity+Mysql——密码模式
概述
项目包含nacos、gateway、sentinel、mybatisplus等,可按自己的需要去除无关的依赖和配置。其中nacos持久化至数据库(详细)、sentinel持久化至nacos(详细)
- **授权服务器应用(nacos-authserver)**功能:认证授权(
Authorization Server)、用户管理(相当于Resource Server)。
其中资源服务器
Resource Server的用户管理功能也可以单独分离出去至另一个单独的应用。
- **资源服务器应用(nacos-producer)**功能:提供资源接口(相当于另一个
Resource Server)、自定义登录和刷新接口(相当于客户端client)
其中客户端
client的功能也可以分离出去直接在前端项目实现。
- 用户角色:ADMIN、ROLE(
t_role表) - 资源服务器id:auth_server、resource_test(
oauth_client_details表)
mysql建表详见https://blog.youkuaiyun.com/lorogy/article/details/113695194
授权服务器项目nacos-authserver
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>authserver</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>authserver</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR2</spring-cloud.version>
<spring-cloud-alibaba.version>2.1.4.RELEASE</spring-cloud-alibaba.version>
<druid.version>1.1.21</druid.version>
<mybatis-plus.version>3.2.0</mybatis-plus.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos注册-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>
<!--actuator监控、sentinel限流、sentinel规则持久化至nacos-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<!-- mybatisPlus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.2.0</version>
</dependency>
<!-- 模板引擎 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.1</version>
</dependency>
<!-- alibaba的druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<!-- security-oauth2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
<version>2.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-jwt</artifactId>
<version>1.0.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security.oauth.boot</groupId>
<artifactId>spring-security-oauth2-autoconfigure</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
<!--swagger相关依赖-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</exclusion>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
<version>2.9.2</version>
</dependency>
<!--swagger防止报错Illegal DefaultValue for parameter type integer-->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.5.21</versi

本文介绍了OAuth2中的密码模式,详细阐述了授权服务器和资源服务器的职责以及它们在项目中的实现。授权服务器用于认证用户并发放令牌,资源服务器则保护资源并验证令牌。项目实践中,`nacos-authserver`作为授权服务器,实现了认证授权和用户管理,而`nacos-producer`作为资源服务器,提供了自定义登录和刷新接口,并配置了资源访问权限。此外,还讨论了如何通过Feign进行远程调用。
最低0.47元/天 解锁文章
3279

被折叠的 条评论
为什么被折叠?



