一个空载荷的JWT令牌是如何工作的?

4
我正在使用 Snapchat API 尝试通过其 OAuth 流程登录应用程序。一旦用户通过 Snapchat 登录,我正在尝试反向工程(因为他们没有关于此的文档)如何获取某种唯一标识符,以便我可以将其与我的数据库中的本地用户关联起来。这是我以前在 Facebook 等平台上完成此操作的方式。用户通过 Facebook API 登录并获得访问令牌,我可以通过 Facebook API 提取用户的某种唯一 ID。
Snapchat API 仅允许您访问用户的显示名称和一些“externalId”,但我无法保证它不会改变。因此,我解码了 Snapchat 发给我的 JWT 令牌,并挑战了我对 JWT 令牌工作原理的理解。当我在 http://jwt.io 上解码令牌时,我看到负载为空,但是当调用https://kit.snapchat.com/v1/me端点时,该令牌有效。Snapchat 服务器如何识别我是谁?我一直认为 JWT 必须包括像 "sub" 这样的声明来标识用户。然后服务器可以使用该信息来知道我是谁。
在这种情况下,我的JWT负载为空,但上述端点仍然返回我的用户数据。这里发生了什么?当我的JWT令牌具有空负载时,服务器如何知道我是谁?对我来说,他们必须在服务器上存储我的JWT令牌的副本,这似乎不是使用JWT令牌的正确方式。也许我的理解非常错误。你有什么想法吗?
1个回答

4

JWS(签名令牌)的有效载荷可以被分离并通过其他方式传输给受众。

这个特性在规范的附录F中有描述。

使用JWS紧凑序列化模式(最常见的格式),令牌看起来像是THE_HEADER.THE_PAYLOAD.THE_SIGNATURE。使用分离的有效载荷时,它除了THE_PAYLOAD为空字符串外,与之相同:THE_HEADER..THE_SIGNATURE

签名验证与附加有效载荷时相同。接收方应该已经接收到有效载荷并重新创建完整的输入,即THE_HEADER.THE_PAYLOAD

关于Snapchat执行的身份验证,令牌的头参数(令牌的第一部分)中可以设置对分离的有效载荷的引用,从而允许Snapchat完全验证令牌。


我之前使用了Postman,只是用了同一个已解码但没有有效载荷的JWT,然后发送了HTTP请求时没有附加任何额外信息。 - Brad
我指的是令牌的头部,而不是请求的头部。 - Spomky-Labs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接