Oauthlib: クラむアントWebアプリケヌションはclient_idを送信しなくなりたした

䜜成日 2018幎09月08日  Â·  26コメント  Â·  ゜ヌス: oauthlib/oauthlib

https://github.com/oauthlib/oauthlib/issues/495がマヌゞされたため、requests / requests-oauthlibで䜿甚するずマスタヌにリグレッションが芋぀かりたした。 これは、承認付䞎/ Webアプリケヌションのみに関連しおいたす。

リク゚ストの基本的な䜿甚法-oauthlibは次のずおりです。

sess = OAuth2Session(client_id)
token = sess.fetch_token(token_url, client_secret=client_secret, authorization_response=request.url)

ただし、倉曎されたため、セッションのclient_idは無芖されたす。 https://github.com/oauthlib/oauthlib/pull/505はナヌスケヌスを修正したず思い

リク゚スト-https  //github.com/requests/requests-oauthlib/blob/master/requests_oauthlib/oauth2_session.py#L196でのoauthlibコヌド呌び出し-L198ずoauthlibの問題はこちら
https://github.com/oauthlib/oauthlib/blame/master/oauthlib/oauth2/rfc6749/clients/web_application.py#L128。

Bug Discussion OAuth2-Client

最も参考になるコメント

client_idを別の倀でオヌバヌラむドする方法がわからないため、䟋倖が異なる堎合は䟋倖を発生させるこずに投祚したす。

さらに、 client_idがkwargずしお提䟛された堎合、 DeprecationWarningログに蚘録する必芁がありたすか

党おのコメント26件

私の最初の考えはの倉化戻すこずですprepare_request_body 、デフォルトで、䜿甚するself.client_idに蚭定されたWebApplicationClientコンストラクタを。
次に、むンラむンドキュメントをdequationで倉曎しお、 &client_id=xxをprepare_request_body出力に远加する必芁がありたす。

最埌に、元の修正を眮き換えるために、匕数からclient_idを削陀し、 include_client=True/Falseようにprepare_request_body新しい匕数を远加しお、䞡方にclient_id远加するこずをお勧めしたす。本文にclient_secretを含めるか、䞡方を含めないでください。

考え

@Diaoul @ skion @ thedrowを突く

どうですか

匕数からclient_idを削陀し、include_client = True / Falseのようなprepare_request_bodyに新しい匕数を远加しお、client_idずclient_secretの䞡方を本文に远加するか、䞡方を含めないこずをお勧めしたす。

ありがずう

私は実際に私のテストの1぀でこれず同じ問題を匕き起こしたしたが、requests / oauthlibに察しおここに提出したした https 

問題は実際にはrequests_oauthlibのせいだず思いたす。 圌らのドキュメント実際には、ペヌゞをロヌドしたずきのドキュメント党䜓の最初の䟋は、 OAuth2Sessionコンストラクタヌでclient_idを指定するこずをサポヌトしおいたす。 行200のロゞックは、kwargsからclient_idをプルしたすが、すでに構築されおいるWebApplicationClientむンスタンスからプルするためのフォヌルバックはありたせん。

@jvanasco 、珟圚の問題585は、requests-oauthlibのみで修正するか、oauthlibのPR505を元に戻すこずで修正できたす。 ただし、 https //github.com/oauthlib/oauthlib/pull/505#issuecomment-351221107のコメントで@skionが蚀及した動䜜を修正する゜リュヌションはありたせん。

仕様によれば、client_idパラメヌタヌは認蚌されおいないクラむアントに送信する必芁がありたすが、機密クラむアントのトヌクン芁求本文では送信しないこずが望たしいです。その堎合、クラむアントを認蚌するための掚奚メカニズムはHTTP基本認蚌を介しお行われたす。 ただし、WebApplicationクラスには垞にそれが含たれ䞀郚のサヌバヌが砎損したす、それを削陀するメカニズムは提䟛されたせん。

Oauthlibは、リク゚ストに察しお゚レガントでシンプルな方法を提䟛する必芁がありたす-oauthlibは問題を解決したす。 この議論で解決策を芋぀けるこずができれば、それは玠晎らしいこずです。 それは巚倧なブロッカヌだからです。

prepare_request_body()ヘルプでclient_id=Falseを蚱可しお、client_idが送信されないこずを瀺したすか たずえそうだずしおも、それは126行目近くのこの醜さに぀ながるでしょう

client_id = None if client_id=False else self.client_id

ああ、分かった。

client_idを送信する必芁がある堎合ず送信しない堎合の既存の単䜓テストはありたすか そうでない堎合、誰かがそれを生成するために䜿甚できるリストを持っおいたすか 私はこれずrequests-oauthlibを修正するこずを喜んで受け入れたす、なぜならそれは今私の仕事のいく぀かをブロックしおいるからです。

@JonathanHuot

匕数からclient_idを削陀し、include_client = True / Falseのようなprepare_request_bodyに新しい匕数を远加しお、client_idずclient_secretの䞡方を本文に远加するか、䞡方を含めないこずをお勧めしたす。

これを読み返しお、私は実際にあなたの提案がずおも奜きです。 関数はすでに**kwargs取るので、おそらくそれを壊さない方法でやるこずはできたす。

泚

本䜓にclient_idずclient_secretの䞡方を远加したす

これはパブリッククラむアントIIUCに関するものなので、 client_secretが関係しおいるずは思いたせん。 client_idが本䜓に远加されおいるだけですか その堎合、新しいパラメヌタの名前をinclude_client_id=True/False倉曎するこずも怜蚎したす。

その堎合、新しいパラメヌタヌの名前をinclude_client_id = True / Falseに倉曎するこずも怜蚎したす。

それはそう  client_secretは、 WebApplicationClient存圚しないため、関䞎したせん。

@ jvanasco 、PRをしたいのなら、倉曎は次のようにすべきだず思いたす。
1https://github.com/oauthlib/oauthlib/pull/505を元に戻したす
2を倉曎し、眲名prepare_request_body()削陀するclient_idし、远加include_client_id=True/False  True デフォルトそれは远加self.client_id 

次に、requests-oauthlibは、https//github.com/requests/requests-oauthlib/blob/master/requests_oauthlib/oauth2_session.py#L196-L211で次のいずれかを遞択できたす。
A本文にclient_idのみを含める

self._client.prepare_request_body(..)

B client_idずclient_secretをauth含め、本文には含めないRFC掚奚゜リュヌション

self._client.prepare_request_body(include_client_id=False, ..)
auth = requests.auth.HTTPBasicAuth(client_id, client_secret)

C本文にclient_idずclient_secretを含めるRFC代替゜リュヌション

self._client.prepare_request_body(client_secret=client_secret, ..)

今日は䞡方のプロゞェクトのPRを生成したす。

OAuthlibのPRずテストはほが完了しおいたす。 でも質問がありたす...

client_idただkwargずしお蚱可されるべきですか これは郚分的に䞋䜍互換性のためですが、゚ッゞケヌスのためでもありたす。 このメ゜ッドはやや壊れおいたので、意図したずおりに機胜させる prepare_request_body self.client_idをオヌバヌラむドできるようにするなどか、誀った䜿甚法で䟋倖を発生させる発生させるなど䟡倀があるず思いたす。 client_idが提䟛されおいるが、 self.client_id䞀臎しない堎合ぱラヌになりたす。

client_idを別の倀でオヌバヌラむドする方法がわからないため、䟋倖が異なる堎合は䟋倖を発生させるこずに投祚したす。

さらに、 client_idがkwargずしお提䟛された堎合、 DeprecationWarningログに蚘録する必芁がありたすか

PR593を提出したした。 client_idが送信されるずDeprecationWarningが発生し、 self.client_idず異なる堎合はValueErrorが発生したす。 詳现な3぀のシナリオ@JonathanHuotぞの準拠を確認する新しいテストもありたす。

リク゚ストに関する最初の問題に遭遇したした-いく぀かのテストを曞いおいるずきにoauthlibPR候補

それは、垞に起動したすprepare_request_bodyしおusername=username, password=password 。 これは間違っおいるようです。 ここにいる誰かがRFCに粟通しおいお、次の答えを知っおいるこずを願っおいたす。

  1. username + password request.bodyのパラメヌタにする必芁がありたすか
  2. username + passwordがHTTP基本認蚌ヘッダヌに衚瀺される堎合、それらをリク゚スト本文に耇補する必芁がありたすか
  3. username + password本文パラメヌタヌずクラむアントの詳现を含むHTTPBasicAuthヘッダヌの䞡方を持぀こずは可胜ですか

これに遭遇しおくれおありがずう。

  1. usernameずpasswordは、垞にリク゚ストの本文に存圚するのみ䜿甚する必芁がありたす。 これらを他の付䞎暗黙的、コヌド、クラむアント資栌情報に䜿甚しおはなりたせん。
  2. HTTP基本認蚌は、クラむアントの資栌情報ではオプションです機密クラむアント、぀たりclient_secret䜿甚する堎合に掚奚されたす。 ナヌザヌの資栌情報は、HTTP基本認蚌に含たれおいおはなりたせ
  3. はい

ありがずう。 2぀のこずを明確にするために、私が5歳のように遠慮なく私に話しおください。 私はこれずテストが正しく行われるこずを確認したいず思いたす

  1. ナヌザヌ名ずパスワヌドは、それらを必芁ずする特定の皮類の付䞎でのみ䜿甚されたす。 䜿甚する堎合、それらはリク゚スト本文にのみ存圚する可胜性がありたす。

それらが明瀺的に指定されおいない限り、それらは存圚すべきではありたせん、正しいですか

  1. Http基本認蚌がクラむアントの資栌情報のみを察象ずしおいる堎合、既存のrequests-oauthlibには、ナヌザヌ名ずパスワヌドの組み合わせから基本認蚌を生成するブロックを含めるべきではありたせん。

冗長で、これらの小さな詳现に執着しおいるこずをお蚱しください。 jが正しい動䜜を取埗し、別の回垰が発生しないこずを確認するテストを蚘述できるこずを確認したいだけです。

@ jvanasco 、OAuth2 RFCに぀いおはわかりたすが、 requests-oauthlibずflask-oauthlibどのように組み合わされおいるかわかりたせん。

  1. はい

正しい。

  1. はい、AFAIUにはこのブロックを含めるべきではありたせんhttps://github.com/requests/requests-oauthlib/blob/master/requests_oauthlib/oauth2_session.py#L207-L211 。

私の理解ですが、珟堎の珟実ず照合するのは良いこずです。 ぀たり、requests-oauthlibずさたざたなパブリックプロバむダヌの経隓。 耇数の芁求-oauthlibの議論https://github.com/requests/requests-oauthlib/issues/218 、 https://github.com/requests/requests-oauthlib/issues/211 、 https://github.com/requests / requests-oauthlib / issues / 264 、すでに発生しおいたす。

client passwordずclient secret間で混乱があったず思いたすが、これは実際にはたったく同じこずを衚す2぀の衚珟です。
https://github.com/requests/requests-oauthlib/pull/206の背埌にある理論的根拠に埓うず、PRのコンテンツはHTTPAuth(username, password)远加するようなものではなく、 HTTPAuth(client_id, client_secretであるはずです。 クラむアントのパスワヌド。

リク゚ストに参加した@ Lukasa 、 @ chaosct 、 @ ibuchananを突く-oauthlibの議論。

玠晎らしい 本圓にありがずう。 それが起こっおいるず思いたしたが、確認したかったのです。

私は今、リク゚ストをどのように構成したいかを知っおいるず思いたす。 私はメむンリク゚ストプロゞェクトにいく぀かのコミットを持っおいるので、メンテナがPRず機胜で䜕を芋たいかを知っおいたす。

  1. ナヌザヌ名ずパスワヌドは、それらを必芁ずする特定の皮類の付䞎でのみ䜿甚されたす。 䜿甚する堎合、それらはリク゚スト本文にのみ存圚する可胜性がありたす。

はい、最初の郚分です。特定の皮類の助成金のみがそれらを必芁ずしたす。 しかし、リク゚スト本文でそれらを送信するこずに぀いおの2番目の郚分では、仕様は次のように述べおいたす。

リク゚スト本文にクラむアントの資栌情報を含める
2぀のパラメヌタヌの䜿甚は掚奚されたせん
盎接利甚できないクラむアントに限定する必芁がありたす
HTTP基本認蚌スキヌム..

しかし、サヌバヌの堎合、次のようになりたす。

承認サヌバヌは、以䞋を含むサポヌトを行う堎合がありたす
リク゚ストボディのクラむアントクレデンシャル...

準拠しおいるクラむアントは、リク゚スト本文で資栌情報を送信したせん。
ただし、䞀郚実装されおいるサヌバヌの堎合、リク゚スト本文でのみ受け入れたす。
正しく思い出せば、私のPRは、認蚌ヘッダヌを远加するこずでこの混乱を解決したした。
したがっお、クラむアントは䞡方を送信したす。

@JonathanHuotは2点目に぀いおは正しいず

こんにちは@ibuchanan 、あなたが参照しおいる匕甚笊は甚語client credentialsたす。 クラむアントずリ゜ヌス所有者実際のナヌザヌを混圚させないように十分に泚意する必芁がありたす。

圹割はここで明確に説明されおいたすrfc67491.1 。
このclient credentialsはclient_idずclient_secretをusernameずpasswordたす。 それらは互換性がありたせん。

したがっお、これらのロヌルでRFCを読み取るこずは、準拠するクラむアントがHTTP Basicでクラむアントクレデンシャル client_id 、 client_secret を送信する必芁があり、ナヌザヌクレデンシャル username 、 passwordリク゚スト本文のrfc67494.3.2を参照しおください。

client_idがリク゚ストに含たれおいる堎合、䞀郚のサヌバヌはリク゚スト400を拒吊したす
䜓。 デフォルトは仕様で掚奚されおいるものでなければならないず思いたす。

Ok。 oauthlibの珟圚のPRは、䞊蚘の懞念を満たしおいるず思いたす。 include_client_idフラグは、 client_id送信を明瀺的に蚱可するかどうかを瀺したす。

requests_oauthlibに関しおは、これが私が考えおいるこずです。

  1. usernameずpasswordは本文にのみ衚瀺されたすHTTP基本ずしおは衚瀺されたせん。 非準拠のサヌバヌ統合にその動䜜が必芁な堎合、実装者はauthたたはheaders匕数をfetch_token()送信できたす。

  2. client_idを正しい堎所に提䟛するのは少し面倒ですが、ロゞックずナヌスケヌスはダりンしおいるず思いたす。 これは間違いなくいく぀かのレビュヌが必芁になりたす。

@JonathanHuotず@ibuchananに぀いおの質問

oauthlibのOAuth2 Clientずrequests_oauthlibのOAuth2Sessionは、 client_secretを保持せず、繰り返し呌び出す必芁がありたす。 これはOAuth1には圓おはたりたせんでしたが、これが370の背埌にある実際の問題だったず思いたす。 RFCはこれの必芁性に぀いお蚀及しおおらず、私は歎史を芋぀けるこずができたせんでした。

私にずっおは、 client_secretを栌玍しおクラむアントを拡匵し、 fetch_tokenずrequest client_secretを枡すこずぞのOAuth2Sessionの䟝存を非掚奚にするこずは理にかなっおいたす。 requestクラむアント自䜓で珟圚䜿甚しおいるものを䜿甚するこずに賛成。 これは、https//github.com/requests/requests-oauthlib/issues/264で報告されおいる他のいく぀かの䞍敎合にも察凊したす

ナヌザヌ名/パスワヌドずclient_id / client_secretのテスト倉数を暙準化するために、oauthlib593のPRを少し倉曎したした。 将来的には、間違いによる䞡者の混乱を防ぐこずができるず思いたす。

リク゚ストに察しお提案された倉曎-oauthlib https 

これはもう少し抜本的です。コヌドずテストを芋るず、ラむブラリは、機胜しおはいけないあらゆる皮類のものを機胜させようずしおいたようです。

修正はいく぀かのこずを行いたす

  1. usernameずpasswordチェックは、 LegacyApplicationClientむンスタンスでのみ発生したす。これが必芁な唯䞀の皮類であるためです正しいですか。 チェックの䞋に、ナヌザヌ名/パスワヌドをkwargsdictにマヌゞするセクションがありたす。 テストでは、他のクラむアントがこの情報を枡したい可胜性があるこずが瀺唆されおいるため、珟圚はアりトデントされおいたす。

  2. client_id / authヘッダヌを凊理するためのロゞックが曞き盎され、適切なタむプの認蚌がデフォルトで適切な堎所で行われるようになりたした。 ナヌザヌが別の方法で資栌情報を匷制したい堎合でも、それは可胜です。

  3. 質問 client_secretが枡されない状況はありたすか 䜕も思い぀かないのですが、oAuthフロヌはたくさんありたす。

したがっお、requests-oauthlibバヌゞョンでは

| include_client_id | auth | 行動|
| ------------------- | --------------- | -------- |
| なしデフォルト| なしデフォルト| client_id䜿甚しおAuthオブゞェクトを䜜成したす。 本文でclient_idを送信しないでください。 RFCが掚奚しおいるため、これはデフォルトの動䜜です。 |
| なしデフォルト| プレれント| Authオブゞェクトを䜿甚したす。 include_client_id=False oauthlibのprepare_request_bodyを呌び出す|
| 誀り| プレれント| Authオブゞェクトを䜿甚したす。 include_client_id=False oauthlibのprepare_request_bodyを呌び出す|
| 本圓| プレれント| Authオブゞェクトを䜿甚したす。 include_client_id=True oauthlibのprepare_request_bodyを呌び出す|
| 本圓| なしデフォルト| client_id䜿甚しおAuthオブゞェクトを䜜成したす。 include_client_id=True oauthlibのprepare_request_bodyを呌び出す|
| 誀り| なしデフォルト| client_id䜿甚しおAuthオブゞェクトを䜜成したす。 include_client_id=False oauthlibのprepare_request_bodyを呌び出す|

たたは別の蚀い方をするず

  • 認蚌オブゞェクトを䜜成したす

    • 本文でクラむアントIDを送信しないでください。

    • include_client_id = None、auth = None

    • include_client_id = False、auth = None

    • 本文でクラむアントIDを送信したす。

    • include_client_id = True、auth = None

  • 明瀺的な認蚌オブゞェクトを䜿甚する

    • 本文でclient_idを送信しないでください。

    • include_client_id = None、auth = authObject

    • include_client_id = False、auth = authObject

    • 本文でclient_idを送信したす。

    • include_client_id = True、auth = authObject

@jvanasco oauthlibずrequests-oauthlib偎で非垞によく芋えたす。

3.質問に぀いお

client_secretなしでたたは空の、RFCの芳点からは近いパブリッククラむアントを持぀こずができたす。 したがっお、PythonAPIは「秘密なし」をサポヌトする必芁がありたす。

実際のナヌスケヌスは、倚くの堎合、認蚌コヌドを䜿甚するこずを奜むネむティブアプリケヌションですが、秘密を安党に保぀ためのセキュリティを保蚌するこずはできたせん。したがっお、 client_secretなしでclient_idを受け入れるこずもできたす。 client_secret たたはRFCず同じ空のclient_secret ; たたは、別のPKCE RFCも利甚できたすhttps://oauth.net/2/pkce/を参照。 しかし、埌者はただoauthlib偎では実装されおいたせん。

ありがずう。 client_idなしでclient_secret client_idを送信できるこずを確認するために、いく぀かのテストケヌスを远加したす。 非垞に倚くの質問をしお申し蚳ありたせんが、この仕様の可胜な実装は非垞に倚くあり

@JonathanHuot既存の実装は、 client_secret空の文字列の送信をサポヌトしおいたせん。 このロゞックでは削陀されたすhttps://github.com/oauthlib/oauthlib/blob/master/oauthlib/oauth2/rfc6749/parameters.py#L90-L125-具䜓的には122行目

それをサポヌトするこずは、そのルヌチンの盎埌に次のようなものを远加するこずです

if ('client_secret' in kwargs) and ('client_secret' not in params):
    if kwargs['client_secret'] == '':
        params.append((unicode_type('client_secret'), kwargs['client_secret']))

シヌクレットが空の文字列の堎合はclient_secretの空の文字列を送信したすが、倀がNone堎合はclient_secret送信したせん。

RFCが2぀のバリアントのいずれかをサポヌトしおいる堎合、1぀のバリアントのみをサポヌトする倚くの壊れた実装が存圚する可胜性があるため、これをサポヌトする䟡倀があるず思いたす。

この元の問題はoauthlibで修正されおいたす。 ただし、 https//github.com/requests/requests-oauthlib/pull/331が修正されるたで、動䜜はそのたたです。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡