Search code examples
phplaravellaravel-passport

How to override `issueToken` method in Laravel/Passport


I am trying to override the issueToken method located in the \Laravel\Passport\Http\Controllers\AccessTokenController without adding a new route i.e(api/oauth/token). I have built my own AccessTokenController that performs the functionality that i want but when i make a call to oauth/token, the parent method is being executed and not my implementation.. am i misisng something to complete the override?

<?php
   namespace App\Http\Controllers;

   use phpseclib\Crypt\RSA;
   use Illuminate\Database\Eloquent\ModelNotFoundException;
   use League\OAuth2\Server\Exception\OAuthServerException;
   use Psr\Http\Message\ServerRequestInterface;
   use \Laravel\Passport\Http\Controllers\AccessTokenController as ATC;

   class AccessTokenController extends ATC {

     public function issueToken(ServerRequestInterface $request){
       try {
         // Fetching username from request
         $username = $request->getParseBody()['username'];
         // Fetching the User
         $user = User::where('email', '=', $username);
         // Genereting token
         $tokenResponse = parent::issueToken($request);
         //convert response to json string
         $content = $tokenResponse->getBody()->__toString();
         $content['email'] = $user['emial'];
         //convert json to array
         $data = json_decode($content, true);
         return $data;

       } catch (OAuthServerException $e) {
         return ['Message' => 'The suer credentials were incorrect!'];
       }catch (\Exception $e) {
         return ['Message' => 'Exception: '.$e];
       }
     }
   }

Solution

  • Just overriding the route in app/Providers/AuthServiceProvider.php is enough.

    Make sure you add: use Illuminate\Support\Facades\Route; at the top of the file!

    public function boot()
    {
        $this->registerPolicies();
    
        Passport::routes();
    
        Route::post('/oauth/token', [
            'uses' => '\App\Http\Controllers\AccessTokenController@issueToken',
            'as' => 'passport.token',
            'middleware' => 'throttle',
        ]);
    }
    

    Output of php artisan route:list --name=passport.token:

    +--------+----------+-------------------------+-------------------------+---------------------------------------------------------------------------+------------+
    | Domain | Method   | URI                     | Name                    | Action                                                                    | Middleware |
    +--------+----------+-------------------------+-------------------------+---------------------------------------------------------------------------+------------+
    |        | POST     | oauth/token             | passport.token          | App\Http\Controllers\AccessTokenController@issueToken                     | throttle   |
    |        | POST     | oauth/token/refresh     | passport.token.refresh  | Laravel\Passport\Http\Controllers\TransientTokenController@refresh        | web,auth   |
    |        | GET|HEAD | oauth/tokens            | passport.tokens.index   | Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController@forUser | web,auth   |
    |        | DELETE   | oauth/tokens/{token_id} | passport.tokens.destroy | Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController@destroy | web,auth   |
    +--------+----------+-------------------------+-------------------------+---------------------------------------------------------------------------+------------+