Laravel 5.3 Passport API在邮递员中使用个人访问令牌未经身份验证

时间:2016-10-03 14:22:00

标签: php laravel laravel-5.3

我根据以下文档使用护照设置了Laravel:https://laravel.com/docs/5.3/passport

有些人使用oAuth实现询问了这一点,但我正在尝试使用个人访问令牌而不是oAuth。一个建议是删除auth中间件,但显然这使应用程序大开,所以任何人都可以提出请求。

我有以下路线(在routes / api.php中):

Route::get('/test', function(){
    return 'returned string from test route';
})->middleware('auth:api');

如果我删除auth中间件以便路由正常工作但是当再次启用auth中间件时,我会在邮递员中收到以下错误:

{"error":"Unauthenticated."}

这些是通过邮递员发送的标题:

GET /api/test HTTP/1.1
Host: localhost:8000
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6ImU4ZmY5MDMwY2EyM2E2MDYwODViN2Y3ZWNiMzcxNDY1MzQxNDViNTk4ODU4NmZhNDljYzU2YjMzYWZiNzhkYTk5OTIwZWMzYzEwNTBkNjZjIn0.eyJhdWQiOiIyIiwianRpIjoiZThmZjkwMzBjYTIzYTYwNjA4NWI3ZjdlY2IzNzE0NjUzNDE0NWI1OTg4NTg2ZmE0OWNjNTZiMzNhZmI3OGRhOTk5MjBlYzNjMTA1MGQ2NmMiLCJpYXQiOjE0NzU1MDMxNjUsIm5iZiI6MTQ3NTUwMzE2NSwiZXhwIjowLCJzdWIiOiIxIiwic2NvcGVzIjpbXX0.IpzKK29dJCpliUXQvPRss87kGFngFcXXwV3jRwhbZOZLxl-4UV70cBsSigmqUuBsHQ4onVl_Cjcq6cEmMFvTZZr7D9AtY3EmScvMPjoFh4KQ3wgd5CoyWfcLQgoBxbElNxL0xW2fIQhpeQd_8Yz_Pr5BByGVTpxfg4JJZ4PzovvZsa2R3izYtqw6-qeurQOtsfOnot5uoLDeDDc76klifnfHfOcNZSoIFGNP3gIGKYBe6lfFuDViR_mQkwQS5_UmERt3GSkEvJjGMtwcRjWY7VPAJ4tvWLnyLw0roGU2e37L0wsqfJ8OrG0Cipv-anXAW_utSo-fiVMr8ZeAWIPguq73Zd44x95YY3nNPOKD5dVIRZM7rQgdhjIwTEz1ggtSXLp-Fu3QOtXaHUahCHvjOTdiTYEa-GR4TZ5wGzt-aRhjdBB7WTe0C6T9ZWVwQr0kJk8AxW6ne87wwJYp_shGunTclZ3SCq5VYg2K_MclbJl65-dT8x-nwqg0lqfNx9s1wmtryrMFIPoBEyaGNEK1aWGHKq418-BIQ1_UAhcHHtEXclWvsGWwhyo3aso-E-sCN2o_IkYvSboIsdFAIXvDvQmoAwis6f1J57zWH8AW1ynCFcBgzBDjIyiaCE5nqtb_4zbEXr8L1EbcllbtZkq3vd9w996kO7xlpBEWwPY8IWg
Accept: application/json
Cache-Control: no-cache
Postman-Token: 6bc483b2-23df-acce-7eef-5a443f8f5d45

4 个答案:

答案 0 :(得分:1)

  • 首先,从不修改供应商文件,除非您有充分合理的理由这样做,并且您希望看到已实施的功能或您遇到的错误发现并修复了您正在使用的包裹。

  • JWT的到期时间可能已经设置为一旦到期就到期。这是一个可以用来检查" ttl"访问令牌的(生存时间)字段:

https://jwt.io/

如果您发现您的令牌在创建时即将到期,您可以转到app\providers\AuthServiceProvider.php课程并在使用Passport课程时添加这些方法:

use Carbon\Carbon;
use Laravel\Passport\Passport;
...

Class AuthServiceProvider extends ServiceProvider {
    ...
    ...

    public function boot() {
        $this->registerPolicies();
        Passport::routes();
        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 目前我的版本是1.0.8,但我可能已经过时,因为他们和社区每隔几周就会不断推出新版本。

以下是有关此问题的一些相关问题的链接。您可以在以下链接中找到答案。如果上面提到的内容不是您正在寻找的内容。

Passport - "Unauthenticated." - Laravel 5.3

非常详细

https://github.com/laravel/passport/issues/151

答案 1 :(得分:0)

在passport.php中

有两个功能

public static function tokensExpireIn(DateTimeInterface $date = null)
{
    if (is_null($date)) {
        return static::$tokensExpireAt
                        ? Carbon::now()->diff(static::$tokensExpireAt)
                        : new DateInterval('P100Y');
    } else {
        static::$tokensExpireAt = $date;
    }

    return new static;
}

/**
 * Get or set when refresh tokens expire.
 *
 * @param  \DateTimeInterface|null  $date
 * @return \DateInterval|static
 */
public static function refreshTokensExpireIn(DateTimeInterface $date = null)
{
    if (is_null($date)) {
        return static::$refreshTokensExpireAt
                        ? Carbon::now()->diff(static::$refreshTokensExpireAt)
                        : new DateInterval('P100Y');
    } else {
        static::$refreshTokensExpireAt = $date;
    }

    return new static;
}

您必须将P100Y更改为P1Y。并且在第101行的PassportserviceProvider.php中还有代码

 $server->enableGrantType(
                new PersonalAccessGrant, new DateInterval('P100Y')
            );

将P100Y更改为P1Y。希望它可以帮助你:)

答案 2 :(得分:0)

请检查令牌是否被正确复制,我总是在复制个人令牌时观察到,最后有一个单词“关闭”'也复制了。 eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6ImU4ZmY5MDMwY2EyM2E2MDYwODViN2Y3ZWNiMzcxNDY1MzQxNDViNTk4ODU4NmZhNDljYzU2YjMzYWZiNzhkYTk5OTIwZWMzYzEwNTBkNjZjIn0.eyJhdWQiOiIyIiwianRpIjoiZThmZjkwMzBjYTIzYTYwNjA4NWI3ZjdlY2IzNzE0NjUzNDE0NWI1OTg4NTg2ZmE0OWNjNTZiMzNhZmI3OGRhOTk5MjBlYzNjMTA1MGQ2NmMiLCJpYXQiOjE0NzU1MDMxNjUsIm5iZiI6MTQ3NTUwMzE2NSwiZXhwIjowLCJzdWIiOiIxIiwic2NvcGVzIjpbXX0.IpzKK29dJCpliUXQvPRss87kGFngFcXXwV3jRwhbZOZLxl-4UV70cBsSigmqUuBsHQ4onVl_Cjcq6cEmMFvTZZr7D9AtY3EmScvMPjoFh4KQ3wgd5CoyWfcLQgoBxbElNxL0xW2fIQhpeQd_8Yz_Pr5BByGVTpxfg4JJZ4PzovvZsa2R3izYtqw6-qeurQOtsfOnot5uoLDeDDc76klifnfHfOcNZSoIFGNP3gIGKYBe6lfFuDViR_mQkwQS5_UmERt3GSkEvJjGMtwcRjWY7VPAJ4tvWLnyLw0roGU2e37L0wsqfJ8OrG0Cipv-anXAW_utSo-fiVMr8ZeAWIPguq73Zd44x95YY3nNPOKD5dVIRZM7rQgdhjIwTEz1ggtSXLp-Fu3QOtXaHUahCHvjOTdiTYEa-GR4TZ5wGzt-aRhjdBB7WTe0C6T9ZWVwQr0kJk8AxW6ne87wwJYp_shGunTclZ3SCq5VYg2K_MclbJl65-dT8x-nwqg0lqfNx9s1wmtryrMFIPoBEyaGNEK1aWGHKq418-BIQ1_UAhcHHtEXclWvsGWwhyo3aso-E-sCN2o_IkYvSboIsdFAIXvDvQmoAwis6f1J57zWH8AW1ynCFcBgzBDjIyiaCE5nqtb_4zbEXr8L1EbcllbtZkq3vd9w996kO7xlpBEWwPY8IWg Copy

如果不是这种情况,请检查该令牌是否存在,或生成新令牌。您可以使用此格式来保护此类路线

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

答案 3 :(得分:0)

我有这个问题...两个小时下来。发生了一些非常奇怪的事情,在我看来,我认为邮差是罪魁祸首。

检查收到的标题以排除它:

Route::get('/test', function(){
    dd( Request::header());
})/*->middleware('auth:api')*/; //disable auth middleware to inspect header

这是我发现的奇怪的事情:

.........
"authorization" => array:1 [
    0 => b"Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJ ................

Bearer ACCESS_TOKEN之前到底是什么? 我再次输入它,它消失了,auth中间件开始工作。

准确检查标头,然后重新添加中间件。这可能只是原因!