Python 从Bitbucket OAuth获取400

Python 从Bitbucket OAuth获取400,python,oauth,bitbucket,rauth,Python,Oauth,Bitbucket,Rauth,我使用Bitbucket生成了一个消费者密钥对,但响应是400。 知道发生了什么吗 我查看了Bitbucket文档,URL是正确的 编辑 感谢@maxcountryman在这里花时间 我刚刚读了他的: 例如: import os from rauth import OAuth1Service OAUTH_REQUEST = "https://bitbucket.org/!api/1.0/oauth/request_token" OAUTH_AUTH = "https://bitbucket.

我使用Bitbucket生成了一个消费者密钥对,但响应是400。 知道发生了什么吗

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


编辑

感谢@maxcountryman在这里花时间

我刚刚读了他的:

例如:

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

您需要为API提供一个
oauth\u回调
,如下所示:

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

这将使您从提供商那里得到正确的响应。

我将在几分钟后尝试。但这回电话有什么意义吗?对不起,非常感谢!是的,
oauth\u回调
是oauth身份验证流程的一部分;在用户验证后,提供者将重定向到该位置。之前我们已经为您自动插入了这个参数,但是考虑到提供者之间的差异以及规范认证流中的差异,我们决定去掉这个参数,并将其留给客户端。确保您使用的是rauth 0.5.3和Requests 1.1.0。如果你不能让它工作,我可以提供一个BitBucket示例。哇。谢谢。《劳思》(rauth)一书作者的回答是一种荣誉:)只是一些新手问题。(1) 我得到了确认信息
oauth_-token\u secret=blah&oauth_-token=blah&oauth_-callback\u-confirm=true
,如果我是正确的,我必须请求用户给予我许可。我看到示例代码请求一些用户必须输入的PIN。通常,网站通过重定向到对话框来实现这一点。我正在运行一个API web服务。那么,有没有一种方法可以让用户在向我们的应用程序发出请求时立即给予我们权限?最好的解决方案是什么?谢谢。一般来说,你不需要别针。这被用于所谓的“带外”身份验证。通常,在用户授权后,您只需重定向回应用程序(这是一个对话框)。然后使用请求令牌对请求访问令牌。在那之后你就可以走了。不管怎样,你必须要求用户授权你的应用程序,如果这是你的目标,我不确定你是否能消除对话框?是的,最终目标是代表用户自动匹配。现在我想得更多了,自动化真的没有意义。我应该在REST中使用HATEOS概念来进行转换,并期望用户给我pin。但是我想快速地分享一些东西:我得到了url,但将其馈送到
请求。get
将把它作为常规url处理。我可以运行
python-msimplehttpserver
,使用localhost:800作为回调并在我的chrome中打开链接。我可以得到pin码。仅供参考,如果提供程序提供了一致的“基本”URI,从中进行API调用,您可以通过传递
base\u url来简化代码=https://api.bitbucket.org/1.0/
发送给服务构造函数。然后您可以这样调用:
session.get('user')
,所以
session.put('user')https://api.bitbucket.org/1.0/repositories...“,…)
可能会变成
session.put(“{0}/{1}”。格式(帐户名,reponame),…)
@maxcountryman非常有趣。非常感谢你!刚试过。:)
(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]>
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
r = service.get_raw_request_token(params={'oauth_callback': 'http://example.com/'})