【问题标题】:Getting 400 from Bitbucket OAuth从 Bitbucket OAuth 获得 400
【发布时间】:2013-03-10 05:59:42
【问题描述】:
from rauth import OAuth1Service

OAUTH_REQUEST = "https://bitbucket.org/!api/1.0/oauth/request_token"
OAUTH_AUTH = "https://bitbucket.org/!api/1.0/oauth/authenticate"
OAUTH_ACCESS = "https://bitbucket.org/!api/1.0/oauth/access_token"

service = OAuth1Service(
           name='test',
           consumer_key='xxxxxxxxxxxxxx',
           consumer_secret='xxxxxxxxxxxxxxxxxxxx',
           request_token_url=OAUTH_REQUEST,
           access_token_url=OAUTH_ACCESS,
           authorize_url=OAUTH_AUTH)

resp = service.get_raw_request_token()
print resp

我在 Bitbucket 上生成了一个消费者密钥对,但响应为 400。 知道发生了什么吗?

我查看了 Bitbucket 文档,并且 URL 是正确的。


编辑

感谢@maxcountryman 抽出宝贵时间。

我刚刚看了他的linkedlin example code

import os
from rauth import OAuth1Service

OAUTH_REQUEST = "https://bitbucket.org/!api/1.0/oauth/request_token"
OAUTH_AUTH = "https://bitbucket.org/!api/1.0/oauth/authenticate"
OAUTH_ACCESS = "https://bitbucket.org/!api/1.0/oauth/access_token"

service = OAuth1Service(
           name='test',
           consumer_key='blah',
           consumer_secret='blah',
           request_token_url=OAUTH_REQUEST,
           access_token_url=OAUTH_ACCESS,
           authorize_url=OAUTH_AUTH)

# You can run python -m SimpleHTTPServer if you want a local callback
rtoken, rtoken_secret = service.get_request_token(params={'oauth_callback': 'http://localhost:8000'})

authorize_url = service.get_authorize_url(rtoken)
print 'Visit this URL in your browser: ' + authorize_url
pin = raw_input('Enter PIN from browser: ')
session = service.get_auth_session(rtoken,
                                   rtoken_secret,
                                   data={'oauth_verifier': pin})

reponame = raw_input('Enter the reponame: ')
new_name = raw_input('Enter a new repo name: ')
account_name = raw_input('Enter your account name: ')
url = 'https://api.bitbucket.org/1.0/repositories/%s/%s' %(account_name, reponame)
r = session.put(url, data={'name': new_name})
print r

例子:

(k)yeukhon@yeukhon-P5E-VM-DO:/tmp$ python bb2.py
Visit this URL in your browser: https://bitbucket.org/!api/1.0/oauth/authenticate?oauth_token=xxxxxxxxxxxxx
Enter PIN from browser: 216000000
Enter the reponame: newpatch
Enter a new repo name: junk-patch
Enter your account name: yeukhon
<Response [200]>

edit 使用 base_url 听取 max 的其他建议。

OAUTH_REQUEST = "https://bitbucket.org/!api/1.0/oauth/request_token"
OAUTH_AUTH = "https://bitbucket.org/!api/1.0/oauth/authenticate"
OAUTH_ACCESS = "https://bitbucket.org/!api/1.0/oauth/access_token"

service = OAuth1Service(
           name='test',
           consumer_key='blah',
           consumer_secret='blah',
           request_token_url=OAUTH_REQUEST,
           access_token_url=OAUTH_ACCESS,
           authorize_url=OAUTH_AUTH,
           base_url='https://api.bitbucket.org/1.0/')

# You can run python -m SimpleHTTPServer if you want a local callback
rtoken, rtoken_secret = service.get_request_token(params={'oauth_callback': 'http://localhost:8000'})

authorize_url = service.get_authorize_url(rtoken)
print 'Visit this URL in your browser: ' + authorize_url
pin = raw_input('Enter PIN from browser: ')
session = service.get_auth_session(rtoken,
                                   rtoken_secret,
                                   data={'oauth_verifier': pin})

reponame = raw_input('Enter the reponame: ')
new_name = raw_input('Enter a new repo name: ')
account_name = raw_input('Enter your account name: ')
url = 'repositories/%s/%s' %(account_name, reponame)
r = session.put(url, data={'name': new_name})
print r.text
print r

【问题讨论】:

  • 仅供参考,如果提供者提供了一致的“基本”URI 以从中进行 API 调用,您可以通过将 base_url=https://api.bitbucket.org/1.0/ 传递给服务构造函数来简化代码。然后你可以像这样拨打电话:session.get('user'),所以session.put('https://api.bitbucket.org/1.0/repositories...', ...)可能会变成session.put('{0}/{1}'.format(account_name, reponame), ...)
  • @maxcountryman 非常有趣。非常感谢!刚试过。 :)

标签: python oauth bitbucket rauth


【解决方案1】:

你需要给 API 一个oauth_callback,像这样:

r = service.get_raw_request_token(params={'oauth_callback': 'http://example.com/'})

这应该会让您从提供商那里得到正确的回应。

【讨论】:

  • 我会在几分钟内尝试。但是这个call_back有什么意义吗?抱歉,非常感谢!
  • 是的,oauth_callback 是 OAuth 身份验证流程的规范部分;它是提供者在用户认证后重定向到的地方。以前我们已经自动为您插入了这个参数,但是考虑到提供者之间的差异和规范的身份验证流程的差异,我们决定把它拿出来并留给客户端。请确保您使用的是 rauth 0.5.3 和 Requests 1.1.0。如果您无法使其正常工作,我可以提供一个 BitBucket 示例。
  • 哇。非常感谢。 rauth 的作者的回答很荣幸 :) 只是几个菜鸟问题。 (1) 我收到了oauth_token_secret=blah&amp;oauth_token=blah&amp;oauth_callback_confirmed=true 的确认信息,如果我是正确的,我必须要求用户给予我许可。我看到示例代码请求一些用户必须输入的引脚。通常网站通过重定向到对话框来执行此操作。我正在运行 API Web 服务。那么有没有一种方法可以让用户在向我们的应用程序发起请求时立即授予我们权限?最好的解决方案是什么?谢谢。
  • 一般来说,您不需要别针。这被用于所谓的“带外”身份验证。通常,您只需在用户授权您后重定向回您的应用程序(这是对话框)。然后,您使用请求令牌对请求访问令牌。在那之后你就可以走了。无论如何,您将不得不要求用户授权您的应用程序,如果这是您的目标,我不确定您是否可以消除对话框?
  • 是的,最终目标是代表用户自动化。现在我想得更多,自动化它并没有真正的意义。我应该在 REST 中使用 HATEOS 概念进行转换并期望用户给我密码。但我想快速分享一些东西:我得到了网址,但提供给requests.get 的内容会将其视为常规网址。我可以运行python -m SimpleHTTPServer,使用 localhost:800 作为回调并在我的 chrome 中打开链接。我可以得到密码。
猜你喜欢
  • 2018-09-05
  • 1970-01-01
  • 2022-10-23
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
相关资源
最近更新 更多