php - 如何在 lumen 5.8.* 中使用 dingo 修复实现 jwt?目标 [Dingo\Api\Contract\Routing\Adapter] 不可实例化
问题描述
我已经在我的 Lumen(5.8.4) 应用程序中将 tymon/jwt-auth 版本 1.0.0-rc4.1 实现为第三方,现在当我继续按照https://github.com/dingo/使用 Dingo 实现身份验证时api/wiki/Authentication在我需要添加它的步骤(或任何其他方式向 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 上找到的不同适配器,但它们都不起作用。
这是我的设置:composer.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"
}
应用程序.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。我应该使用它还是不推荐使用它?
解决方案
好的,我终于让它工作了。如果有人遇到同样的问题,我接下来会在 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 时删除引号 :)
此致。
推荐阅读
- java - 如何用 Jackson 编写扁平化列表反序列化器?
- node.js - 谷歌驱动器更新图像中的 Node.js:错误:未授权客户端
- java - 在 couchbase 集群中添加节点后,Couchbase 客户端抛出 TimeoutException
- c++ - 使用从 B 继承的具体函数实现从 A 继承的虚函数
- c++ - 在 C 或 C++ 中从 X11 合成 WM 请求图像
- javascript - 通过函数确定负责函数调用的元素 ID。没有jQuery
- javascript - 为一个元素指定多个最大宽度值
- python-3.x - 如何为本地文件设置 X-Frame-Options
- python - 配置 Tkinter 消息以在单独的行上显示元组
- r - 如何在连接之前识别两个数据帧之间的不匹配 ID?