我试图理解网络令牌的概念(json网络令牌是具体的)。但是,我无法找到有关如何在服务器上验证令牌的任何信息。
A =客户B1
B =服务器
流程:
1)A - > B:客户端发送用户名和密码
2)B:服务器根据DB记录检查它们,如果它们匹配则创建;首先,签名使用:base64UrlEncode(header).base64Url(payload), #sese#然后令牌使用:signature.payload.secret
3)A< -B:服务器将令牌发送回客户端
4)A - > B:客户端发送请求以使用标头中的令牌访问某个URL
5)B:服务器解码标头和有效负载,使用 #sese#创建另一个数字签名,并将其与发送的内容进行比较,以确保完整性
/ p>
如果以上流程正确,则会出现以下问题:
1)它周围是否有SSL?如果没有人可以劫持令牌并将其发送到服务器并且用户冒充客户端
2)在步骤5中,仅检查完整性,从令牌解密的有效载荷数据未针对DB验证(例如用户名),如果验证或一旦确认完整性,我们可以确定令牌有效且应用程序可以授予访问客户端?
3) #secret#仅为服务器所知,并且仅用于验证有效负载是否未被篡改?我这样假设,否则可能会发生用户模仿。
答案 0 :(得分:1)
您描述的流程是正确的。你几乎回答了自己的问题。
1)它周围是否有SSL?如果没有人可以劫持令牌并将其发送到服务器并且用户冒充客户端
是的,必须保护令牌,因为它是身份验证证明。它只能通过SSL / TLS连接进行交换
2)在步骤5中,仅检查完整性,从令牌解密的有效载荷数据未针对DB验证(例如用户名),如果验证或确认完整性后我们可以确定令牌有效且应用程序可以授予客户端访问权限吗?
令牌使用服务器的密钥签名,因此服务器将检测到任何更改,并且令牌将被拒绝。如果验证成功,您可以安全地使用有效负载。
3)#secret#仅为服务器所知,仅用于验证有效负载是否未被篡改?我猜是这样,否则可能会发生用户模仿
是的,密钥必须是“秘密”。如果您使用对称HMAC密钥,它用于创建和验证令牌,因此如果您共享它,任何人都可以创建令牌