代理服务器背后的Spring Security OAuth2

时间:2016-06-01 02:29:00

标签: spring-security-oauth2

似乎有很多Spring Security OAuth2的例子,但是大多数都在某些特定端口的localhost上运行。我能够使我的应用程序使用为AuthorizationServer和我的ResourceServer指定的端口。我需要采取的下一步是将此应用程序移到代理服务器后面,但应用程序停止运行。主要问题似乎与路径有关,但我很难解决如何完成将OAuth2 Spring移到代理服务器后面的任务的例子。我专注于覆盖WhitelabelApprovalEndpoint,但我不确定这是否是必需的。

我能够创建一个与WhiteLabelApprovalEndpoint几乎完全相同的控制器,但不知道如何调整它以适应代理的背后。

@Controller
@SessionAttributes("authorizationRequest")
public class ApprovalEndpoint {

    @RequestMapping("/oauth/confirm_access")
    ...
        private static String TEMPLATE = "<html><body><h1>OAuth Approval</h1>"
        + "<p>Do you authorize '${authorizationRequest.clientId}' to access your protected resources?</p>"
        + "<form id='confirmationForm' name='confirmationForm' action='authorize' method='post'><input name='user_oauth_approval' value='true' type='hidden'/>%csrf%%scopes%<label><input name='authorize' value='Authorize' type='submit'/></label></form>"
        + "%denial%</body></html>";
    ...

我对该类所做的唯一更改是更新表单操作字符串,通过替换

使路径相对
action='${path}/oauth/authorize'

action='authorize'

这允许POST转到正确的URL

http://localhost/proxy/stuff/javaPath/oauth/authorize

而不是

http://javaPath/oauth/authorize

后者在通过Apache(前端代理)提交时不会映射。但似乎这会在Java应用程序中产生其他问题,因为这会导致错误

error="invalid_request", error_description="Cannot approve uninitialized authorization request."

我发现当authorizationRequest为null时,AuthorizationEndpoint中会抛出此异常。这看起来应该由我的自定义类处理,正确设置了SessionAttributes,但更新我正在POST的路径似乎打破了这一点。

1 个答案:

答案 0 :(得分:0)

可能你已经解决了,但是发布答案可能对某人有帮助。

这是因为授权端点URL(域+路径(包括代理))应该是一致的。我的意思是它应该是'localhost'或你的代理路径,但它应该是一致的。

由于OAuth在内部使用会话,稍后从同一路径(当POST发生时)获取会话。因此,如果URL更改(POST)它将不会获得会话,那么它将抛出无法批准未初始化的授权请求。

就我而言,我使用的是授权终点:

https://mydomain/myapp/oauth/authorize?grant_type=authorization_code&client_id=clientid&redirect_uri=http://localhost:8181&response_type=code

但在我所拥有的属性中:

server: 
  session: 
   cookie: 
    path: /appProxy 
  context-path: /myapp
  port: 8081

成功完成授权后,尝试从/appProxy/myapp而不是/myapp获取会话,并导致无法批准未初始化的授权请求。

为了解决这个问题,我可以删除Session.cookie.path属性或在https://mydomain/appProxy/myapp/oauth/authorize上运行Oauth服务器以使其保持一致。