OAuth2变量redirect_uri

时间:2013-07-13 01:18:30

标签: oauth oauth-2.0

我们正在编写一个与OAuth2 api集成的插件。

棘手的部分是我们不能像大多数集成中那样硬编码重定向URI,因为客户端可以在他们控制的任何域上安装此插件(想想Wordpress插件),并且访问令牌需要重定向回他们的自定义网址。

我们看到您也可以在OAuth2中设置state参数。因此,我们可以将重定向URI硬编码为http://oursite.com/callback,并将状态设置为https://[CUSTOM_URL]

然后http://oursite.com/callback会另外重定向到自定义网址,并传递访问令牌。

但是,这似乎是一个安全漏洞,因为一旦用户对应用程序进行了身份验证,其他人就可以出现并使其在state param中使用自己的url重新进行身份验证。然后它会愉快地重定向到他们的坏URL并将访问令牌传递给他们。

那么人们如何设置OAirect2集成,其中redirect_uri可以变化?谢谢!

P.S。我们想到的一个解决方案是允许使用state param,如果重定向uri是我们控制的url。然后我们可以创建另一个验证页面,再次提示用户:“您是否允许https://customurl.com访问您的帐户...”。但我们认为可能有更好的方法。

2 个答案:

答案 0 :(得分:0)

对于动态客户端地址,可能值得考虑使用基于localhost的重定向URI。这可能首先听起来违反直觉,但由于OAuth2是基于浏览器/ httpclientlib的协议,因此它可以工作。从服务器的授权端点重定向是由您自己的浏览器完成的,因此始终正确解析localhost as redirect_uri。因此,无论您在何处部署应用程序,都可以获得修复redirect_uri。

此解决方案也有其含义,您应该考虑架构和安全性后果。基于localhost的redirect_uri非常适合隐式授权方案(即javascript客户端),但我认为对于授权代码授权方案(即远程Web应用程序),您应该使用远程访问的主机名。

答案 1 :(得分:0)

对我来说,您的方向正确,恕我直言,这是传递带有状态信息的唯一方法。 为了安全起见,我建议您不要在状态中传递URL,而应传递关键字。然后在您的应用中有一个处理http://oursite.com/callback URL的映射,只有当映射中存在关键字时,您才能从该映射重定向到相应的URL。