1

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 モデルのクラスメソッドです。)keysecretkey

消費者側では、前述のブログ投稿に続いて、次のことを行っています。

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_hashGETPOST

2 番目の部分に答えるには、ランダムで十分な長さのキー/シークレット ペアを生成するだけでよいと思います。ランダムなソースの sha1 ハッシュを 2 つの 20 文字の部分に分割する人を見てきました。その後、ステップoauth2.Tokenで使用できる URL を自動的に作成できますauthorize_token

もちろん、これについて間違っている場合は、必ずお知らせください。

4

1 に答える 1

1

これは私が遭遇した問題とまったく同じように聞こえますが、別の (可能な) 解決策にたどり着きました。

すべてのクエリ文字列パラメーターが 2 回含まれているようです。これについては、このバグ レポートで説明されています: https://github.com/simplegeo/python-oauth2/issues/21

説明されている問題としてクエリ文字列パラメーターを削除すると、修正されました。

于 2012-01-27T03:49:37.673 に答える