Laravel Cookie 奇怪的行为 - 总是设置相同的值
Laravel Cookies weird behaviour - always sets the same value
我在 Laravel 5.6 中设置 cookie 时遇到问题。我目前正在使用 Facebook 登录,除了访问令牌无法正确存储在 Cookie 中之外,一切都按预期工作。出于某种原因,它一直存储一个我不熟悉的值,我不明白为什么。
为了对此进行测试,我修改了我的回调函数以设置测试 cookie,并且发生了相同的行为。
这是我正在调用的路线:
Route::get('{provider}/callback', 'Auth\LoginController@handleProviderCallback');
这是我的 handleProviderCallback 方法:
public function handleProviderCallback(string $provider)
{
Cookie::queue(Cookie::make('fb', 'test', 1000, '/', config('session.domain'), config('session.secure'), config('session.http_only')));
return redirect('/');
}
这是随后设置为 fb
的 cookie:
eyJpdiI6IkFROTRzU2ZhTGQwXC9DOHZoR3lqVDZnPT0iLCJ2YWx1ZSI6ImpqWE8wSVpDRzBzT1p2WGxPdE5pYlE9PSIsIm1hYyI6IjA5NzYxODQ0MmFkZmE2NDQ1YmU5Zjg2Y2NmNjU1N2RhZmVmNjcxZjJmYjhmZmViMWEwZGU5NTE5ZDYxMWY2ZjAifQ==
当然,我已经使用实际值进行了尝试,这就是为什么我现在恢复到仅测试值以查看发生了什么的原因。我已经尝试清除所有 cookie 和缓存,并在 Chrome 和 Safari 中都尝试过。
为什么它总是设置一个 eyJ... 值而不是我告诉它的值?
Laravel 默认情况下使用 App\Http\Middleware\EncryptCookies
对所有 cookie 进行加密和 base64 编码,因此当您对字符串进行 base64 解码时,您将得到
{"iv":"AQ94sSfaLd0\/C8vhGyjT6g==","value":"jjXO0IZCG0sOZvXlOtNibQ==","mac":"097618442adfa6445be9f86ccf6557dafef671f2fb8ffeb1a0de9519d611f6f0"}
这是加密的数据,实际上只有jjXO0IZCG0sOZvXlOtNibQ==
是加密的,其余只是用于APP_KEY
解密的元数据。
另外值jjXO0IZCG0sOZvXlOtNibQ==
是base64编码的,解码后得到5ІBKf:bm
,这是真正的加密值。
Note: eyJ
base64 decoded is {"
which is beginning of JSON.
您可以在这个答案 中阅读更多关于应用程序密钥/Laravel 的加密。
您可以通过设置 $except = ['fb']
在 App\Http\Middleware\EncryptCookies
中间件中为 testing(我的意思是调试)禁用加密,或者只是从 [=37] 中删除中间件=](将其注释掉!,稍后在生产中取消注释)。
我在 Laravel 5.6 中设置 cookie 时遇到问题。我目前正在使用 Facebook 登录,除了访问令牌无法正确存储在 Cookie 中之外,一切都按预期工作。出于某种原因,它一直存储一个我不熟悉的值,我不明白为什么。
为了对此进行测试,我修改了我的回调函数以设置测试 cookie,并且发生了相同的行为。
这是我正在调用的路线:
Route::get('{provider}/callback', 'Auth\LoginController@handleProviderCallback');
这是我的 handleProviderCallback 方法:
public function handleProviderCallback(string $provider)
{
Cookie::queue(Cookie::make('fb', 'test', 1000, '/', config('session.domain'), config('session.secure'), config('session.http_only')));
return redirect('/');
}
这是随后设置为 fb
的 cookie:
eyJpdiI6IkFROTRzU2ZhTGQwXC9DOHZoR3lqVDZnPT0iLCJ2YWx1ZSI6ImpqWE8wSVpDRzBzT1p2WGxPdE5pYlE9PSIsIm1hYyI6IjA5NzYxODQ0MmFkZmE2NDQ1YmU5Zjg2Y2NmNjU1N2RhZmVmNjcxZjJmYjhmZmViMWEwZGU5NTE5ZDYxMWY2ZjAifQ==
当然,我已经使用实际值进行了尝试,这就是为什么我现在恢复到仅测试值以查看发生了什么的原因。我已经尝试清除所有 cookie 和缓存,并在 Chrome 和 Safari 中都尝试过。
为什么它总是设置一个 eyJ... 值而不是我告诉它的值?
Laravel 默认情况下使用 App\Http\Middleware\EncryptCookies
对所有 cookie 进行加密和 base64 编码,因此当您对字符串进行 base64 解码时,您将得到
{"iv":"AQ94sSfaLd0\/C8vhGyjT6g==","value":"jjXO0IZCG0sOZvXlOtNibQ==","mac":"097618442adfa6445be9f86ccf6557dafef671f2fb8ffeb1a0de9519d611f6f0"}
这是加密的数据,实际上只有jjXO0IZCG0sOZvXlOtNibQ==
是加密的,其余只是用于APP_KEY
解密的元数据。
另外值jjXO0IZCG0sOZvXlOtNibQ==
是base64编码的,解码后得到5ІBKf:bm
,这是真正的加密值。
Note:
eyJ
base64 decoded is{"
which is beginning of JSON.
您可以在这个答案
您可以通过设置 $except = ['fb']
在 App\Http\Middleware\EncryptCookies
中间件中为 testing(我的意思是调试)禁用加密,或者只是从 [=37] 中删除中间件=](将其注释掉!,稍后在生产中取消注释)。