2017-05-17 1 views
0

J'ai construit un exemple de projet Laravel en utilisant mongodb (Jenssegers Mongodb) et j'utilise un passeport à Laravel 5,4 suivre by this document.Laravel 5.4 jeton d'accès passeport mongodb Unauthenticated

Tout fonctionne bien jusqu'à ce que je pris un jeton d'accès à Postman pour le test, prenez maintenant un oeil à mon api.php itinéraire

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

Dans postier, je configurer deux têtes qui sont Accept: application/json et Authorization: Bearer $TOKEN et je suis très Assurez-vous que mon jeton d'accès n'est pas la copie manquante faute mais toujours obtenir une erreur.

{ 
    "error": "Unauthenticated." 
} 

choses que j'ai essayé

Je Ecraser champ par défaut id dans le modèle User.php

use Authenticatable, Authorizable, CanResetPassword, Notifiable, HasApiTokens; 

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

Je modifie également le temps d'expiration du jeton dans AuthserviceProvider.php comme si

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' 
    ]); 
} 

Et d'autres façons, mais ne fonctionne toujours pas.

Mise à jour pour le débogage infomation

Quand j'ajoute try catch pour public/index.php, une erreur apperead

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)) 
...... 

Quand je vérifie le fichier vendor\league\oauth2-server\src\AuthorizationValidators\BearerTokenValidator.php à line 66. Semble mon jeton d'accès a été révoqué, mais dans ma base de données revoked colonne toujours faux, et ce jeton d'accès est flambant neuf, je viens de créer il ya quelques minutes.

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

Une idée?

Répondre

0

Après quelques heures de creusement profond à vendor\league\oauth2-server\src\AuthorizationValidators\BearerTokenValidator.php, on m'a trouvé une solution.

Le problème est dans le fichier vendor\laravel\passport\src\TokenRepository.php à fonction public function find($id) ligne 27

public function find($id) 
{ 
    return Token::find($id); 
} 

Parce que j'utilise Mobodb et cette fonction est d'utiliser use Jenssegers\Mongodb\Eloquent\Model et il cherche _id au lieu de id. Donc, juste besoin de faire changer de trouver une telle fonction.

public function find($id) 
{ 
    return Token::where('id', $id)->first(); 
} 

Bien que modify fichier fournisseur est pas recommandé, mais dans ce cas, je dois le faire, je l'espère dans la prochaine version, auteur du passeport Laravel publiera un support de passeport MongoDB.

Espérons que cela aide quelqu'un.