如何将OpenID提供程序标识为需要定向标识?

Skr*_*rat 2 php openid lightopenid

我正在尝试扩展LightOpenID PHP库以"发现"身份提供者需要定向身份.这应该很容易,因为图书馆编写得非常好并且非常干净,但我不知道如何识别这些类型的提供者.我试过几件事:

  • 我查看了关于这个主题的OpenID规范,但空手而归.
  • 查看了PHP OpenID库,但无法弄清楚在发现过程中如何收集此信息.
  • 通过在LightOpenID中注入一些代码但没有看到任何有用的东西来转储来自服务器的所有数据(标题和内容).
  • 自然而然地搜索了Google和Stackoverflow.

提供商如何将自己标识为需要"定向身份"身份验证?当然,在某个地方有一个精心定义的规范.

有谁知道我可以在这里找到更多?

Art*_*cto 5

编辑:我在上面描述的是标识符选择机制.虽然有向身份需要标识符选择,有时确实用于指代标识符选择,但这两个术语是不同的.看到这篇文章.无法检测到定向身份.

向标识符是不透明的标识符,对于给定的站点是唯一的.相同的OpenID URL不断返回给定的消费站点,但是没有两个消费站点为用户提供相同的OpenID URL.定向身份可防止串通.

原版的

我不明白为什么你链接到OpenID规范中的"5.1.直接通信".据我了解,"导演的身份"是当OpenID提供商,通过选择,他们可以用它来识别自己的标识符引导用户(见这里下"导演身份").

例如,要识别您的Google帐户,您不会直接向转发方提供您声称拥有的标识符(尽管您可以),

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

然后Google会生成一个特定于OP的匿名标识符,例如

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

这是实际声明的标识符.

OpenID提供程序不"需要"定向身份,但它可能不支持它.决定是否使用定向识别的是用户是否输入他声称拥有的标识符或输入提供者URL.虽然提供商可能不支持定向身份,但它始终支持非定向类型,即使在Google的情况下,您也无法确定您声明的标识符的优先级(Google会为每个中继方生成一个).这是因为中继方必须能够对所声明的标识符执行发现(并且如果中继方是无状态的,则可以执行直接验证).(好吧,从技术上讲,提供商可以禁止认证请求identifier_select,但我认为没有做到这一点)

您可以轻松地检测到这种情况正在发生.用户将"用户提供的标识符"输入到中继方.在对该标识符执行发现后,中继方将具有:

  • 仅提供者端点URL和协议版本("定向标识").在这种情况下,中继方将使用特殊值http://specs.openid.net/auth/2.0/identifier_select作为声明的和OP本地标识符.
  • 提供者端点URL,协议版本,声明的标识符(用户提供的标识符)和OP本地标识符(OP本地标识符是特定于某个端点的标识符 - 例如,我可以设置www. mydomain.com导致发现几个OpenID提供程序,每个提供程序具有不同的OP本地标识符)

以下是两种情况下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>
Run Code Online (Sandbox Code Playgroud)

非定向身份(来自规范的示例)

<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>
Run Code Online (Sandbox Code Playgroud)

请注意,有向身份的缺点是中继方必须在断言中验证声明的标识符,从而需要再发现一次(参见此处).