【问题标题】:TokenMismatchException for API in Laravel 5.2.31Laravel 5.2.31 中 API 的 TokenMismatchException
【发布时间】:2016-09-19 20:55:49
【问题描述】:

我在尝试什么?

我已经有一个网站,我正在尝试使用相同代码对 API 进行基于令牌的身份验证,下面是示例身份验证代码的开始

我创建的控制器下面是代码。

class AccountController extends \App\Http\Controllers\Controller
{
    public function apilogin($UserData) {
        return json_decode($UserData);
    }
}

我的路线配置如下。

Route::group(['prefix' => 'api/v1', 'middleware' => 'auth.api'], function () {
    Route::post('/apilogin', 'API\User\Account\AccountController@apilogin');
});

**然后从 Postman Chrome 扩展中,如果我在 Kernel.php 中的 $middlewareGroups 中评论以下行,我已经发布了请求并且工作正常

\App\Http\Middleware\VerifyCsrfToken::class,

如果我从 POSTMan Extension 发出 GET 请求,VerifyCsrfToken 没有问题

【问题讨论】:

  • 如果是,您是否在 config/auth.php 中设置了任何内容而不是显示?
  • 我没有在路由组中提到, 'middleware' => 'auth:api',因为我假设这条路由应该可供所有人访问并且不应该受到保护。我正在发送用户名和密码的发布请求以获取 api_token。可以吗?

标签: php laravel laravel-5 laravel-5.1 laravel-5.2


【解决方案1】:

打开您的app\http\Middleware\VerifyCsrfToken.php 文件。

在这里编辑$except 属性:

protected $except = [
  'api/*' 
];

这将从 CSRF 验证中排除您的 api 路由。

【讨论】:

  • 它非常适合我。 @pankaj,如果它对您有用,请将此标记为绿色。因为这是一个正确的答案。
  • 安全吗? @Abhishek
  • 是的,但是您应该为 API 请求使用一些令牌。这样您的 API 就不会被任何疯子滥用。
  • 禁用 CSRF 验证如何使其安全?
  • @Abhishek 你说是的。所以它是安全的。所以我才问为什么。
【解决方案2】:

在你的 route.php 中设置下面的代码

Route::group(['prefix' => API_PREFIX,'middleware' => 'auth.api'], function() 
{
 // Your Route
}

在中间件下方设置的 kernal.php 中,最好为 api 使用不同的中间件。

'auth.api' => \App\Http\Middleware\ApiAuthenticate::class,

添加新的中间件 ApiAuthenticate.php

class ApiAuthenticate
{
    public function handle($request, Closure $next, $guard = 'api')
    {
        if (\Auth::guard($guard)->guest()) {
            return response("Invalid user");
        }
        else {
            return $next($request);  
        }
        return $next($request);
    }
}

也要检查你的 get 和 post 方法

【讨论】:

  • 我更新了问题。请检查。我仍然面临同样的问题。
  • 如果我从我的网页进行身份验证,它可以完美运行。现在问题在于基于令牌的 API 身份验证。
  • 你的中间件有什么东西吗?我接受你不能得到用户名?
  • 对不起。您能详细解释一下您的查询吗?
  • 当你在 ApiAuthenticate 中进行 print_r(Input::all()) 调试时你得到了什么;
【解决方案3】:

TokenMismatchException 通常发生在 csrf 令牌不存在于表单中或 csrf 令牌过期或篡改 csrf 令牌时。

第一:

确保您在表单中添加

<input type="hidden" name="_token" value="{{ csrf_token() }}">

或者

清除尝试并清除视图文件的缓存

或者

检查流中是否有任何重定向

最后如果一切都失败了,如果你想自定义这个错误。您可以在 hanlers 中处理此错误。检查[this][1]

【讨论】:

  • 这是关于 API 的。如果您看到我的 Controller 操作方法,它会为 post 请求返回 JSON 数据。
  • 据我所知,tokenmismtach 错误只会在请求调用时发生。它与返回的内容无关。
  • 我正在发布来自 Postman Chrome 扩展程序的数据。我这样做是因为我正在开发 Android 以与 Laravel 进行 API 交互。
  • 哦,尝试删除身份验证中间件进行登录和注册。对于这两个,您没有授权令牌。
猜你喜欢
  • 2017-08-31
  • 2015-03-12
  • 2015-10-04
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
  • 2017-03-28
相关资源
最近更新 更多