4

我目前正在将代码库移植到更多 RESTful 模式,以便我可以从单个 API 运行移动应用程序和 Web 应用程序。

我知道 laravel 5.3 现在实现了 Laravel Passport,但是我如何使用我自己的 API,即用户注册获取身份验证令牌/api 令牌,然后对服务器的每个请求都检查该令牌,到目前为止,我有以下内容我的 api 路线,

Route::group(['middleware' => 'auth:api'], function () {
    Route::get('classes', 'ClassController@index');
    Route::get('classes/{id}', 'ClassController@show');
    Route::post('classes', 'ClassController@create');
    Route::put('classes', 'ClassController@edit');
    Route::delete('classes', 'ClassController@destroy');
});

在我添加的 Http/kernal.php 中,

\Laravel\Passport\Http\Middleware\CreateFreshApiToken::class

到我的 $middleWareGroups 数组。

那么如何为我的用户生成身份验证密钥,即当他们登录时如何向该用户添加令牌?

4

2 回答 2

3

我正在为将来来到这里的用户回答这个问题,因为他们的 API 在尝试使用自己的 API 时响应“未经过身份验证”。

OP 问题:“那么我如何为我的用户生成身份验证密钥,即当他们登录时,我如何向该用户添加令牌?”

答:如果您通过 CreateFreshAPIToken 中间件使用自己的 API,则不需要生成特殊的身份验证密钥/令牌。身份验证是通过添加 CreateFreshApiToken 中间件时附加到您的响应中的“laravel_token”cookie 完成的。

当接收到带有此 cookie 发送的请求时,此嵌入令牌由护照解密。

对于按照文档中的所有步骤使用自己的 API 后仍然收到“未通过身份验证”消息的人:

如果 Laravel 中间件 Illuminate\Cookie\Middleware\EncryptCookies 没有为你的路由组定义,那么整个概念将不起作用文档未提供此信息。不过,这完全有道理。如果 cookie 从未加密,则无法解密 cookie,因此 Passport 提供的 TokenGuard 中总会出现 DecryptException。

这个中间件默认为所有请求配置,在你的 Kernel.php 中看起来像这样:

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
    ];
}

如果不是,您应该添加它。

希望我能帮助一些在几个小时后眼含泪水降落在这里的人。

于 2017-11-03T15:12:11.567 回答
0

要使用您自己的 api 和其他前端框架,您需要为每个 AJAX 请求添加一个请求标头:将标头 X-CSRF-TOKEN 设置为该页面的 CSRF 令牌。

例如:使用 Javascript

$.ajax({
    url: $url,
    headers:{'X-CSRF-TOKEN': Laravel.csrfToken},
    type: $type,
    dataType: $dataType,
    async: $async,
    data: $data,
});
于 2016-10-31T10:43:35.193 回答