如何在 lumen 5.8.* 中使用 dingo 修复实现 jwt?目标 [Dingo\Api\Contract\Routing\Adapter] 不可实例化

Posted

技术标签:

【中文标题】如何在 lumen 5.8.* 中使用 dingo 修复实现 jwt?目标 [Dingo\\Api\\Contract\\Routing\\Adapter] 不可实例化【英文标题】:How to fix implementation jwt with dingo in lumen 5.8.*? Target [Dingo\Api\Contract\Routing\Adapter] is not instantiable如何在 lumen 5.8.* 中使用 dingo 修复实现 jwt?目标 [Dingo\Api\Contract\Routing\Adapter] 不可实例化 【发布时间】:2019-09-09 21:54:21 【问题描述】:

我已经在我的 Lumen(5.8.4) 应用程序中将 tymon/jwt-auth 版本 1.0.0-rc4.1 实现为第三方,现在当我继续在 https://github.com/dingo/api/wiki/Authentication 之后使用 Dingo 实现身份验证时需要添加这个(或任何其他方式向 dingo 注册 jwt)

app('Dingo\Api\Auth\Auth')->extend('jwt', function ($app) 
   return new Dingo\Api\Auth\Provider\JWT($app['Tymon\JWTAuth\JWTAuth']);
);

到 app.php 我得到这个错误

错误:目标 [Dingo\Api\Contract\Routing\Adapter] 在构建 [Dingo\Api\Auth\Auth, Dingo\Api\Routing\Router] 时不可实例化。

我想我已经搜索并尝试了互联网上存在的关于这个主题的所有东西,因为我正在研究它 2 天,其中大多数都使用旧版本的 dingo 和/或 Lumen。我还尝试了我在 git 上找到的不同适配器,但它们都不起作用。

这是我的设置: 作曲家.json:

"require": 
        "php": ">=7.1.3",
        "dingo/api": "^2",
        "flipbox/lumen-generator": "^5.6",
        "laravel/lumen-framework": "5.8.*",
        "nesbot/carbon": "^2.17",
        "tymon/jwt-auth": "1.0.0-rc4.1",
        "vlucas/phpdotenv": "^3.3"
    

app.php

app('Dingo\Api\Auth\Auth')->extend('jwt', function ($app) 
    return new Dingo\Api\Auth\Provider\JWT($app['Tymon\JWTAuth\JWTAuth']);
); <- this makes problem, without this everything works, I even get jwt in postman

$app->register(Tymon\JWTAuth\Providers\LumenServiceProvider::class);
$app->register(Dingo\Api\Provider\LumenServiceProvider::class);
$app->register(App\Providers\AppServiceProvider::class);
$app->register(App\Providers\AuthServiceProvider::class);

有人在较新版本上进行过实施,或者有更好的方法吗? 我尝试了一个工作示例 https://github.com/krisanalfa/lumen-jwt 但我看到上次更新是 2 年前,Lumen 版本是 5.4。 我应该使用它还是不推荐使用它?

【问题讨论】:

【参考方案1】:

好的,我终于让它工作了。如果有人遇到同样的问题,我已经在 AppServiceProvider 中注册了

use Dingo\Api\Auth\Provider\JWT;

和在同一个文件中的启动方法:

public function boot()
    
        Schema::defaultStringLength(191);

        app('Dingo\Api\Auth\Auth')->extend('jwt', function ($app) 
   return new JWT($app['Tymon\JWTAuth\JWTAuth']);
);
    

在 auth.php 中

  'defaults' => [
        'guard' => env('AUTH_GUARD', 'api'),
    ],

    'guards' => [
        'api' => [
            'driver' => 'jwt',
            'provider' => 'users'
        ],
    ],

在 jwt.php 中

 'providers' => [

        'jwt' => Tymon\JWTAuth\Providers\JWT\Lcobucci::class,

        'auth' => Tymon\JWTAuth\Providers\Auth\Illuminate::class,

        'storage' => Tymon\JWTAuth\Providers\Storage\Illuminate::class,
    ],

然后保护路由,例如:

 $api->group(['middleware' => 'api.auth'], function ($api) 
        $api->get('/users', 'App\Http\Controllers\UserController@index');
    );

另外,请注意,如果您遇到异常“无法验证令牌签名”,请在通过 POSTMAN 发送 jwt 时删除引号 :)

最好的问候。

【讨论】:

以上是关于如何在 lumen 5.8.* 中使用 dingo 修复实现 jwt?目标 [Dingo\Api\Contract\Routing\Adapter] 不可实例化的主要内容,如果未能解决你的问题,请参考以下文章

如何用流明5.8中的dingo修复实现jwt。*?目标[Dingo Api Contract Routing Adapter]不可实例化

laravel 路由 Dingo结合使用

lumen 开启调试模式,关闭debug输出,只保留数据验证提示

Lumen手记:register与boot

未定义身份验证保护驱动程序 [api]。流明、野狗、JWTAuth

Lumen (5.8.12) - 带前缀的多个可选参数