似乎有很多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的路径似乎打破了这一点。
答案 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服务器以使其保持一致。