0

そのため、Django-Piston を使用して OAuth の実装を行っているときに、次のエラーが発生しました: 「無効な署名」: Django-piston を使用した oAuth プロバイダー

以前に投稿された解決策がうまくいかなかったため、Piston ( https://bitbucket.org/jespern/django-piston/overview ) と Scribe ( https://github.com/fernandezpablo85/scribe-java )の両方を深く掘り下げ始めました。 )。

JSON 文字列ペイロードを使用して Scribe リクエストに署名すると、OAuth パラメーターのみが実際に署名されることが判明しました。これにより、ピストンは OAuth パラメーターに加えてペイロード内のすべてのパラメーターに署名するため、署名の検証に失敗します。

OAuth パラメーターのみに署名するように Piston を変更することができ、すべてが正常に機能するようになりました。OAuth に少し慣れていないので、これが正しい修正であるかどうかはわかりませんでした。1 つの代替手段は、Scribe を変更してペイロード コンテンツにも署名することです (または、ペイロードに各パラメーターを文字列として添付するのではなく追加することもできます)。

この問題に対処する適切な方法について洞察を持っている人はいますか?

4

2 に答える 2

0

OAuth仕様では、ペイロードについては何も述べられていません(パラメーターではありません)。一部のプロバイダーはそれに署名しますが、それは彼ら次第です。Scribeで本文のコンテンツ(xml、jsonなど)に署名しないことは設計上の決定であり、変更されることはありません。

于 2012-06-25T14:20:54.337 に答える
0

ここで正しい決定を下した場合に備えて、Piston の修正を次に示します。クラス OAuthRequest(object) に次のメソッドを追加します。

    def get_oauth_parameters(self):
    """Get any OAuth parameters."""
    parameters = {}
    for k, v in self.parameters.iteritems():
        # Ignore oauth parameters.
        if k.find('oauth_') > -1:
            parameters[k] = v
    return parameters

これを変更して、新しいメソッドを呼び出します。

    def get_normalized_parameters(self):
    """Return a string that contains the parameters that must be signed."""
    params = self.get_oauth_parameters()
    try:
        # Exclude the signature if it exists.
        del params['oauth_signature']
    except:
        pass
    # Escape key values before sorting.
    key_values = [(escape(_utf8_str(k)), escape(_utf8_str(v))) \
        for k,v in params.items()]
    # Sort lexicographically, first after key, then after value.
    key_values.sort()
    # Combine key value pairs into a string.
    return '&'.join(['%s=%s' % (k, v) for k, v in key_values])
于 2012-06-24T21:26:09.600 に答える