9-OAuth2
1. 创建授权服务器
1.1. 增加权限控制
POST:http://tacocloud:8080/api/ingredients
DELETE :http://tacocloud:8080 /api/ingredients/*
- 两种方式
- .antMatchers(HttpMethod.POST, “/api/ingredients”).hasAuthority(“ROLE_USER”)
- @PreAuthorize(“hasAuthority(‘ROLE_USER’)”)
1.2. 👍OAth2
之前讲了Spring Security的单体应用权限控制
- OAth2:分布式环境中微服务权限控制,需要把认证和授权集中在一个地方,不需要每个微服务单独做认证授权。
- 是一个与变成语言无关的规范
- restful api权限控制
1.3. 👍授仅码授权(authorization code grant)模式
1.3.1. 👍流程图
- Client application:客户端(第三方应用程序),消费API提供的资源
- Authorization server:授权服务器
- Resource server:提供API资源
- 授权服务器会用私钥给token签名,资源服务器用公钥验证token是否合法
- token不变时公钥也不变,只有第一次才需要向授权服务器索取公钥
1.3.2. 👍过程
其中使用授权码授权模式
- 用户使用第三方的应用程序,也就是客户端应用程序
- 客户端发现用户未登录,将用户重定向到授权服务器
- 授权服务器会维护合法的重定向地址,用于校验
- 授权服务器向用户索取用户名密码
- 用户名密码匹配,则授权服务器请求用户授权
- 授权服务器给客户端程序返回code,重定向回到应用程序
- 这里的code是和重定向URI一起返回给浏览器的,所以不安全
- 授权服务器返回的是重定向url+code
- 客户端应用程序用code向授权服务器索取token
- 用code交换token,可能包含访问令牌(access token)和更新令牌(refresh token)
- token不过浏览器,在应用程序服务端和授权服务器之间处理
- 客户端在请求头带上token调用资源服务器的API
- 资源服务器验证token,返回结果
- 第一次,资源服务器向授权服务器索取公钥,验证Token合法性
- Token过期时才会重新索取公钥
- 客户端程序把结果返回给用户
密码没有在浏览器来回传送,但是如果没有密码即使拿到code也没用
用code向授权服务器换取token才需要密码
1.4. 其他授权模式
- 隐式授权(implicit grant):直接返回访问令牌Token,而不是授仅码
- 用户凭证(或密码)授权(user credentials (password) grant):用户凭证直接换取访问令牌,不经过浏览器登录
- 客户端凭证授权(client credentials grant):客户端交换自己的凭证以获取访问令牌
1.5. 开发授权服务器
1.5.1. 授权服务器config
- 注册第三方应用程序(客户端)
- 指定资源服务器地址
- jwkSource
1.5.2. JWK
JSON web key,RSA密钥对(公䄴、私䄴),用于对令牌签名,令牌会用私钥签名,资源服务器会通过从授权 服务器获取到的公钥验证请求中收到的令牌是否有效
运行授权服务器
1.5.3. 运行授权服务器
- 获得授权码(浏览器访问):http://authserver:9000/oauth2/authorize?response_type=code&client_id=taco-admin-client&scope=writeIngredients+deleteIngredients&redirect_uri=http://clientadmin:9090/login/oauth2
- 获得token(postman访问) POST : http://authserver:9000/oauth2/token
- 刷新token(postman访问): http://authserver:9000/oauth2/token
2. 创建资源服务器
2.1. 步骤
添加依赖
在过滤器中针对被保护的API添加权限控制
- 使用
SCOPE_
前缀 - 开启API调用前的过滤器
- 使用
指定授权服务器的地址
- 为了获取公钥
使用SCOPE_
前缀:
1 | .antMatchers(HttpMethod.POST, "/api/ingredients").hasAuthority("SCOPE_writeIngredients") |
开启API调用前的过滤器:
1 | and() |
2.2. 配置资源服务器从何处获取公钥
jwt属性配置:
1 | spring: |
2.3. 从POSTMAN访问被保护资源
- 带着token(Authorization属性)访问POST:http://tacocloud:8080/api/ingredients
- 带着token(Authorization属性)访问DELETE:http://tacocloud:8080/api/ingredients/ *
3. 开发客户端
- 标题: 9-OAuth2
- 作者: Charlie
- 创建于 : 2023-11-13 18:11:00
- 更新于 : 2024-07-05 12:55:04
- 链接: https://chillcharlie357.github.io/posts/a0bd262e/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论