1

我正在尝试学习如何使用 Laravel Sanctum 身份验证。当我发送时,GET https://localhost/sanctum/csrf-cookie我得到以下 CSRF cookie:

XSRF-TOKEN=eyJpdiI6Inhvb0FDVXdHZDU5QzBqQTNKaWNxTUE9PSIsInZhbHVlIjoiSXNudjNiNE9xbmtNVWdsQ0l2SDRyYUNPQXIrTGJLb2ZMVDc2NWttenZGY0NkcDRvQzFVQlZOMDRlNFdTOHJaNiIsIm1hYyI6ImY0Y2M2YzZiZWIxYWVmZTRmMWI5NWRhNTBhN2JmM2VjNGExYjU0MGYwYWVmYTE4ODQxM2I0YTFlMWVjZTVhMDkifQ%3D%3D; 

您可以注意到令牌末尾的奇怪 %3D%3D。这些字符也添加到我的 laravel_session cookie 中。然后,当我在标头 X-XSRF-TOKEN 中发回带有此确切令牌的请求时,我收到令牌不匹配错误。当我删除字符时 - 一切正常。我想知道这些字符是从哪里来的,我该如何删除它们。

UPD:因为这些是编码的 URL 字符,所以当我将它们解码并将 '==' 而不是放在 X-XSRF-TOKEN 的末尾时,这似乎是有效的。尽管如此,奇怪的是为什么它在我手动从查询中删除字符之前起作用。

4

2 回答 2

0

是的,这代表=你的 base64'ed CSRF 令牌的一部分的符号。我猜它仅在您删除它时才有效,因为该=符号是特殊的填充字符。在非常高的水平上,他们只是将字符串填充到适当的长度。

于 2020-04-26T11:23:21.880 回答
0

如您所知,当它被 url 编码时就=变成了。%3D

通常,当您遇到一个包含大量数字和随机顺序字符的字符串时,它的结尾==很有可能是用 base64 编码的。

=添加(在字符串的末尾)作为填充以匹配字符串中特定数量的字符。您可以在此答案中阅读更多相关信息。

为了回答您的问题,我将尝试==在最后使用和不使用给定令牌进行解码,我将使用此在线解码器,因此您也可以在最后尝试。

==

{"iv":"xooACUwGd59C0jA3JicqMA==","value":"Isnv3b4OqnkMUglCIvH4raCOAr+LbKofLT765kmzvFcCdp4oC1UBVN04e4WS8rZ6","mac":"f4cc6c6beb1aefe4f1b95da50a7bf3ec4a1b540f0aefa188413b4a1e1ece5a09"}

没有==

{"iv":"xooACUwGd59C0jA3JicqMA==","value":"Isnv3b4OqnkMUglCIvH4raCOAr+LbKofLT765kmzvFcCdp4oC1UBVN04e4WS8rZ6","mac":"f4cc6c6beb1aefe4f1b95da50a7bf3ec4a1b540f0aefa188413b4a1e1ece5a09"}

他们是一样的。

它之所以有效,是因为它们 ( =) 只是填充并且它们不包含任何信息。

我不是 laravel 专家,但我猜它不起作用的原因%3D是因为它没有解码 url。

于 2020-04-26T11:38:56.493 回答