服务器端基于JSON的Web令牌验证流程

11

我正在尝试理解Web令牌的概念(具体来说是JSON Web令牌)。然而,我找不到任何关于服务器如何验证令牌的信息。

A = 客户端
B = 服务器

流程如下:

1)A -> B:客户端发送用户名和密码
2)B:服务器检查它们与数据库记录是否匹配,并创建一个签名,使用base64UrlEncode(header).base64Url(payload), #secret# 首先生成签名,然后使用:signature.payload.secret 生成令牌
3)A <- B:服务器将令牌发送回客户端
4)A -> B:客户端在标头中发送请求以访问特定URL,带有令牌
5)B:服务器解码标头和载荷,使用#secret#创建另一个数字签名并将其与发送的内容进行比较以确保完整性


如果上述流程正确,则引发以下问题:

1)它是否包含SSL?如果没有,任何人都可以劫持令牌并将其发送到服务器,从而冒充客户端
2)在第5步中,仅对完整性进行了检查,从令牌中解密出的有效负载数据未经过验证(例如用户名),是否应进行验证或一旦确认完整性,我们可以确定令牌有效,并且应用程序可以授予客户端访问权限?
3)#secret#只有服务器知道并且仅用于验证有效负载未被篡改吗?我认为是这样的,否则用户冒充可能会发生。

1个回答

8
您所描述的流程是正确的。您已经基本回答了自己的问题。
1)它是否有SSL保护?如果没有,任何人都可以劫持令牌并将其发送到服务器,从而冒充客户端。
是的,它是有SSL保护的,令牌必须受到保护,因为它是身份验证的证明。它应该只通过SSL/TLS连接进行交换。
2)在第5步中,仅检查完整性,从令牌解密的有效载荷数据未与DB(例如用户名)进行验证,应该进行验证,否则一旦确认完整性,我们就可以确定令牌是有效的,应用程序可以授予客户端访问权限吗?
令牌使用服务器的秘密密钥签名,因此任何更改都将被服务器检测到并且令牌将被拒绝。如果验证成功,则可以安全地使用有效负载。
3)#secret#只有服务器知道,并且仅用于验证有效负载未被篡改吗?我认为是这样,否则用户可能会冒充。
是的,秘密密钥必须是“secret”。如果您使用对称HMAC密钥,则用于创建和验证令牌,因此如果共享它,任何人都可以创建令牌。

服务器如何知道应该使用哪个用户的密钥? - Vikas Verma
3
@VikasVerma,服务器的密钥被使用。这并不涉及用户的密钥。 - pedrofb

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