2017-01-09 30 views
6

Używam pakietu paszportowego Laravel w celu zapewnienia uwierzytelniania opartego na tokenie do mojego interfejsu API odpoczynku. Obecnie używam konceptu personal access token do generowania tokenu dostępu.Laravel paszport Drukuj osobisty token dostępu

Aby wygenerować token dostępu dla pojedynczego użytkownika, używam poniższego kodu do wygenerowania tokena o nazwie "android".

$user = User::create([ 
       'name' => $data['name'], 
       'email' => $data['email'], 
       'password' => bcrypt($data['password']), 
      ]); 

    // Here the access token will be stored in $token variable. 
    $token = $user->createToken('android')->accessToken; 

    // Now the $token value would be something like 
    //eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6ImMyNjI3YzU0YjFhNWIxZTFlMTdkODhmZTk1NzhjNzAzY2QyMTU0MzhlOD... 

Później chcę wyświetlić osobistą token dostępuna moim administratora deski rozdzielczej, które mam mają trudności w uzyskaniu ponownie wygenerowane żeton. Próbowałem pod kodem, ale nie udało się uzyskać tokena dostępu.

$user = User::find(1) 
dd($user->tokens()) 

Próbowałem też z wykorzystaniem elementów vue paszport, ale wyświetla tylko nazwę token dostępu, a nie rzeczywistymi token.

<passport-personal-access-tokens></passport-personal-access-tokens> 

Pomóż mi rozwiązać ten problem.

Dziękuję

+0

Czy sprawdziłeś bazę danych, aby sprawdzić, czy są tam tworzone żetony? – ceejayoz

+1

'dd ($ user-> tokens())' zwraca konstruktora, a nie tokeny. spróbuj 'dd ($ user-> tokens)' bez funkcji(). A co mówi @ceejayoz, sprawdź swoją bazę danych, jeśli znajdują się tokeny.Możesz także po prostu sprawdzić 'dd ($ user-> tokeny() -> pierwszy())' – Robert

+0

@Robert ma rację, spróbuj to sprawdzić – J3STER

Odpowiedz

2

myślę, że należy po prostu wygenerować token przed lub w tym samym czasie, jak jesteś tworzeniu użytkownika i przechowywać go w bazie danych:

Dodaj kolumnę:

$table->string('token', 60)->unique(); 

Zapisz token:

$token = $user->createToken('android')->accessToken; 

$user = User::create([ 
    'name' => $data['name'], 
    'email' => $data['email'], 
    'password' => bcrypt($data['password']), 
    'token' => $token, 
]); 

Wtedy będzie dostępny jako:

$user->token; 
+0

trochę czasu to będzie być dobrym brakującym "tokenem" => $ token, będzie powodem. – channasmcs

+0

Zrobiłem to już, ale nie chcę ponownie powielać tego tokena, ponieważ jest już przechowywany gdzieś w tabelach paszportowych. – Minion

2

Można spróbować następujący kod:

$user->tokens->load('client')->filter(function ($token) { 
     return ! $token->client->firstParty() && ! $token->revoked; 
    })->values(); 
+0

Drukowanie pustej tablicy. – Minion

+0

@Minion spróbuj tego: '$ user-> tokeny-> load ('client') -> filter (function ($ token) { return $ token-> client-> personal_access_client &&! $ Token-> cofnięty; }) -> wartości(); ' –

0

To było moje rozwiązanie.

stworzyłem migrację configure paszport, aby zainstalować klienta i modyfikować kolumny nazwisko w tabeli oauth_access_tokens do longtext, więc mogę go używać do przechowywania tokenu dostępu w.

public function up() 
{ 
    /* 
    * This command will create the encryption keys needed to generate secure access tokens. 
    * In addition, the command will create "personal access" and "password grant" 
    * clients which will be used to generate access tokens 
    */ 
    Artisan::call('passport:install', array('-n' => true)); 

    // Set the type to LONGTEXT so we can store the access token in it 
    Schema::table('oauth_access_tokens', function ($table) { 

     $table->string('name', 4294967295)->change(); 
    }); 
} 

Potem dodaje się następujące metoda do mojego modelu użytkownika.

/** 
* Get the users api access token. 
*/ 
public function getAccessToken() { 

    $existingToken = $this->tokens()->where('revoked', false)->first(); 

    if ($existingToken) { 

     return $existingToken->name; 
    } 

    $accessToken = $this->createToken($this->uuid)->accessToken; 

    // save the access_token so we can recycle it. 
    $this->tokens()->where('revoked', false)->update([ 
     'name' => $accessToken, 
    ]); 

    return $accessToken; 
} 

następnie w moim transformatorze mogę go nazwać, aby pobrać token dostępu dla użytkowników lub utworzyć go.

/** 
* A Fractal transformer. 
* 
* @param User $user 
* @return array 
*/ 
public function transform(User $user) { 

    return [ 
     'access_token' => $user->getAccessToken(), 
    ]; 
}