为什么spring-social的ConnectController启动了OAuth 2" dance"用POST?

时间:2016-02-04 23:58:09

标签: java spring oauth oauth-2.0 spring-social

我尝试使用spring-social创建一个通过OAuth2连接到Fitbit的应用。 I've had some troubles with this但我想我已经搞清楚了。我注意到OAuth进程是通过对ConnectController进行POST来启动的。为什么用POST而不是GET完成?我想制作它以便我可以将链接放入聊天室,用户可以点击该聊天室来授权我的应用使用他们的Fitbit信息,这意味着我想通过GET启动它。有没有理由不这样做?如果我要对这种效果进行更改(通过继承ConnectController),我会遇到技术/安全问题吗?

1 个答案:

答案 0 :(得分:1)

有两个原因:

  1. 主要原因是GET请求应该执行既安全又幂等的操作。但是作为该请求的结果,您可能(在OAuth 1.0(a)的情况下)最终获得并可能存储请求令牌以及与提供者初始化OAuth舞蹈。就安全请求而言,这不被视为“安全”。此外,它可能是也可能不是幂等的,因为重复请求可能导致不同的行为(取决于提供者的OAuth实现)。虽然这可能不适用于OAuth 2,但它需要在OAuth 1和OAuth 2之间保持一致。
  2. / connect / {provider}路径表示单个资源。只有这么多的HTTP动词可供选择,而不需要将动词放入路径中。该路径的GET方法已分配给请求以获取该提供程序的连接状态(这是一种安全且幂等的操作)。
  3. 即便如此,我还是遇到了你要问的用例。当我觉得需要有一个启动OAuth流程的链接时,我所做的就是有一个POST到/ connect / {provider}的表单,并有一些Javascript为我提交表单,或者作为结果直接链接(如果链接在应用程序的页面上)或作为页面加载的结果(如果链接将在电子邮件或聊天室中给出)。

    您当然也欢迎覆盖ConnectController的行为,甚至编写您自己的控制器实现来满足您的需求,即使它们违反了ConnectController实现原因的原因。