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}"]}}
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5

估计没人愿意给你回答这种问题

1年前 评论
sdphper (楼主) 1年前

file

白话翻译: token错误,或者 请求包没带正确的请求头

config.header.Authorization = 'Bearer ' + 'tokenxxxxx'

测试

postman 测试。

file

1年前 评论

楼主解决了吗

1年前 评论
sdphper (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!