Laravel 护照(看不懂)

Posted

技术标签:

【中文标题】Laravel 护照(看不懂)【英文标题】:Laravel passport ( can`t understand) 【发布时间】:2018-09-09 08:11:40 【问题描述】:

我读了很多关于 Laravel 护照的文章和视频,但还是看不懂。

我有一个适用于 Laravel 5.5 + vueJs 的应用程序。所有到后端的请求都是通过 axios 发送的。我所有的路线都位于 api.php

Route::middleware('api')->group(function()

    Route::get('/prepare/', 'CompgenApiController@prepareDefault');

    Route::post('/replace/', 'CompgenApiController@replaceImage');

    Route::get('/replaceall/', 'CompgenApiController@replaceAllImages');

    Route::get('/collage/', 'CompgenApiController@collage'); //@todo переделать на POST

    Route::get('/generate/', 'CompgenApiController@generate');

    Route::post('/upload/', 'CompgenApiController@userUpload');

    Route::post('/reupload/', 'CompgenApiController@moderationReupload');

);

我还有一个 VK 机器人,可以向相同的路由发送请求。 目前我有一些困难。对于某些路由,我需要检查用户是否被授权(但这是一个可选条件),如果是,我需要将用户 ID 写入数据库。对我来说,这是一个惊喜

授权::检查

虽然我被授权,但返回 false。经过一番搜索,我了解到授权后启动的会话没有与 API 连接,建议我使用 Passport。我无法理解以下内容

    如果我的应用程序从 vueJs 发送请求,我是否需要使用护照?

    如何注册用户?我必须为每个新用户颁发我的令牌吗?

    如何验证用户是否获得授权?

    在某些情况下,我需要检查用户是否已获得授权,但如果不是,请不要干扰请求。我该怎么做?

也许就我而言,我根本不需要护照?

【问题讨论】:

【参考方案1】:

Passport 是一个 oAuth2 服务器实现,本质上,它允许您通过在每个请求中传递一个令牌来对用户进行身份验证。如果您不想对用户进行身份验证,则无需传递令牌,护照也不会参与其中。

Laravel 应用而言,如果您从自己的前端使用API​​,您可能只想使用implicit grant。以下是您的设置方式:

1) 安装passport并将PassportServiceProvider添加到config/app.php

2) php artisan migrate 设置护照迁移

3) php artisan passport:install - 设置您的 oAuth 服务器

4) 在 User 模型中添加 Laravel\Passport\HasApiTokens 特征,如下所示:

namespace App;

use Laravel\Passport\HasApiTokens;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable

    use HasApiTokens, Notifiable;
    // Other model methods

5) 通过将以下内容添加到您的app\Providers\AuthServiceProviders.phpboot 方法来设置护照路线:

\Laravel\Passport\Passport::routes();

6) 将config/auth.php 中的api driver 更改为token

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

这设置了护照,现在您需要做的就是让您的应用使用您的 api 将 CreateFreshApiToken 中间件添加到 web 中的 app/Http/Kernel.php 中,它处理所有令牌逻辑:

'web' => [
    // ..Other middleware...
    \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class,
],

现在保护路由所需要做的就是在该路由上使用 auth:api 中间件:

Route::middleware('auth:api')->get('/profile','Api\UsersController@edit');

应该一切正常,但您还需要注册一个新用户。你所要做的就是像往常一样将身份验证路由添加到web.php

Route::post('/login', 'Auth\LoginController@login');
Route::post('/logout', 'Auth\LoginController@logout');
Route::post('/register', 'Auth\RegisterController@register');

然后,您可以简单地向这些路由发出 post 请求,Laravel 将为您处理所有令牌内容。

处理需要身份验证的 api 路由,但是,您还提到要检查用户是否经过身份验证,但不一定锁定路由,您可以简单地使用:

Auth::guard('api')->user();

这将获得经过身份验证的用户,因此您可以执行以下操作:

public function getGreeting()
  $user = Auth::guard('api')->user();

  if($user !== null) 
    return response()->json(["message" => "Hello $user->name"], 200);
  

  return response()->json(["message" => "Hello Guest"], 200);

就是这样。希望我已经涵盖了那里的所有内容。

【讨论】:

先生,中间件 CreateFreshApiToken 每次请求都会生成令牌。在移动应用程序上如何通过身份验证访问 api? @Beginner 您需要为您的用户生成一个令牌,然后将其发送到请求的标头中。你可以找到更多关于in the protecting routes section of the docs 在 laravel 中,中间件创建一个令牌并使用该令牌向 api 发出请求。在移动应用程序上,我在哪里/如何获得该令牌?我怎样才能生成它? @Beginner 在文档的Issuing Access Tokens section 中,您可能需要Password Grant CreateFreshApToken 通常在你的 Laravel 前端需要与你的 Laravel API 通信时使用,这通常在创建 SPA 时使用,它只是一种避免整个 oAuth 流程的便捷方式,所有你的用户所做的是登录,其余的由 laravel 处理。 Here's that section of the docs

以上是关于Laravel 护照(看不懂)的主要内容,如果未能解决你的问题,请参考以下文章

用于生成的 Laravel 护照令牌

使用外部 Laravel 护照流明 api 进行 Laravel 客户端身份验证

如何使用 Chrome 扩展程序获取 Laravel 护照令牌?

Laravel 护照 404

Laravel 护照范围

未找到 Laravel 护照迁移