Lumen8 + dingoapi +jwt获取个人信息提示"Failed to authenticate because of bad credentials or an invalid authorization header.
1. 运行环境
Windows phpstudy_pro. -> Apache + php +Mysql
1). 当前使用的 Laravel 版本?
Laravel Framework Lumen (8.3.4) (Laravel Components ^8.0)
2). 当前使用的 php/php-fpm 版本?
PHP 版本:7.4.3
3). 当前系统
Windows11
4). 业务环境
开发环境 没有使用负载均衡
5). 相关软件版本
Mysql5.7
2. 问题描述?
Lumen8 + dingoapi +jwt 在登录注册的时候是可以正常登录注册 获取信息的时候报错
看官方文档下laravel在config下面是有api.php配置文件的 lumen好像直接注册就可以
New:我后来尝试在 config/创建了api.php 并尝试讲
<?php
return [
'auth' => [
'jwt' => 'Dingo\Api\Auth\Provider\JWT',
],
];
放入api.php文件
请求时报错
Argument 1 passed to Dingo\Api\Http\Middleware\Request::setMiddlewares()
其实我也不知道lumen中是否真正用到这个api.php文件
3. 代码
bootstrap/app.php如下
<?php
require_once __DIR__ . '/../vendor/autoload.php';
(new Laravel\Lumen\Bootstrap\LoadEnvironmentVariables(
dirname(__DIR__)
))->bootstrap();
date_default_timezone_set(env('APP_TIMEZONE', 'UTC'));
/*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------
|
| Here we will load the environment and create the application instance
| that serves as the central piece of this framework. We'll use this
| application as an "IoC" container and router for this framework.
|
*/
$app = new Laravel\Lumen\Application(
dirname(__DIR__)
);
$app->withFacades();
$app->withEloquent();
/*
|--------------------------------------------------------------------------
| Register Container Bindings
|--------------------------------------------------------------------------
|
| Now we will register a few bindings in the service container. We will
| register the exception handler and the console kernel. You may add
| your own bindings here if you like or you can make another file.
|
*/
$app->singleton(
Illuminate\Contracts\Debug\ExceptionHandler::class,
App\Exceptions\Handler::class
);
$app->singleton(
Illuminate\Contracts\Console\Kernel::class,
App\Console\Kernel::class
);
/*
|--------------------------------------------------------------------------
| Register Config Files
|--------------------------------------------------------------------------
|
| Now we will register the "app" configuration file. If the file exists in
| your configuration directory it will be loaded; otherwise, we'll load
| the default version. You may register other files below as needed.
|
*/
$app->configure('app');
// jwt 配置文件
$app->configure('jwt');
/*
|--------------------------------------------------------------------------
| Register Middleware
|--------------------------------------------------------------------------
|
| Next, we will register the middleware with the application. These can
| be global middleware that run before and after each request into a
| route or middleware that'll be assigned to some specific routes.
|
*/
// $app->middleware([
// App\Http\Middleware\ExampleMiddleware::class
// ]);
$app->routeMiddleware([
'auth' => App\Http\Middleware\Authenticate::class,
]);
/*
|--------------------------------------------------------------------------
| Register Service Providers
|--------------------------------------------------------------------------
|
| Here we will register all of the application's service providers which
| are used to bind services into the container. Service providers are
| totally optional, so you are not required to uncomment this line.
|
*/
//$app->register(App\Providers\AppServiceProvider::class);
$app->register(App\Providers\AuthServiceProvider::class);
// $app->register(App\Providers\EventServiceProvider::class);
$app->register(\Dingo\Api\Provider\LumenServiceProvider::class);
// jwt注册
$app->register(\Tymon\JWTAuth\Providers\LumenServiceProvider::class);
/*
|--------------------------------------------------------------------------
| Load The Application Routes
|--------------------------------------------------------------------------
|
| Next we will include the routes file so that they can all be added to
| the application. This will provide all of the URLs the application
| can respond to, as well as the controllers that may handle them.
|
*/
$app->router->group([
'namespace' => 'App\Http\Controllers',
], function ($router) {
require __DIR__ . '/../routes/web.php';
require __DIR__ . '/../routes/api.php';
});
return $app;
routes/api.php
<?php
$api = app('Dingo\Api\Routing\Router');
$api->version('v1', [
'namespace' => 'App\Http\Controllers\v1',
// each route have a limit of 20 of 1 minutes
'limit' => 1000, 'expires' => 1,
], function ($api) {
// Auth
$api->group(["prefix" => 'auth'], function ($api) {
$api->post('/login', 'UserController@login');
$api->post('/store', 'UserController@store');
// need authentication
$api->group(['middleware' => 'api.auth'], function ($api) {
$api->get('/me', 'UserController@me');
$api->post('/refresh', 'UserController@update');
$api->post('/logout', 'UserController@destroy');
});
});
});
$api->version('v2', ['namespace' => 'App\Http\Controllers\v2'], function ($api) {
$api->get('hello', 'HelloWorldController@index');
});
//// 创建用户和登录
//$api->group([
// 'prefix' => 'auth',
//], function () use ($api) {
// $api->post('/store', 'UserController@store');
// $api->post('/login', 'UserController@login');
// $api->get('/user', 'UserController@index');
// $api->get('/me', 'UserController@me');
// $api->get('/logout', 'UserController@logout');
//});
UserController.php代码如下
<?php
namespace App\Http\Controllers\v1;
use App\Exceptions\Code;
use App\Exceptions\Msg;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* UserController constructor.
* 认证中间件,排除登录和注册
*/
public function __construct()
{
$this->middleware('auth:api', ['except' => ['login', 'store', 'index']]);
}
/**
* @return \Illuminate\Http\JsonResponse
* 所有用户
*/
public function index()
{
$users = User::paginate(env('PAGINATE'));
return resp(Code::Success, Msg::Success, $users);
}
/**
* @param Request $request
* @return \Illuminate\Http\JsonResponse
* 登录
*/
public function login(Request $request)
{
$message = [
'username.required' => "请输入用户名",
'password.required' => "请输入密码",
];
$validator = Validator::make($request->all(), [
'username' => 'required',
'password' => 'required'
], $message);
if ($validator->fails()) {
foreach ($validator->errors()->getMessages() as $error) {
return resp(Code::LoginFailed, $error[0]);
}
}
$credentials = request(['username', 'password']);
if (!$token = auth()->attempt($credentials)) {
return resp(Code::LoginFailed, Msg::LoginFailed);
}
return resp(Code::LoginSuccess, Msg::LoginSuccess, $this->responseWithToken($token));
}
/**
* @param $token
* @return array
* 返回token信息
*/
protected function responseWithToken($token)
{
return [
'access_token' => $token,
'token_type' => 'bearer',
'expires_in' => auth()->factory()->getTTL() * env('JWT_TTL')
];
}
/**
* @param Request $request
* @return \Illuminate\Http\JsonResponse
* 创建用户
*/
public function store(Request $request)
{
$message = [
'email.required' => '请输入邮箱',
'email.email' => '邮箱格式不正确',
'email.unique' => '邮箱已存在',
'username.required' => '请输入用户名',
'password.required' => '请输入密码',
'username.min' => '用户名至少 :min 位',
'password.min' => '密码至少 :min 位',
];
$validator = Validator::make($request->input(), [
'email' => 'required|email|unique:users',
'username' => 'required|min:6',
'password' => 'required|min:6',
], $message);
if ($validator->fails()) {
foreach ($validator->errors()->getMessages() as $error) {
return resp(Code::CreateUserFailed, $error[0]);
}
}
$username = $request->get('username');
$email = $request->get('email');
$password = $request->get('password');
$attributes = [
'email' => $email,
'username' => $username,
'password' => app('hash')->make($password)
];
//dd($attributes);
$user = User::create($attributes);
return resp(Code::CreateUserSuccess, Msg::CreateUserSuccess, $user);
}
/**
* @return \Illuminate\Http\JsonResponse
* 当前用户信息
*/
public function me()
{
return resp(Code::UserIsMe, Msg::UserIsMe, auth()->user());
}
/**
* @return \Illuminate\Http\JsonResponse
* 退出登录
*/
public function logout()
{
auth()->logout();
return resp(Code::LoginOutSuccess, Msg::LoginOutSuccess);
}
/**
* @return array
* 刷新token
*/
public function refresh()
{
return $this->responseWithToken(auth()->refresh());
}
}
4. 您实际得到的结果?
报错信息如下,刚刚登录的jwt返回的token就提示错误
{"message":"Failed to authenticate because of bad credentials or an invalid authorization header.","status_code":401,"debug":{"line":113,"file":"D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\dingo\\api\\src\\Auth\\Auth.php","class":"Symfony\\Component\\HttpKernel\\Exception\\UnauthorizedHttpException","trace":["#0 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\dingo\\api\\src\\Auth\\Auth.php(96): Dingo\\Api\\Auth\\Auth->throwUnauthorizedException(Array)","#1 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\dingo\\api\\src\\Http\\Middleware\\Auth.php(52): Dingo\\Api\\Auth\\Auth->authenticate(Array)","#2 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\illuminate\\pipeline\\Pipeline.php(167): Dingo\\Api\\Http\\Middleware\\Auth->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))","#3 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\laravel\\lumen-framework\\src\\Routing\\Pipeline.php(30): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))","#4 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\dingo\\api\\src\\Http\\Middleware\\PrepareController.php(45): Laravel\\Lumen\\Routing\\Pipeline->Laravel\\Lumen\\Routing\\{closure}(Object(Dingo\\Api\\Http\\Request))","#5 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\illuminate\\pipeline\\Pipeline.php(167): Dingo\\Api\\Http\\Middleware\\PrepareController->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))","#6 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\laravel\\lumen-framework\\src\\Routing\\Pipeline.php(30): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))","#7 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\illuminate\\pipeline\\Pipeline.php(103): Laravel\\Lumen\\Routing\\Pipeline->Laravel\\Lumen\\Routing\\{closure}(Object(Dingo\\Api\\Http\\Request))","#8 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\laravel\\lumen-framework\\src\\Concerns\\RoutesRequests.php(426): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))","#9 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\laravel\\lumen-framework\\src\\Concerns\\RoutesRequests.php(263): Laravel\\Lumen\\Application->sendThroughPipeline(Array, Object(Closure))","#10 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\laravel\\lumen-framework\\src\\Concerns\\RoutesRequests.php(237): Laravel\\Lumen\\Application->handleFoundRoute(Array)","#11 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\laravel\\lumen-framework\\src\\Concerns\\RoutesRequests.php(173): Laravel\\Lumen\\Application->handleDispatcherResponse(Array)","#12 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\laravel\\lumen-framework\\src\\Concerns\\RoutesRequests.php(429): Laravel\\Lumen\\Application->Laravel\\Lumen\\Concerns\\{closure}(Object(Dingo\\Api\\Http\\Request))","#13 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\laravel\\lumen-framework\\src\\Concerns\\RoutesRequests.php(175): Laravel\\Lumen\\Application->sendThroughPipeline(Array, Object(Closure))","#14 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\dingo\\api\\src\\Routing\\Adapter\\Lumen.php(116): Laravel\\Lumen\\Application->dispatch(Object(Dingo\\Api\\Http\\Request))","#15 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\dingo\\api\\src\\Routing\\Router.php(518): Dingo\\Api\\Routing\\Adapter\\Lumen->dispatch(Object(Dingo\\Api\\Http\\Request), 'v1')","#16 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\dingo\\api\\src\\Http\\Middleware\\Request.php(126): Dingo\\Api\\Routing\\Router->dispatch(Object(Dingo\\Api\\Http\\Request))","#17 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\illuminate\\pipeline\\Pipeline.php(128): Dingo\\Api\\Http\\Middleware\\Request->Dingo\\Api\\Http\\Middleware\\{closure}(Object(Dingo\\Api\\Http\\Request))","#18 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\illuminate\\pipeline\\Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Dingo\\Api\\Http\\Request))","#19 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\dingo\\api\\src\\Http\\Middleware\\Request.php(127): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))","#20 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\dingo\\api\\src\\Http\\Middleware\\Request.php(103): Dingo\\Api\\Http\\Middleware\\Request->sendRequestThroughRouter(Object(Dingo\\Api\\Http\\Request))","#21 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\illuminate\\pipeline\\Pipeline.php(167): Dingo\\Api\\Http\\Middleware\\Request->handle(Object(Dingo\\Api\\Http\\Request), Object(Closure))","#22 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\laravel\\lumen-framework\\src\\Routing\\Pipeline.php(30): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Laravel\\Lumen\\Http\\Request))","#23 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\illuminate\\pipeline\\Pipeline.php(103): Laravel\\Lumen\\Routing\\Pipeline->Laravel\\Lumen\\Routing\\{closure}(Object(Laravel\\Lumen\\Http\\Request))","#24 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\laravel\\lumen-framework\\src\\Concerns\\RoutesRequests.php(426): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))","#25 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\laravel\\lumen-framework\\src\\Concerns\\RoutesRequests.php(175): Laravel\\Lumen\\Application->sendThroughPipeline(Array, Object(Closure))","#26 D:\\phpstudy_pro\\WWW\\lumen.la\\vendor\\laravel\\lumen-framework\\src\\Concerns\\RoutesRequests.php(112): Laravel\\Lumen\\Application->dispatch(NULL)","#27 D:\\phpstudy_pro\\WWW\\lumen.la\\public\\index.php(28): Laravel\\Lumen\\Application->run()","#28 {main}"]}}
推荐文章: