2015-10-07 120 views
3

我在基于Spring的OAuth2提供程序的授权端点方面遇到了一些麻烦。我需要来自客户的更多信息,而不是现在可能的信息。这是我想达到什么:如何扩展OAuth2授权端点的参数?

custom parameter

我需要自定义参数在认证过程以后。有没有简单的方法来扩展我的自定义默认参数或我需要自己实现某个类吗?

对当前Spring代码中的认证端点如何工作做了一些研究。我发现授权端点使用method named authorize,它接受所有正在设置的参数,然后转换成授权请求。在进一步研究AuthorizationRequest类时,我发现它包含一个在整个授权过程中被填充的map with extensions。但它似乎并没有充满我的自定义参数(如上所示)。这实际上只是看代码,所以我可能是错的。

用我的自定义实现来扩展AuthorizationEndpoint是否是一个好主意,还是有更好更干净的方法来实现这一点?

更新#1(2015年7月10日)

,我想使用自定义参数的地方是在我自己执行的AuthenticationProvider的。我需要在这个课程的authenticate method内提供信息。

更新#2(2015年7月10日)

看来,AuthorizationProvider获取AuthorizationEndpoint之前调用。这意味着自定义参数是在我需要它的类之后获得的(所以这太迟了)。

enter image description here

也许我可以由Spring安全类的任何延伸部或在通过JavaScript HTML取得它得到推荐网址。这是一个好主意还是应该使用另一种方法?

+0

'AuthenticationProvider'在'AuthorizationEndpoint'之前运行,所以我认为你需要另一种方法来做。 –

+0

哦,那可能是问题。你能告诉我在哪里可以找到关于认证流程如何工作的一个很好的解释,或者我只需要在Spring自己的文档中阅读它? 另外我做了一些调试,并说出你的意思。 –

+0

我设法解决了这个问题(请参阅下面的答案)。无论如何感谢您的帮助 –

回答

1

所以我设法通过在Google上搜索更多来自己解决问题。 你需要做的是与HttpSessionRequestCache对话以获取推荐URL。这是我如何解决它在我自己的实施AuthenticationProvider的

@Component 
public class CustomProvider implements AuthenticationProvider { 

    @Autowired 
    private HttpServletRequest httpRequest; 

    @Autowired 
    private HttpServletResponse httpResponse; 

    @Override 
    public Authentication authenticate(Authentication authentication) throws AuthenticationException { 

    SavedRequest savedRequest = new HttpSessionRequestCache().getRequest(httpRequest, httpResponse); 
    logger.info("Referral URL: " + savedRequest.getRedirectUrl()); 
    logger.info("Parameters: " + savedRequest.getParameterMap().keySet().toString()); 

    } 

} 

这将打印出这是前往春天的安全的登录页面之前调用请求的URL。第二个日志方法打印出在这个URL中找到的参数。 This question and answer帮助我为我的问题创建解决方案。