首先,抱歉我的英文不好
我已通过此命令创建了一个新项目:
laravel new blog
然后,我在博客项目中运行了make:auth
。
然后我尝试使用以下地址登录博客:
本地主机:8000 /登录
一切正常,我可以毫无问题地登录博客!
我还创建了用户表并添加了一些用户!
问题:
当我在主机上部署这个非常简单的项目时,问题就开始了。当这个项目部署在主机上并尝试登录时,它会让我:
TokenMismatchException in VerifyCsrfToken.php line 67:
这很奇怪,因为它适用于localhost,但不适用于Host!
到目前为止我尝试了什么:
我试图找出用户请求Token与会话中的令牌进行比较的位置。我发现在以下文件中有一个名为tokensMatch
的方法:
/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php
我修改了这个方法:
protected function tokensMatch($request)
{
$sessionToken = $request->session()->token();
$token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');
$myArray = [ // I added this line
'SessionToken' => $sessionToken,
'RequetedToken' => $token,
];
var_dump($myArray); // I added this line
die(); // I added this line
if (! $token && $header = $request->header('X-XSRF-TOKEN')) {
$token = $this->encrypter->decrypt($header);
}
if (! is_string($sessionToken) || ! is_string($token)) {
return false;
}
return hash_equals($sessionToken, $token);
}
所以,然后我尝试登录localhost,输出是这样的:
Array
(
[sessionToken] => YhfaZMkbEPwWdYmT4D1kyZeysEhFnltROvMgvRQh
[RequestedToken] => YhfaZMkbEPwWdYmT4D1kyZeysEhFnltROvMgvRQh
)
它显示请求的令牌和会话令牌相等,我可以成功登录。
然后我尝试登录主机,输出是这样的:
Array
(
[sessionToken] => GSXeJSwD1mVSQ5XwgbLjnIk3VfhT5GzsiijfE15e
[RequestedToken] => Nd540vhx5BDidQb2FwudHWRzkK65IIhjgEBcf9ur
)
正如您所看到的,请求的令牌和会话令牌是不同的!所以我无法登录它,这让我感到非常可怕TokenMismatchException
错误!
对我来说没有意义!我不明白为什么!
任何帮助都会非常感激
更新:
这是我的auth/login.blade.php
文件内容:
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">Login</div>
<div class="panel-body">
<form class="form-horizontal" role="form" method="POST" action="{{ url('/login') }}">
{{ csrf_field() }}
<div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}">
<label class="col-md-4 control-label">E-Mail Address</label>
<div class="col-md-6">
<input type="email" class="form-control" name="email" value="{{ old('email') }}">
@if ($errors->has('email'))
<span class="help-block">
<strong>{{ $errors->first('email') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}">
<label class="col-md-4 control-label">Password</label>
<div class="col-md-6">
<input type="password" class="form-control" name="password">
@if ($errors->has('password'))
<span class="help-block">
<strong>{{ $errors->first('password') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group">
<div class="col-md-6 col-md-offset-4">
<div class="checkbox">
<label>
<input type="checkbox" name="remember"> Remember Me
</label>
</div>
</div>
</div>
<div class="form-group">
<div class="col-md-6 col-md-offset-4">
<button type="submit" class="btn btn-primary">
<i class="fa fa-btn fa-sign-in"></i>Login
</button>
<a class="btn btn-link" href="{{ url('/password/reset') }}">Forgot Your Password?</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
答案 0 :(得分:0)
这很可能是因为您没有以正确的方式打开表单(请分享HTML),导致不发送令牌。
{!! Form::open(array('url' => 'foo/bar')) !!}
//
{!! Form::close() !!}
将CSRF令牌添加到表单Laravel提供了一种简单的方法 保护您的应用程序免受跨站点请求伪造。第一, 随机令牌放在用户的会话中。如果你使用 使用POST,PUT或DELETE CSRF令牌的Form :: open方法将是 自动添加到您的表单作为隐藏字段。或者,如果 您希望为隐藏的CSRF字段生成HTML,您可以使用 令牌方法:
echo Form :: token();