Laravel 5.3使用自己的API

时间:2016-09-14 21:38:35

标签: php laravel laravel-5 laravel-passport

我目前正在将代码库移植到更多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数组。

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

2 个答案:

答案 0 :(得分:3)

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

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

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

当收到发送此cookie的请求时,此嵌入式令牌将通过护照解密。

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

如果没有为您的路线组定义Laravel Middleware Illuminate \ Cookie \ Middleware \ EncryptCookies ,则整个概念将无效。 这些信息不是由文档提供的。这完全有道理。如果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,
    ];
}

如果不是,则应添加它。

希望我可以帮助一些人在他们的眼睛里流着眼泪来到这里。

答案 1 :(得分: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,
});