2

LightOpenID PHPライブラリを拡張して、IDプロバイダーがDirectedIdentityを必要としていることを「発見」しようとしています。ライブラリは美しくよく書かれていて、素晴らしくきれいなので、これは簡単なはずですが、これらのタイプのプロバイダーを識別する方法がわかりません。私が試したいくつかのこと:

  • 私はこのテーマに関するOpenIDの仕様を調べましたが、手ぶらで出てきました。
  • PHP OpenIDライブラリを調べましたが、検出中にこの情報がどのように収集されたかを理解できませんでした。
  • LightOpenIDにコードを挿入することにより、サーバーから送信されたすべてのデータ(ヘッダーとコンテンツ)をダンプしましたが、役立つものは何も表示されませんでした。
  • 当然、GoogleとStackoverflowを検索しました。

プロバイダーは、「Directed Identity」認証が必要であるとどのように識別しますか?確かに、これには注意深く定義された仕様があります...どこかに。

誰かが私がこれについてもっと見つけることができる場所を知っていますか?

4

1 に答える 1

5

編集:上記で説明したのは、識別子選択メカニズムです。有向アイデンティティには識別子 selectが必要であり、実際に識別子 selectを指すために使用されることもありますが、この 2 つの用語は区別されます。この記事を参照してください。指定された ID を検出できません。

指定された識別子は、特定のサイトに固有の不透明な識別子です。同じ OpenID URL が特定の消費サイトに継続的に返されますが、ユーザーに対して同じ OpenID URL が 2 つの消費サイトに与えられることはありません。有向アイデンティティは、共謀から保護します。

オリジナル

OpenID仕様の「5.1. Direct Communication」にリンクした理由がわかりません。私が理解しているように、「指示されたアイデンティティ」とは、OpenID プロバイダーがユーザーをガイドして、ユーザーが自分自身を識別するために使用できる識別子を選択することです (こちらの「指示されたアイデンティティ」を参照)。

たとえば、自分の Google アカウントを識別するために、自分が所有していると主張する識別子を中継相手に直接渡すのではなく (できますが)、次のように指定します。

https://www.google.com/accounts/o8/id

次に、Google は OP に固有の匿名識別子を生成します。

www.google.com/accounts/o8/id?id=aitodwer

これは、実際に要求された識別子です。

OpenID プロバイダーは指定された ID を「必要」としませんが、サポートしていない可能性があります。直接識別が使用されるかどうかは、ユーザーが自分が所有していると主張する識別子を入力するか、プロバイダーの URL を入力するかによって決まります。プロバイダーは指定された ID をサポートしない場合がありますが、たとえ Google の場合のように、要求された ID が何であるかをアプリオリに知ることができない場合でも、常に非指定の種類をサポートします (Google は中継側ごとに 1 つを生成します)。これは、中継側が要求された識別子で発見を実行できなければならないためです (中継側がステートレスである場合は、直接検証を実行できる可能性があります)。(技術的には、プロバイダが なしidentifier_selectで認証リクエストを禁止する可能性はありますが、そうするものはないと思います)

これが起こっていることを簡単に検出できます。ユーザーは、「ユーザー提供の識別子」を中継側に入力します。その識別子で検出を実行した後、中継側は次のいずれかになります。

  • プロバイダー エンドポイント URL とプロトコル バージョンのみ (「Directed Identity」)。この場合、中継側は特別な値http://specs.openid.net/auth/2.0/identifier_selectを要求された ID と OP ローカル ID の両方として使用します。
  • プロバイダーのエンドポイント URL、プロトコル バージョン、要求された識別子 (ユーザーが指定した識別子)、および OP ローカル識別子 (OP ローカル識別子は、特定のエンドポイントに固有の識別子です。たとえば、www. mydomain.com を検索すると、それぞれ異なる OP ローカル識別子を持つ複数の OpenID プロバイダーが検出されます)

どちらの場合も、XML は次のようになります。

指定されたアイデンティティ(Google の例 -LocalId要素が存在しないことに注意してください)

<xrds:XRDS xmlns:xrds="xri://$xrds" xmlns="xri://$xrd*($v*2.0)">
    <XRD>
        <Service priority="0">
            <Type>http://specs.openid.net/auth/2.0/server</Type>
            <Type>http://openid.net/srv/ax/1.0</Type>
            <Type>http://specs.openid.net/extensions/ui/1.0/mode/popup</Type>
            <Type>http://specs.openid.net/extensions/ui/1.0/icon</Type>
            <Type>http://specs.openid.net/extensions/pape/1.0</Type>
            <URI>https://www.google.com/accounts/o8/ud</URI>
        </Service>
    </XRD>
</xrds:XRDS>

無向アイデンティティ(仕様の例)

<Service xmlns="xri://$xrd*($v*2.0)">
  <Type>http://specs.openid.net/auth/2.0/signon</Type>
  <URI>https://www.exampleprovider.com/endpoint/</URI>
  <LocalID>https://exampleuser.exampleprovider.com/</LocalID>
</Service>

ダイレクト ID には、リレー パーティがアサーションで要求された識別子を検証しなければならないという欠点があることに注意してください

于 2010-06-13T08:50:05.540 に答える