PHP中的Auth0 JWT令牌验证
Posted
技术标签:
【中文标题】PHP中的Auth0 JWT令牌验证【英文标题】:Auth0 JWT Token validation in PHP 【发布时间】:2017-03-22 18:12:45 【问题描述】:我正在尝试将 Auth0 JWT 从我的客户端发送到我的服务器并验证令牌。我通过 AuthHttp 标头将 auth0 身份验证返回的 token_id 发送到我的服务器,我可以在 php 中毫无问题地获取它。
简短:
Angular 2 Auth0 JWT 被发送到 PHP 服务器。 如何验证签名是否正确?我有 Secret ID,我有带有编码和解码功能的 JWT 助手类。
如果这是正确的方法,我如何检查标头和正文 = 发送过来的 JWT 的签名。
编辑:
我传入我的令牌
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvbG93aWUuZXUuYXV0aDAuY29tXC8iLCJzdWIiOiJnb29nbGUtb2F1dGgyfDEwNDY4ODk4NjgxNzEwNjQ3Mjc5MCIsImF1ZCI6IlYwWWVaREliYmVGdEJ4Z3F2UkNzVkFjWWxscXpaZGlNIiwiZXhwIjoxNDc4NzMxNjIzLCJpYXQiOjE0Nzg2OTU2MjN9._uyKrxJ0lPR-tEPjOFiI5ygeiM689gqURcIfG4sWkWc P>
然后我在其中获取这个令牌的主体并将其放入一个数组中
Array ( [iss] => https://lowie.eu.auth0.com/ [sub] => google-oauth2|104688986817106472790 [aud] => V0YeZDIbbeFtBxgqvRCsVAcYllqzZdiM [exp] => 1478731623 [iat] => 1478695623 )
一旦我有了数组,这就是我的有效载荷吧?
// 这是一个被验证为正确的令牌的图像 https://gyazo.com/93777863d988d8c6ef0fc4ea50755949
那么为什么下面的代码没有给我相同的令牌?
$jwt = JWT::encode($bodyArray, "SuperSecureSecretSecret");
但我收到了这个回复
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2xvd2llLmV1LmF1dGgwLmNvbS8iLCJzdWIiOiJnb29nbGUtb2F1dGgyfDEwNDY4ODk4NjgxNzEwNjQ3Mjc5MCIsImF1ZCI6IlYwWWVaREliYmVGdEJ4Z3F2UkNzVkFjWWxscXpaZGlNIiwiZXhwIjoxNDc4NzMxNjIzLCJpYXQiOjE0Nzg2OTU2MjN9.6lEg_0h0zytQZVBqDe-ZIS5PoSkFAJhWtRYSgaDCesY P>
【问题讨论】:
【参考方案1】:您应该使用支持您正在使用的 JWT 签名类型的现有库。有关 PHP 可用选项的快速参考,请查看jwt.io 中的 Libraries 部分。
在大多数情况下,首选使用现有库,但是,对库的质量进行一些评估也很重要。
对于 JWT 签名验证,请阅读这篇文章 (Critical vulnerabilities in JSON Web Token libraries) 以确保您对库的使用不会导致可能的漏洞。
更新:
令牌不同,因为它们使用不同的密钥签名,并且有效负载也不同; iss
一个是"https://lowie.eu.auth0.com/"
,另一个是"https:\/\/lowie.eu.auth0.com\/"
。您可以通过使用 Base64 解码器解码有效负载并查看原始输出来检查这一点。
更重要的是,您不应该创建任何令牌,而只是验证它们是有效的并且是由您委派实际身份验证过程的受信任颁发者颁发的。
【讨论】:
我用的是firebase的,Auth0没有具体的,请看更新的问题 JWT 是一个标准,因此任何符合您技术选择的兼容库都可以。 我理解有效负载问题,尽管我使用的密钥是正确的并且直接从 auth0 复制。您确定密钥不正确吗? 我关于不同键的陈述纯粹是基于使用您包含在 sn-p 中的键观察 jwt.io 中的行为。其中一个令牌被标记为有效,而另一个则不是这样假设它使用了不同的密钥。让我再说一遍,我可能搞砸了。 尽管选择了相同的密钥,但它仍然标记第二个令牌无效;但是,如果您确定使用相同的密钥,这可能是一个错误。尝试查看有效负载差异,它最终可能会解决签名差异,这意味着 jwt.io 中的这种行为是一个错误。以上是关于PHP中的Auth0 JWT令牌验证的主要内容,如果未能解决你的问题,请参考以下文章
Auth0 - 在 Owin 上使用带有承载访问令牌的 JWT 使用 RS256 进行身份验证
通过 AWS EC2 上的 Docker 容器发布时,Auth0 OWIN API 未验证 JWT 令牌
Auth0 + Swashbuckle .Net Core 2.2。使用 SwaggerUI 时 jwt 令牌中缺少声明