oauth2
開発中の API へのアクセスを制御するために Pyramid アプリケーションを使用してリクエスト トークンを生成しようとしています。この例で動作するコンシューマ キーとシークレットを検証しようとして行き詰まりました。Pyramid request_token エンドポイントには、次のものがあります。
@view_config(route_name = "api_request_token", request_method = "GET")
def api_request_token(request):
auth_header = {}
if ('Authorization' in request.headers):
auth_header = {'Authorization': request.headers['Authorization']}
req = oauth2.Request.from_request(
request.method,
request.url,
headers = auth_header,
query_string = request.query_string)
try:
oauth_server.verify_request(req, ConsumerKeySecret.getByConsumerKey(request.params.get('oauth_consumer_key')), None)
except oauth2.Error, e:
print e
except KeyError, e:
print e
except Exception, e:
print e
(は、指定されたおよびのConsumerKeySecret.getByConsumerKey
インスタンス変数を設定する SQLAlchemy モデルのクラスメソッドです。)key
secret
key
消費者側では、前述のブログ投稿に続いて、次のことを行っています。
def build_request(url, method='GET'):
params = {
'oauth_version': "1.0",
'oauth_nonce': oauth2.generate_nonce(),
'oauth_timestamp': int(time.time()),
'oauth_signature_method': 'HMAC-SHA1',
}
consumer = oauth2.Consumer(key='b9085cb942dc427c92dd', secret='1735fd5b090381dcaf57')
params['oauth_consumer_key'] = consumer.key
req = oauth2.Request(method=method, url=url, parameters=params)
signature_method = oauth2.SignatureMethod_HMAC_SHA1()
req.sign_request(signature_method, consumer, None)
return req
request = build_request("http://localhost:6543/api/01/request_token")
u = urllib2.urlopen(request.to_url())
ただし、検証は次のエラーで失敗します。
Invalid signature. Expected signature base string: GET&http%3A%2F%2Flocalhost%3A6543%2Fapi%2F01%2Frequest_token&oauth_body_hash%3D2jmj7l5rSw0yVb%252FvlWAYkK%252FYBwk%253D%26oauth_body_hash%3D2jmj7l5rSw0yVb%252FvlWAYkK%252FYBwk%253D%26oauth_consumer_key%3Db9085cb942dc427c92dd%26oauth_consumer_key%3Db9085cb942dc427c92dd%26oauth_nonce%3D42023151%26oauth_nonce%3D42023151%26oauth_signature_method%3DHMAC-SHA1%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1310338562%26oauth_timestamp%3D1310338562%26oauth_version%3D1.0%26oauth_version%3D1.0
ただし、各クエリ文字列パラメーターが「予期される」署名に 2 回出現するため、ここで混乱します。何がうまくいかないのですか?
それが簡単に答えられる質問なら、フォローアップがあります: 実際にリクエストを確認したら、リクエスト トークンを生成するにはどうすればよいですか? ライブラリは、このoauth2
点に関するドキュメンテーションが少し大雑把であり、そこにあるほとんどの例は、プロバイダーを作成するのではなく、コンシューマーを実装することを目的としているようです.
ありがとう!
更新 私自身の質問に答えて、私が答えだと思うものを提供します。のこのバグ レポートから、 を使用していたため、パラメータを含めると署名の検証が台無しoauth2
になっているように見えます。それを変更して問題を修正しました。私もこのライブラリでテストしていることを考えると、とにかくこれが起こるのは奇妙です。oauth_body_hash
GET
POST
2 番目の部分に答えるには、ランダムで十分な長さのキー/シークレット ペアを生成するだけでよいと思います。ランダムなソースの sha1 ハッシュを 2 つの 20 文字の部分に分割する人を見てきました。その後、ステップoauth2.Token
で使用できる URL を自動的に作成できますauthorize_token
。
もちろん、これについて間違っている場合は、必ずお知らせください。