【问题标题】:Laravel 5.3 consuming own APILaravel 5.3 使用自己的 API
【发布时间】:2017-01-22 19:49:00
【问题描述】:

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

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

【问题讨论】:

  • 看这个laracast它是免费的,它会解释一切,包括一个使用你自己的api的例子
  • 看那个,这让我到目前为止。从我的前端(不是 vue.js)我如何发送 api 请求。即我从哪里获得令牌或 cookie?
  • 你在前端有什么?
  • 已排序,登录时向 oauth 发出 POST 请求,我的令牌已返回!
  • 您能分享一下您是如何解决这个问题的吗?

标签: php laravel laravel-5 laravel-passport


【解决方案1】:

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

例如:使用 Javascript

$.ajax({
    url: $url,
    headers:{'X-CSRF-TOKEN': Laravel.csrfToken},
    type: $type,
    dataType: $dataType,
    async: $async,
    data: $data,
});

【讨论】:

    【解决方案2】:

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

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

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

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

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

    如果没有为您的路由组定义 Laravel 中间件 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,
        ];
    }
    

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

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

    【讨论】:

    猜你喜欢
    • 2017-06-04
    • 2017-01-26
    • 2018-12-24
    • 2017-01-19
    • 2017-01-29
    • 2017-01-18
    • 2017-06-06
    • 2017-06-01
    • 2017-01-27
    相关资源
    最近更新 更多