【发布时间】:2015-02-09 05:20:02
【问题描述】:
我正在尝试使用 oic 库向 Google OpenID Connect 进行身份验证,但出现错误
oic.exception.IssuerMismatch: 'https://accounts.google.com' != 'accounts.google.com'
运行时
from oic.oic.consumer import Consumer
db={}
config={}
c=Consumer(db, config)
print c.provider_config('https://accounts.google.com')
它尝试访问https://accounts.google.com/.well-known/openid-configuration,它说
"issuer": "accounts.google.com",
现在,specification 似乎表明这是不正确的:
发行人: 必需的。使用 https 方案的 URL,没有查询或片段 组件
我是否正确解释了这是 Google 的 OpenID 连接配置中的错误?我应该向哪里报告此错误?
(注意:我不是寻找解决方法,这很容易:我可以跳过提供程序配置发现并对发现的信息进行硬编码。但我想支持任意 OpenID Connect 提供商,而不仅仅是 Google)
【问题讨论】:
-
我不一定会称其为 错误,因为它不是 100% 符合规范的过程,而
oic正在更准确地确认那个领域。 Google 的文档明确指出必须使用 HTTPS 请求,并且 HTTP 连接被阻止,这可能是他们可以不将 URI 的那部分添加到issuer的原因。 -
问题是 oic 拒绝继续。它尝试验证它正在联系的服务实际上是应用程序尝试连接的服务,并发现它们是不同的服务(在字符串比较级别上)。从安全的角度来看,这听起来很明智,因为您不想将用户发送到错误的服务。依赖方应该进行此验证(在这种情况下,它是 Google 的错误未通过它),或者应用程序应该忽略 issuer 字段的实际值(在这种情况下,它会因为过于严格而成为 oic 的错误)。
-
同意,我对“错误”和“不合规格”的看法很迂腐。我还注意到,我能找到的所有其他示例
.well-known/openid-configuration(eBay、Heroku 和其他)确实在issuer中包含https://。不过,不知道你会如何向 Google 报告。
标签: google-openid openid-connect