当前位置: 首页 > 知识库问答 >
问题:

Laravel 5.4 401/未经验证,使用Passport和多种令牌类型

宇文飞翮
2023-03-14

在这方面的背景故事中,我一直在按照文档中的说明进行工作:https://laravel.com/docs/5.4/passport

我有

  1. Laravel 5.4
  2. laravel/护照:^3.0来自作曲家
  3. 本地Mac osx运行Mamp pro,Php 7.0.15

我在路由/api.php中调用示例用户路由

Route::get('/user', function () {
    return 'testing';
})->middleware('auth:api');

邮递员卷曲头(从邮递员中的代码导出中提取):

CURLOPT_HTTPHEADER => array(
    "accept: application/json",
    "authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6ImM3ZmI2ZmNmMWFkOGQ0NjFkNTdhMWU2NjFiYjhhOThmOTJhOTBkMDFkNDkwZDFjNDRkNDg5MTdlYjJiZWYyMDlkNjNmOTQwMjIxNTljZWI5In0.eyJhdWQiOiIxIiwianRpIjoiYzdmYjZmY2YxYWQ4ZDQ2MWQ1N2ExZTY2MWJiOGE5OGY5MmE5MGQwMWQ0OTBkMWM0NGQ0ODkxN2ViMmJlZjIwOWQ2M2Y5NDAyMjE1OWNlYjkiLCJpYXQiOjE1MDE3OTQ2NjIsIm5iZiI6MTUwMTc5NDY2MiwiZXhwIjoxNTMzMzMwNjYyLCJzdWIiOiIxIiwic2NvcGVzIjpbImFwaS1hY2Nlc3MiXX0.CPGM4PIKJBeiJvokuDzShz_1CnqHlnFIML-tWoBCn5GcijMXmQkWOHzTI8QwTws2h719TGA4hemXDljjqoZB0LiztAx2JZ3OhjNS-MhrMNujnTJUbvkXAVfcRdybhlDEWof_iboLICQTYNTslX1iw-2DCyFMh8gB4INAKUhpvzA955ALB-ZunKrjSNKdRkgtZRe0t6VyJf9LwzgjIAfSKoi_qRis36KD7hcf0Id_iWZkhvS-ZfuM5eUpzUooUe0rb4rkYYEYndlHlY7-uuZPlzmPMpaJTR4AW1CLkaK5Ic7fde1x1kk2duW_Znd9ki2YBP0kw7ifAmg2DaM5r2-0kEx_1iFuCIxE8QJns1aIm3XjWoOApovt7V6-s3yJZK3xlIDCjFI-C59RHiVSabh-hKdX4elvSL9taSQyuramPZPpsne9SUh4KCWul0iHoNjFdFJEut_TUBWyUPtD3J7gg6P97uRS_THDAUHMo2UYVhlnu9PV8SvbvjGj3OeaaH7ZbzWQCYKbqsLZAZ2mnJlFhTMghbaC2s_MND1zlRm7w9btmihxVW714NUbH8UAwSvrtIYYQ0itevZ59TLiAXprjmjkhiFkrhdX4bUje4uNEbLYawkZI-1o82IExW9D8kCYpOWOZdWTCLgmaE2wXcf-DTCV-9vDWRAdX1YmP4JbRsc",
    "cache-control: no-cache",
    "content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW",
    "postman-token: 2ec7a2c8-3489-812d-4638-ebb7dc62aeb1"
  ),

我有1个使用Vue组件生成的个人访问令牌

我已经检查过我将令牌到期时间设置为1年,这反映在db中。

我的AuthServiceProvider。php

Passport::routes();

        // TODO MAKE THEM LAST A LONG TIME
        Passport::tokensExpireIn(Carbon::now()->addYears(20));//You can also use addDays(10)
        Passport::refreshTokensExpireIn(Carbon::now()->addYears(20));//You can also use addDays(10) 
        Passport::pruneRevokedTokens(); //basic garbage collector

        Passport::tokensCan([
            'api-access' => 'Access Complete API',
        ]);

我的路线服务提供商。php(在map函数中调用mapApiRoutes)

protected function mapApiRoutes()
    {
        Route::group([
            'namespace' => $this->namespace,
            'prefix' => 'api',
        ], function ($router) {
            require base_path('routes/api.php');
        });
    }

我的内核。php路由中间件

protected $routeMiddleware = [
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];

--编辑——经过更多的研究

我正在使用postman测试我的api身份验证,每次尝试都会得到401。我尝试了个人访问客户端和密码授予客户端,两者都有相同的问题。在查看了它们之后,我意识到它们都使用授权承载[token]格式。

所以我开始在Passport源代码中的各种文件中注销。

在警卫室。php

public function user(Request $request) {

    Log::info('TokenGuard: '. $request);

    if ($request->bearerToken()) {
        return $this->authenticateViaBearerToken($request);
    } elseif ($request->cookie(Passport::cookie())) {
        return $this->authenticateViaCookie($request);
    }
}

日志看起来像这样:

[2017-08-10 20:50:20] local.INFO: TokenGuard 93: GET /api/user HTTP/1.1
Accept:          application/json
Accept-Encoding: gzip, deflate
Cache-Control:   no-cache
Connection:      keep-alive
Content-Type:    application/json
Host:            url.com:8888
Postman-Token:   66707fe5-8f6e-4920-948b-2804a76d4a65
User-Agent:      PostmanRuntime/6.2.5


[2017-08-10 20:50:20] local.INFO: TokenGuard 93: GET /api/user HTTP/1.1
Accept:          application/json
Accept-Encoding: gzip, deflate
Cache-Control:   no-cache
Connection:      keep-alive
Content-Type:    application/json
Host:            url.com:8888
Postman-Token:   66707fe5-8f6e-4920-948b-2804a76d4a65
User-Agent:      PostmanRuntime/6.2.5

缺少的是请求的承载[令牌]部分。TokenGuard代码块正在运行if/else。这就是我认为失败发生的地方。

它不也应该把它记录下来吗?由于承载令牌丢失,If/Else失败,因此返回401是有意义的。

为什么我的令牌会从请求中被剥夺。

共有1个答案

穆正青
2023-03-14

将此添加到您的。htaccess项目公共目录下的文件:

RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
 类似资料:
  • 我已经设置Laravel使用护照按留档在这里:https://laravel.com/docs/5.3/passport 有几个人问过关于使用oAuth实现的问题,但我尝试使用个人访问令牌,而不是oAuth。一个建议是删除auth中间件,但显然这会使应用程序完全开放,因此任何人都可以发出请求。 我有以下路线(在路线/api.php): 如果我删除了auth中间件以使路由正常工作,则此操作有效,但当

  • 我的平均堆栈应用程序使用Azure AD进行身份验证。我正在使用“Passport-Azure-AD”模块进行web api认证。根据这里的回复,我了解到 server.js 下面的“UserService”用于从数据库获取用户,我想保护该API调用

  • 我已将OAuth2 Passport安装到我的Laravel项目中。我正在使用postman进行测试,我可以创建新用户,我可以登录(生成令牌)和注销。登录后,我尝试向APIendpoint发出请求,但在这里,我被卡住了,因为无论我在postman

  • 我一直在使用JWT库解码一个Json Web令牌,并希望切换到微软的官方JWT实现system . identity model . tokens . jwt 留档非常稀疏,所以我很难弄清楚如何完成我一直在使用JWT库所做的事情。对于JWT库,有一个Decode方法,它采用Bas64编码的JWT并将其转换为JSON,然后可以反序列化。我想使用System. IdtyModel. Tokens. J

  • 我试图弄清楚我应该如何坚持身份验证。 假设用户使用电子邮件和密码成功进行身份验证。然后服务器生成并返回两个令牌: accesstoken(jwt过期15分钟)将存储在浏览器存储中 refreshtoken(jwt过期7天)作为安全cookie 当将访问令牌存储在本地存储(或会话存储)中时,React 应用程序将简单地检查它是否存在于存储中并继续渲染私有路由。因此,这意味着如果用户有一个无效/被盗的

  • 我已经使用active directory登录,在验证active directory中的用户名和密码是否正确后,我想在passport中创建access。但是如果没有在中验证,我就无法创建令牌。 我从活动目录验证后尝试此代码 错误: 调用未定义的函数App\Http\Controllers\API\createToken() 如何在passport中创建访问令牌而不使用?