Last active
August 25, 2023 12:33
-
-
Save messi89/489473c053e3ea8d9e034b0032effb1d to your computer and use it in GitHub Desktop.
Laravel Passport - Customize The Token Response
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Laravel Passport - Customize Token response. | |
* | |
* @author Messi89 OVERGEN <@messi89minou> | |
* @link https://github.com/messi89 | |
*/ | |
namespace App\Http\Controllers\Api; | |
use App\Models\User; | |
use Exception; | |
use Illuminate\Database\Eloquent\ModelNotFoundException; | |
use League\OAuth2\Server\Exception\OAuthServerException; | |
use Psr\Http\Message\ServerRequestInterface; | |
use Response; | |
class AccessTokenController extends \Laravel\Passport\Http\Controllers\AccessTokenController | |
{ | |
public function issueToken(ServerRequestInterface $request) | |
{ | |
try { | |
//get username (default is :email) | |
$username = $request->getParsedBody()['username']; | |
//get user | |
$user = User::where('email', '=', $username)->firstOrFail(); | |
//issuetoken | |
$tokenResponse = parent::issueToken($request); | |
//convert response to json string | |
$content = $tokenResponse->getBody()->__toString(); | |
//convert json to array | |
$data = json_decode($content, true); | |
if(isset($data["error"])) | |
throw new OAuthServerException('The user credentials were incorrect.', 6, 'invalid_credentials', 401); | |
//add access token to user | |
$user = collect($user); | |
$user->put('access_token', $data['access_token']); | |
return Response::json(array($user)); | |
} | |
catch (ModelNotFoundException $e) { // email notfound | |
//return error message | |
} | |
catch (OAuthServerException $e) { //password not correct..token not granted | |
//return error message | |
} | |
catch (Exception $e) { | |
////return error message | |
} | |
} | |
} |
Hi Messi, it worked for me. Thanks for the help.
Hi there 👋, Laravel 8.54 with Passport 10.1, nice job Messi!!!
<?php
namespace App\Http\Controllers\Auth;
use Exception;
use App\Models\User;
use Psr\Http\Message\ServerRequestInterface;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Laravel\Passport\Exceptions\OAuthServerException;
use Laravel\Passport\Http\Controllers\AccessTokenController as AuthController;
class AccessTokenController extends AuthController
{
public function issueToken(ServerRequestInterface $request)
{
try {
$data = json_decode(parent::issueToken($request)->content(), true);
$user = User::select(["name", "email"])
->where('email', '=', $request->getParsedBody()['username'])
->firstOrFail()
->toArray();
return response()->json(array_merge(["user" => $user], $data));
} catch (ModelNotFoundException $e) {
return response()->json(array(
'error' => array(
'msg' => $e->getMessage(),
'code' => $e->getCode(),
),
), 401);
} catch (OAuthServerException $e) {
return response()->json(array(
'error' => array(
'msg' => $e->getMessage(),
'code' => $e->getCode(),
),
), 401);
} catch (Exception $e) {
return response()->json(array(
'error' => array(
'msg' => $e->getMessage(),
'code' => $e->getCode(),
),
), 500);
}
}
}
@bakiro is that running on Laravel 8.83.27? the route on /oauth/token
always retrun null
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hello everybody.
Please give an answer you are 100% sure is a real, well tested and accepted solution. Otherwise you make a mess and confusion among people who wants to learn implementing OAuth in a good and secure way. Some writings make a lot of confusion and misunderstanding. All things related to implementation and customizing OAuth token are already present in laravel/passports package. You need nothing more than that. Just exam the package and documentation on Laravel official site.