【发布时间】:2015-07-15 11:58:54
【问题描述】:
我目前正在从事一个涉及 Spring Security 的项目(用于 OAuth2)。
我们正在使用 authorization_code 流程。
但是当客户端点击 AuthorizationEndpoint (/oauth/authorize) 我们得到一个“InsufficientAuthenticationException”。 这可能是由于一个外部系统也参与了这个流程,它为客户端执行重定向,将他发送到 /oauth/authorize 端点。
根据我通过查看调试日志文件和阅读源代码的理解,在 AuthorizationEndpoint.authorize 方法中使用的主体为 null(特别是第 138 行,我们使用的是 spring-security-oauth2-2.0.7 。发布)。
我了解 spring 的问题在这一点上(它不“知道”已经通过系统身份验证的用户)但我不明白 spring 使用哪些信息来识别用户(我想这将是我的中心问题)
我尝试使用正确的参数对 /oauth/authorize 执行 GET,并随请求发送包含不记名访问令牌的授权标头,但 spring 总是抛出 InsufficientAuthenticationException。我希望有人可以帮助我解决这个问题。
最好的问候 p.s.
【问题讨论】:
-
在默认实现中,身份验证信息存在于会话中。当您看到
InsufficientAuthenticationException时,这表明无法从会话中获取身份验证。这个User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();可以告诉您会话中是否存在有关用户身份验证的信息。 -
principal(身份验证)被注入到 /authorize 端点。
-
嘿,谢谢你的回答。到目前为止,我和你在一起,授权方法中使用的主体是由spring提供的。但不知何故,尽管用户在发送请求之前成功进行了身份验证,但 spring 无法从 sessionregistry 中获取用户的会话。这就是我卡住的地方,我不知道是什么将发送到 spring 的请求标识为来自特定用户。是在标头中发送的承载访问令牌吗?是 jsessionid cookie 吗?
-
通常应该是 jsessionId。 /authorize request 中的不记名访问令牌在做什么?
-
希望没什么,只是在这里抓住稻草;D你已经通过澄清这一点帮助了我,我明天看看并更新这篇文章。
标签: java spring exception oauth-2.0 spring-security-oauth2