Spring Authorization Server常见问题解答(FAQ)

文章导航

Spring Authorization Server入门 (一) 初识SpringAuthorizationServer和OAuth2.1协议
Spring Authorization Server入门 (二) springboot整合Spring Authorization Server
Spring Authorization Server入门 (三) 集成流程说明、细节补充和各种方式获取token测试
Spring Authorization Server入门 (四) 自定义设备码授权
Spring Authorization Server入门 (五) 自定义异常响应配置
Spring Authorization Server入门 (六) 自定义JWT中携带的claims与资源服务jwt解析器
Spring Authorization Server入门 (七) 登录添加图形验证码
Spring Authorization Server入门 (八) Spring Boot引入Security OAuth2 Client对接认证服务
Spring Authorization Server入门 (九) Spring Boot引入Resource Server对接认证服务
Spring Authorization Server入门 (十) 添加短信验证码方式登录
Spring Authorization Server入门 (十一) 自定义grant_type(短信认证登录)获取token
Spring Authorization Server入门 (十二) 实现授权码模式使用前后端分离的登录页面
Spring Authorization Server入门 (十三) 实现联合身份认证,集成Github与Gitee的OAuth登录
Spring Authorization Server入门 (十四) 联合身份认证添加微信登录
Spring Authorization Server入门 (十五) 分离授权确认与设备码校验页面
Spring Authorization Server入门 (十六) Spring Cloud Gateway对接认证服务

常见问题解答

1. 访问授权申请(/oauth2/authorize)接口跳转到默认登录页面,登录成功后响应错误码999

错误示例

{"timestamp":"2023-06-24 01:08:42","status":999,"error":"None"}

可能造成该问题的原因:

登录页面的某些静态资源被拦截了,在资源服务器中放行登录页面的所有静态资源

2. 访问授权申请(/oauth2/authorize)接口跳转到默认登录页面,登录成功后跳转回来时授权申请(/oauth2/authorize)接口响应400错误

检查数据库中是否存在授权申请使用的客户端信息,因为最终客户端信息是在数据库中存储着的。

3. 访问授权申请(/oauth2/authorize)接口跳转到默认登录页面,登录成功后跳转回来时授权申请(/oauth2/authorize)接口响应404错误

在添加认证服务配置与资源服务配置时两个过滤器链不要添加Order注解,以防认证服务配置被覆盖
如果有网关代理,记得认证服务配置中的签发地址(issue)中需要添加网关的代理路径

4. 在PKCE流程中通过token(/oauth2/token)接口获取token时,响应 invalid_grant

错误示例

{"error":"invalid_grant"}

可能造成该问题的原因

  1. 授权码错误
  2. 客户端id错误
  3. 回调地址错误(跟请求/oauth2/authorize时携带的不一致)
  4. 授权码过期
  5. 生成code_challenge的算法有问题

5. 在OAuth2流程中通过token(/oauth2/token)接口获取token时,响应 invalid_client

错误示例

{"error":"invalid_client"}

可能造成该问题的原因

  1. 客户端id错误

6. client 授权登录后 如何退出呢?

Spring Security 提供了退出的端点:/logout

7. 直接配置 @PreAuthorize注解不生效

检查是否添加以下两个注解

@EnableWebSecurity
@EnableMethodSecurity(jsr250Enabled = true, securedEnabled = true)

详见本系列的第九篇文章: Spring Authorization Server入门 (九) Spring Boot引入Resource Server对接认证服务

8. 客户端对接认证服务时出现[authorization_request_not_found]异常

认证服务器和客户端在同一个机器上时不能使用同一个ip,例如127.0.0.1,在存储cookie时不会区分端口的,比如127.0.0.1:8000和127.0.0.1:8080这两个,他们的cookie是同一个的,后者会覆盖前者;如果配置认证服务的地址是127.0.0.1:8080然后通过127.0.0.1:8000去访问客户端则会在登录后出现[authorization_request_not_found]异常,详见spring-security issues 5946

如果使用的是域名,可以解析两个子域名,一个解析到认证服务,一个解析到客户端服务

9. 如果不用这个web页面登录,有个接口,然后用安卓界面登录呢,应该用什么处理方式?

移动app和pc的app用的比较多的是PKCE模式,如果不想跳转到web登录页面就用自定义grant_type的方式添加一种认证并获取token的grant,比如系列文章中的自定义grant_type,那种是访问接口就直接响应access token了

10. oidc中的idToken到底有什么用?一路看过来也没看到有用这个token的地方

idToken中包含了用户信息,解析后可以直接获取用户信息,不用再请求服务器了

11. 使用自定义的UserDetailsService登录时出现序列化问题

异常堆栈描述

java.lang.IllegalArgumentException: The class with com.example.entity.Oauth2BasicUser and name of com.example.entity.Oauth2BasicUser is not in the allowlist. If you believe this class is safe to deserialize, please provide an explicit mapping using Jackson annotations or by providing a Mixin. If the serialization is only done by a trusted source, you can also enable default typing. See github.com for details

解决方案
实体类添加两个注解:@JsonSerialize与@JsonIgnoreProperties(ignoreUnknown = true)

@JsonSerialize: 添加JsonMixin
@JsonIgnoreProperties(ignoreUnknown = true): 序列化时忽略未知字段

12. 按照教程搭建起来,结果登录时一直提示用户名密码不对

可能是注入了一个UserDetailsService,账号密码跟文中不同,但是使用的账号密码却是文章的账号密码

13. 为什么客户端的认证信息要在请求头中添加Authorization这个请求头,header的Authorization 参数值为Basic+空格+base64(clientId:clientSecret)

这是oauth2协议定的标准,客户端的认证方式设置为BasicAuth时认证信息是在header中是这么个格式,以base64编码后加上前缀放入header中,详见本系列的第一章:Spring Authorization Server入门 (一) 初识SpringAuthorizationServer和OAuth2.1协议,里边介绍了客户端的各种认证方式

14. 要怎样继承改写DaoAuthenticationProvider,主要是继承了这个类,项目启动了发现并没有进入自己继承的这个DaoAuthenticationProvider的类操作。是啥问题

自己实现的没加@Component注解吗?如果加了那可能是在其它地方有provider实现被注入ioc中了;Security在初始化时会有个校验,好像是如果ioc中有多个DaoAuthenticationProvider的实例就只初始化默认的DaoAuthenticationProvider而不初始化子类,但是如果只有一个的话就会用ioc中的,所以不能多个实现都注入ioc

15. 使用Oracle数据库在授权申请时会抛出异常堆栈

框架问题,使用Oracle时确实会出现这种问题,如果需要解决可能需要重写AuthorizationService,详见issues 428

文章会记录可能遇到的问题,并给出一个解决方案,目前框架异常提示信息不完善,所以出现问题后很难排查,这里给出一些解决方案,让大家少走一些弯路;本篇文章持续更新中,欢迎各位读者指正、补充和完善,谢谢大家

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/80913.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[python 刷题] 242 Valid Anagram

[python 刷题] 242 Valid Anagram 题目: Given two strings s and t, return true if t is an anagram of s, and false otherwise. An Anagram is a word or phrase formed by rearranging the letters of a different word or phrase, typically using all the o…

基于springboot+vue的药店管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

HTML+CSS画一个卡通中秋月饼

HTMLCSS画一个卡通中秋月饼🥮🥮🥮 中秋活动水个文章 整个divcss实现个月饼,给前端初学者一个练手的demo 效果图 思路 HTMl 先来个轮廓画脸上的东西:眼睛、眉毛、腮红、嘴巴眼睛丰富下瞳孔画20个花瓣 CSS 轮廓是要外…

css中BFC外边距塌陷解决办法

什么是BFC 块级格式化上下文&#xff0c;独立的渲染区域&#xff0c;与外部毫不相干&#xff0c;上下两个元素都设置了外边距&#xff0c;结果会出现重叠的部分合并 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /&…

[EI复现】基于主从博弈的新型城镇配电系统产消者竞价策略(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

OpenHarmony 唤醒花屏问题

平台RK3568 基线 3.2 beta 在移植Harmonys的时候发现一个问题&#xff0c;就是开机正常显示&#xff0c;uboot和kernel正常&#xff0c;开机后灭屏&#xff0c;等待系统进入Deep &#xff0c;然后按power按键唤醒设备。此时出现花屏或者不显示问题 多次测试发现&#xff0c;如…

【网络】计算机网络基础

Linux网络 对网络的理解 在网络传输中存在的问题&#xff1a; 找到我们所需要传输的主机解决远距离数据传输丢失的问题怎么进行数据转发&#xff0c;路径选择的问题 有问题&#xff0c;就有解决方案&#xff1b; 我们把相同性质的问题放在一起&#xff0c;做出解决方案 解…

【系统架构】什么是集群?为什么要使用集群架构?

什么是集群&#xff1f;为什么要使用集群架构&#xff1f; 1.什么是集群&#xff1f;2.为什么要使用集群&#xff1f;2.1 高性能2.2 价格有效性2.3 可伸缩性2.4 高可用性2.5 透明性2.6 可管理性2.7 可编程性 3.集群的常见分类3.1 负载均衡集群3.2 高可用性集群3.3 高性能计算集…

LeetCode 2596. 检查骑士巡视方案

【LetMeFly】2596.检查骑士巡视方案 力扣题目链接&#xff1a;https://leetcode.cn/problems/check-knight-tour-configuration/ 骑士在一张 n x n 的棋盘上巡视。在有效的巡视方案中&#xff0c;骑士会从棋盘的 左上角 出发&#xff0c;并且访问棋盘上的每个格子 恰好一次 。…

输入学生成绩,函数返回最大元素的数组下标,求最高分学生成绩(输入负数表示输入结束)

scanfscore()函数用于输入学生的成绩 int scanfscore(int score[N])//输入学生的成绩 {int i -1;do {i;printf("输入学生成绩:");scanf("%d", &score[i]);} while (score[i] > 0);return i; } findmax()用于寻找最大值 int findmax(int score[N…

c语言练习59:深入理解char类型的取值范围

深入理解char类型的取值范围 例如&#xff1a; #include <stdio.h> int main() {char a[1000];int i;for(i0; i<1000; i){a[i] -1-i;}printf("%d",strlen(a));return 0; }结果为255 ab以%d的形式打印结果为&#xff1a;300 而c由于unsigned char的取值范…

gRPC之Protobuf语法

1、Protobuf语法 gRPC推荐使用proto3&#xff0c;这里只介绍常用语法&#xff0c;更多高级使用方法请参考官方文档&#xff1a; https://developers.google.com/protocol-buffers/doc 1.1 Message定义 一个message类型定义描述了一个请求或响应的消息格式&#xff0c;可以包…

DC系列靶机5通关教程

信息收集 主机扫描 sudo arp-scan -l端口扫描 nmap -p- -A 192.168.16.172漏洞发现 浏览器访问靶机IP 在Contact找到类似提交数据的地方 点击submit&#xff0c;数字发生变化。不断刷新的话&#xff0c;数字依然会发生变化 使用bp抓包发送重发器查看数据包 再次点击发送查看…

k8s优雅停服

在应用程序的整个生命周期中&#xff0c;正在运行的 pod 会由于多种原因而终止。在某些情况下&#xff0c;Kubernetes 会因用户输入&#xff08;例如更新或删除 Deployment 时&#xff09;而终止 pod。在其他情况下&#xff0c;Kubernetes 需要释放给定节点上的资源时会终止 po…

浅谈C++|类的成员

一.类对象作为类成员 类可以作为另一个类的成员 代码&#xff1a; #include <iostream> using namespace std; class phone { public:string shouji;phone(string shouji1) :shouji(shouji1) {cout << "phone的构造函数调用" << endl;}~phone() …

Mac版本破解Typora,解决Mac安装软件的“已损坏,无法打开。 您应该将它移到废纸篓”问题

一、修改配置文件 首先去官网选择mac版本下载安装 typora下载 然后打开typora包内容找到 /Applications/Typora.app/Contents/Resources/TypeMark/ 编辑器打开上面文件夹&#xff0c;这里我拉到vscode 找到page-dist/static/js/Licen..如下图 输入 hasActivated"…

周易算卦流程c++实现

代码 #include<iostream> using namespace std; #include<vector> #include<cstdlib> #include<ctime> #include<Windows.h>int huaYiXiangLiang(int all, int& left) {Sleep(3000);srand(time(0));left rand() % all 1;while (true) {if…

实时语音通讯技术:多人通话和语音识别

实时语音通讯技术是一种基于网络传输的语音通讯技术&#xff0c;可以实现语音通话、语音聊天、语音会议等功能。随着互联网的发展&#xff0c;实时语音通讯技术越来越受到人们的关注和应用。本文将重点介绍实时语音通讯技术中的多人通话和语音识别两个方面。 多人通话 多人通…

Dell 服务器远程安装操作系统

登录Dell服务器管理页面 1、网络连接服务器的idrac的管理口 2、确保本地电脑与服务器的管理口可以正常通信。通过浏览器访问服务器idrac口的ip地址。建议使用IE浏览器。 默认IP地址: 192.168.0.120 子网掩码: 255.255.255.0 默认网关: 192.168.0.1 默认用户名: …

LeetCode算法心得——和可被 K 整除的子数组(前缀和+HashMap)

大家好&#xff0c;我是晴天学长&#xff0c;同余定理的应用&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。 1) .和可被 K 整除的子数组 题目描述 给定一个整数数组 A&#xff0c;返回其中元素之和可被 K 整除的&#xff08;连续、非空&#xff0…