问题标签 [spring-oauth2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - TokenEndpoint:处理空指针异常
我尝试通过 curl 执行此命令从我的 oauth2 服务器请求代码
回应是
检查我的日志后,我收到了这个错误。
我的配置要点
java - Spring 如何将新的 _csrf 令牌添加到会话变量中?
当有人POST
在/oauth/authorize
Spring OAuth2 中执行操作时(此链接上 API 的源代码),CSRF 令牌会在服务器上更新。
可以使用哪些特定的代码语法:
1.) 在代码中访问新生成的 CSRF 令牌?
2.) 将新生成的 CSRF 令牌的副本分配给惰性会话变量?
3.) 随后检索新的会话变量以在不同的类中使用?
此要求的上下文是一个控制流,其中涉及通过多个过滤器和控制器的可变路由,而用户通过/oauth/authorize
端点进行多次传递。变量需要保存到会话范围,然后根据算法的需要从会话范围中检索并放回请求范围。
可能需要创建和使用上述会话变量的类类型示例包括:
1.) 任何具有@Controller annotation
,
2.) 任何自定义实现OncePerRequestFilter ,
3.) 任何自定义实现DefaultOAuth2RequestFactory
,
4.) 以及自定义过滤器链中使用的其他类型的类。
这可能是 Spring MVC 问题或 Spring Security 问题,或两者兼而有之,即使它涉及 Spring OAuth2 API,其源代码是由 Spring MVC 和 Spring Security 构建的。
spring - 如何在spring security中配置web security以允许某些url访问?
如何在 java 中配置 WebSecurity 以允许访问某些 url。我试过如下
在上面我想允许“/rest/ ” **对所有人(这意味着这个 url 不应该处于安全状态)并且“/admin /**”应该是安全的并且具有管理员权限。仅供参考,我也将它与 Spring oauth 一起使用,所以“/oauth/token”也应该可供所有人访问。
spring - 如何编码授权 request_uri
我需要为 Spring OAuth2 的实现构建一个自定义 request_uri。 应该使用什么特定代码来正确编码 request_uri 中的每个参数?
完整的未编码request_uri
如下,但会导致错误,指示未授予令牌:
如您所见,各个参数是:
用于构造上述 request_uri 的代码是:
更具体地说,这个 OP 询问应该使用什么语法来编码上面代码中的以下字符串值:newRequestUri
、clientId
、redirectUri
、respType
和state
.
官方 OAuth2 规范说你可以使用Content application/x-www-form-urlencoded
-Type 和UTF-8
编码,但也给出了这个例子:
类似地,Spring OAuth2 开发者指南只包含一个词的用法encode
。
java - 状态如何在 Spring OAuth2 中进行编码或加密?
Spring OAuth2 中与令牌state
相关的参数具体如何?_csrf
是我们期望state
的加密版本吗?_csrf
_csrf
此外,在将新值封装到state
Spring OAuth2 中的新参数之前,应该使用什么特定的 Java 语法来编码和加密它?
**上下文:**
客户端应用程序将用户的 Web 浏览器从客户端应用程序重定向到授权服务器的 authserver/login 页面。然后,在授权服务器应用程序中,使用 的自定义实现OncePerRequestFilter
将请求重定向/oauth/authorize?(list of params)
到其他身份验证步骤,最终重定向回新请求到/oauth/authorize?(list of params)
. 问题是令牌在额外的身份验证步骤期间发生了变化,_csrf
并且文档表明它_csrf
被用作state
参数。这意味着授权服务器可能需要更新该值以反映新值state
_csrf
。
**如何生成“状态”:**
问题在于,在客户端应用程序使用“OAuth2ClientAuthenticationProcessingFilter ”传输信息以供身份验证服务器在通过上述身份验证步骤对用户进行身份验证时使用 之前,客户端应用程序已经设置了“状态”的编码和加密值。一些研究表明,`state` 键是由客户端使用`DefaultStateKeyGenerator`生成的,而后者又使用`RandomValueStringGenrator`生成 6 个字符的状态值。
例如,在对 的原始请求中/oauth/authorize?(list of params)
,原始_csrf
值被编码为fupS1L
,如下面的 url 所示:
如果在重定向流期间_csrf
值更改为,则 state 参数中的值将不再有效,并且生成的令牌将无权允许访问受保护的资源。a69fd23a-a393-4b27-a685-a323fd31db9a
fupS1L
为了将新_csrf
值转换为类似于fupS1L
可以传递给功能state
参数的加密值,我使用什么特定语法?
state
另外,变量和_csrf
令牌之间有什么关系吗?使用的RandomValueStringGenerator
byDefaultStateKeyGenerator
似乎只是创建了一个随机的 6 个字符的字符串。我希望深入研究代码甚至编写代码的人给出权威的答案。我正在对代码进行深入审查,因此阅读RandomValueStringGenerator
源代码并说状态与csrf
令牌无关的偶然路人不会增加任何价值。然而,API 的作者会告诉我们它是如何工作的,从而为我们提供了很多帮助。
**注意春天:**
它不应该需要这么多的挖掘来找到这样一个简单事物的文档。
java - Spring CSRF 转发/禁用
这是我的示例应用程序。GATEWAY 是所有其他应用程序的入口点。基本上它是代理。它能够进行csrf保护。当我访问 url localhost:8080/login 首先为 GATEWAY 创建 csrf 令牌,然后将请求转发到后端服务 (UAA)。
问题是 UAA 生成它自己的令牌 (_csrf) 和一个由 GATEWAY 在标头中生成的令牌,因为 X-CSRF-TOKEN 完全不同。
那么如何避免这种冲突呢?是否有任何简单的解决方案可以在应用程序之间共享令牌?
谢谢
spring - 替换 AuthorizationRequest 后的 HttpSession null
下面给出了快速重现问题的完整代码和说明。
问题:
的自定义实现
HttpSession
将当前替换为已保存的. null
DefaultOAuth2RequestFactory
AuthorizationRequest
AuthorizationRequest
这会导致后续请求失败,因为/oauth/token
端点之前的 Spring Security 过滤器链中的CsrfFilter无法在/oauth/token
中找到 a与's进行比较。 session
Csrf token
null
session
request
Csrf token
错误期间的控制流程:
以下流程图说明了步骤 14和步骤 15以某种方式null
将HttpSession
. (或者可能与 a 不匹配JSESSIONID
。)第 14 步SYSO
开头的CustomOAuth2RequestFactory.java
A表明确实存在 a实际上包含正确的。然而,不知何故,当第 15 步触发客户端在url 上返回到端点 的调用时,它已经变成了。HttpSession
CsrfToken
HttpSession
null
localhost:8080/login
localhost:9999/oauth/token
HttpSessionSecurityContextRepository
在下面的调试日志中提到的每一行都添加了断点。(它位于 eclipse 项目的Maven Dependencies
文件夹中authserver
。)这些断点确认了在下面的流程图中发出HttpSession
最终null
请求的时间。/oauth/token
(流程图的左下角。) 这null
HttpSession
可能是由于自定义代码运行JSESSIONID
后保留在浏览器中的内容已过时。DefaultOAuth2RequestFactory
如何解决此问题,以便在流程图中的第 15 步结束后,在对端点HttpSession
的最终呼叫期间保持不变?/oauth/token
相关代码和日志:
的完整代码CustomOAuth2RequestFactory.java
可以通过单击此链接在文件共享站点上查看。 我们可以猜测这null
session
是由于 1.)JSESSIONID
中的代码没有在浏览器中更新CustomOAuth2RequestFactory
,或者 2.)HttpSession
实际被null
-ified。
步骤 15/oauth/token
之后调用的 Spring Boot 调试日志清楚地表明此时没有,可以读取如下: HttpSession
在您的计算机上重现问题:
按照以下简单步骤,您只需几分钟即可在任何计算机上重现问题:
2.) 通过键入以下内容解压缩应用程序:tar -zxvf oauth2.tar(4).gz
authserver
3.)通过导航到oauth2/authserver
然后键入来启动应用程序mvn spring-boot:run
。
resource
4.)通过导航到oauth2/resource
然后键入来启动应用程序mvn spring-boot:run
ui
5.)通过导航到oauth2/ui
然后键入来启动应用程序mvn spring-boot:run
6.) 打开网络浏览器并导航到http : // localhost : 8080
7.) 点击Login
然后输入Frodo
用户名和MyRing
密码,点击提交。
8.) 输入5309
,Pin Code
然后单击提交。 这将触发上面显示的错误。
Spring Boot 调试日志将显示 A LOT of ,其中给出了流程图中显示的每个步骤SYSO
的变量值,例如XSRF-TOKEN
和HttpSession
。这SYSO
有助于对调试日志进行分段,以便它们更易于解释。所有这些SYSO
都是由其他类调用的一个类完成的,因此您可以操纵SYSO
-generating 类来更改控制流中各处的报告。SYSO
生成类的名称是TestHTTP
,它的源代码可以在同一个demo
包中找到。
使用调试器:
1.) 选择正在运行authserver
应用程序的终端窗口并键入Ctrl-C
以停止authserver
应用程序。
2.) 将三个应用程序(authserver
、、resource
和)作为现有的 maven 项目ui
导入到 eclipse 中。
3.) 在authserver
应用程序的 eclipse Project Explorer 中,单击展开Maven Dependencies
文件夹,然后在其中向下滚动以单击展开Spring-Security-web...
jar,如下图橙色圆圈所示。然后滚动查找并展开org.springframework.security.web.context
包。然后双击打开HttpSessionSecurityContextRepository
下面屏幕截图中以蓝色突出显示的类。向此类中的每一行添加断点。您可能希望对SecurityContextPersistenceFilter
同一包中的类执行相同的操作。 这些断点将使您能够查看 的值,该值HttpSession
当前在控制流结束之前变为null
,但需要具有可以映射到的有效值XSRF-TOKEN
才能解析此 OP。
4.) 在应用程序的demo
包中,在CustomOAuth2RequestFactory.java
. 然后Debug As... Spring Boot App
启动调试器。
5.) 然后重复上面的步骤 6 到 8。您可能希望在每次新尝试之前清除浏览器的缓存。您可能希望打开浏览器开发工具的“网络”选项卡。
spring-security - SpringSecurity WithSecurityContext MockMvc OAuth2 总是未经授权
例如,我已按照以下链接尝试测试 OAuth2 @PreAuthorise(hasAnyRole('ADMIN', 'TEST') 但我无法通过任何测试,甚至无法通过身份验证。
当我尝试使用管理员(或任何角色)访问端点时,它永远不会正确验证。我是否遗漏了一些明显的东西,似乎我拥有示例中的所有内容。我还尝试了使用 OAuth 特定身份验证的 WithSecurityContext Factory 的另一种替代方案,但仍然没有运气。任何帮助,将不胜感激。
https://stackoverflow.com/a/31679649/2594130 和 http://docs.spring.io/spring-security/site/docs/4.0.x/reference/htmlsingle/#test
我正在测试的控制器
我的测试课
我的书签服务应用程序
我的 WithSecurityContextFactory
我的 WithSecurityContext 注解
根据@RobWinch 的回复
嗨@RobWinch我已经用无状态标志尝试过你的建议,这有助于部分答案。但是,在您对这个问题的回复 [Spring OAuth and Boot Integration Test] ( https://stackoverflow.com/a/31679649/2594130 ) 中,您提到
您不再需要担心是否在无状态模式下运行
为什么我仍然需要添加无状态 false,这是一个错误还是我们使用它的方式略有不同?
我需要做的另一件事是将 OAuth2Request 和 OAuth2Authentication 添加到 WithSecurityContextFactory,如下所示
spring - Spring oAuth2 中基于用户的权限/范围
在我当前的设置中,我有独立的 spring oAuth2 服务器、独立的资源服务器和带有反向代理的 angularJs 应用程序。
在身份验证服务器端,我注册了 2 个客户端(用于服务通信的 Web 应用程序和内部客户端)。我正确接收客户端范围和用户角色。
问题 1 我需要每个用户而不是客户端(网络应用程序、移动设备、...)的不同权限(例如范围)
我尝试提供自己的 ClientsDetailService,我将为每个用户构建 ClientDetails,但我收到的唯一内容是客户端 ID(“web-app”),我无法知道哪个用户已登录。
有没有办法注入用户上下文?
相关堆栈问题
问题 2如果我将所有可用权限放在 JWT 中并在资源服务器上执行“hasPermission(...)”逻辑,我可以以某种方式解决这个问题。基本上,客户端应用程序在 N 个范围内工作,服务器基于用户角色构建权限列表并创建 JWT。但...
- 当我删除用户权限时会发生什么?JWT 失效了吗?
- 这种情况下的 oAuth 工作流程是什么?(refresh_token 会获得更新的权限还是用户必须再次输入凭据?)
- 由于这似乎是不好的做法,有没有更好的解决方案?
问题3有没有一种标准的方式可以用spring oauth2 实现更细粒度的权限逻辑?(想想 100 多种具有方法级别安全性的不同权限)