是否可以在没有redirect_uri或没有设置复杂服务器的情况下使用OAuth 2.0?

时间:2012-10-22 07:28:12

标签: python web-applications oauth oauth-2.0 rauth

我必须将一些文件传输到远程服务器,我必须执行OAuth2.0以获取访问令牌,然后只需执行POST请求即可上传文件。

现在我懒得在云上设置一个Django项目然后执行OAuth2,虽然没有“太好”的lib了。

所以,我正在考虑使用rauth lib作为一个简单的python脚本来执行OAuth2,而没有真正设置一个接受请求和所有的服务器..

但是,在远程服务器配置文件中,我需要提供redirect_url,当然还有rauth客户端库。

在没有真正在云上设置项目的情况下,是否有任何可能的方法来执行此授权..我正在寻找简单的python脚本。

1 个答案:

答案 0 :(得分:2)

我是rauth的作者和维护者。

Rauth不再强制执行redirect_uri,因此如果您的提供商允许,那么您可以放弃使用它。但是,如果您的最终目标不是设置服务器,那么即使提供者需要redirect_uri,这也应该是可行的。例如,您可以重定向到localhost,在那里您可以使用Flask设置最小服务器,或者如果提供者允许,还可以使用其他任意URL,例如, Facebook为此目的提供https://www.facebook.com/connect/login_success.html。您正在使用的提供商可能有类似的方案。 Here's an example与rauth。

另一种选择是使用带有grant_type = password的Bearer Auth。所有OAuth 2.0提供程序假设支持Bearer Auth,但可能无法实现密码grant_type。这不需要redirect_uri,而是最终将服务器传递给您的用户凭据,并且它应该向您返回访问令牌。如果您的提供商允许使用grant_type密码的Bearer Auth,这可能是您的理想选择。 Rauth 0.5.3默认尝试使用Bearer Auth,所以你要做的就是传入grant_type。请务必先更新。

这是一个简单的例子:

# assume you have constructed an OAuth2Service object and bound it to `serv`

params = {'grant_type': 'password',
          'username': 'foo',
          'password': 'hunter2'}

s = service.get_auth_session(params=params)
r = s.get('https://example.com/api/some/endpoint')

根据提供商和您想要做的事情,可能需要进行更多调查。但是,希望这会给你一些开始。

修改

我认为我对密码grant_type的评论有点混乱:我似乎暗示你必须将它与Bearer Auth一起使用(这里是Bearer Auth我的意思是在承载格式的授权标题中粘贴访问令牌),但是实际上你没有。尽管不鼓励,但在实体方法[1]中发送凭证是可以接受的。如果您使用rauth并发现身份验证无法正常工作,您可能需要像这样禁用Bearer Auth:

s = service.get_auth_session('/some/resource',
                             data={'code': code},
                             bearer_auth=False)

来自规范:

[1]“客户端应该使用带有承载HTTP授权方案的授权请求头字段,使用承载令牌进行经过身份验证的请求。资源服务器必须支持此方法。”