Laravel 5.4 mongodb护照访问令牌未经身份验证

时间:2017-05-17 04:27:31

标签: mongodb laravel-5 laravel-passport

我使用mongodb(Jenssegers Mongodb)构建了一个示例Laravel项目,我使用Laravel 5.4中的护照跟随by this document

一切正常,直到我将一个访问令牌带到Postman进行测试,现在看一下我的api.php路径

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

在邮递员中,我设置了两个Accept: application/jsonAuthorization: Bearer $TOKEN的标头,我非常确定我的访问令牌不是副本丢失的错误但仍然出错。

{
    "error": "Unauthenticated."
}

我尝试过的事情

我已覆盖模型id

中的默认User.php字段
use Authenticatable, Authorizable, CanResetPassword, Notifiable, HasApiTokens;

protected $collection = 'users';
protected $fillable = ['username', 'email', 'password', 'name'];
protected $primaryKey = '_id';

我也在AuthserviceProvider.php修改令牌过期时间,如此

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::tokensCan([
        'conference' => 'Access your conference information'
    ]);
}

还有其他一些方法,但仍无效。

更新调试信息

当我将try catch添加到public/index.php时,会出现错误

League\OAuth2\Server\Exception\OAuthServerException: The resource owner or authorization server denied the request. in /data/www/public_html/xxxx/vendor/league/oauth2-server/src/Exception/OAuthServerException.php:165
Stack trace:
#0 /data/www/public_html/xxxx/vendor/league/oauth2-server/src/AuthorizationValidators/BearerTokenValidator.php(66): League\OAuth2\Server\Exception\OAuthServerException::accessDenied('Access token ha...')
#1 /data/www/public_html/xxxx/vendor/league/oauth2-server/src/ResourceServer.php(82): League\OAuth2\Server\AuthorizationValidators\BearerTokenValidator->validateAuthorization(Object(Zend\Diactoros\ServerRequest))
......

当我在vendor\league\oauth2-server\src\AuthorizationValidators\BearerTokenValidator.php检查文件line 66时。似乎我的访问令牌已被撤销,但在我的数据库revoked列仍然是假的,并且此访问令牌是全新的,我刚刚在几分钟前创建。

if ($this->accessTokenRepository->isAccessTokenRevoked($token->getClaim('jti'))) {
    throw OAuthServerException::accessDenied('Access token has been revoked');
}

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

经过几个小时深入挖掘vendor\league\oauth2-server\src\AuthorizationValidators\BearerTokenValidator.php后,我找到了一个解决方案。

问题出在文件vendor\laravel\passport\src\TokenRepository.php的{​​{1}}行第27行

public function find($id)

因为我使用Mobodb并且此功能使用public function find($id) { return Token::find($id); } 并且它搜索use Jenssegers\Mongodb\Eloquent\Model而不是_id。所以,只需要像这样进行更改查找功能。

id

虽然不推荐修改供应商文件,但在这种情况下我必须这样做,希望在下一版本中,Laravel护照的作者将发布护照支持mongoDB。

希望这有助于某人。