我正在尝试扩展LightOpenID PHP库以“发现”身份提供者需要定向身份。这应该很容易,因为图书馆编写得非常好并且非常干净,但我不知道如何识别这些类型的提供者。 我试过几件事:
提供商如何将自己标识为需要“定向身份”身份验证?肯定有一个精心定义的规范......在某处。
任何人都知道我可以在哪里找到更多信息?
答案 0 :(得分:5)
编辑:我在上面描述的是标识符选择机制。虽然定向身份需要标识符选择,有时确实用于引用标识符选择,但这两个术语是不同的。见this article。无法检测到定向身份。
定向标识符是一个不透明的标识符,对于给定的站点是唯一的。相同的OpenID URL不断返回给定的消费站点,但是没有两个消费站点为用户提供相同的OpenID URL。定向身份可防止串通。
<强> ORIGINAL 强>
我不明白你在OpenID规范中链接到“5.1。直接通信”的原因。据我了解,“定向身份”是指OpenID提供商指导用户选择他们可以用来标识自己的标识符(请参阅“定向身份”下的here)。
例如,要识别您的Google帐户,您不会直接向转接方提供您声称拥有的标识符(尽管您可以),您可以提供
https://www.google.com/accounts/o8/id
然后Google会生成一个特定于OP的匿名标识符,例如
www.google.com/accounts/o8/id?id=aitodwer
这是实际声明的标识符。
OpenID提供程序不“需要”定向标识,但它可能不支持它。决定是否使用定向识别的是用户是否输入他声称拥有的标识符或输入提供者URL。虽然提供商可能不支持定向身份,但它始终支持非定向类型,即使在Google的情况下,您也无法确定您声称的标识符的优先级(Google会为每个中继方生成一个)。这是因为中继方必须能够对所声明的标识符执行发现(并且如果中继方是无状态的,则可以执行直接验证)。 (嗯,从技术上讲,提供商可以在没有identifier_select
的情况下禁止身份验证请求,但我认为没有那样做)
您可以轻松检测到这种情况正在发生。用户将“用户提供的标识符”输入到中继方。在对该标识符执行发现后,中继方将either have:
http://specs.openid.net/auth/2.0/identifier_select
作为声明的和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>
非定向身份(来自规范的示例)
<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>
请注意,有向身份的缺点是中继方必须在断言中验证声明的标识符,从而需要再发现一次(见here)。