Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

415
Views
Envío de más datos con el pasaporte de Laravel oauth/token

Entonces, estoy usando Laravel+Passport y hasta ahora funciona bien.

Pero, me gustaría hacer un pequeño cambio en el código de pasaporte (bueno, no en la carpeta del proveedor, espero), una vez que le pida al usuario que cambie su contraseña en caso de que esté haciendo el primer inicio de sesión.

Entonces, lo que necesitaría son dos cosas (creo):

1 - ¿Cómo puedo agregar una información más a la respuesta de oauth/token? Junto con access_token, me gustaría agregar una columna de la base de datos que necesita NewPassword=true/false.

2 - En caso de que needNewPassword sea verdadero, la aplicación redirigirá a otra pantalla, donde el usuario establecerá una nueva contraseña. Establecería la nueva contraseña, quitaría el indicador de needNewPassword y devolvería un nuevo access_token al usuario. Entonces, el usuario usaría solo ese access_token. ¿Cómo puedo regenerar un nuevo access_token?

¡Gracias por tu ayuda! Juan

about 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Derecha,

Respondo mi propia pregunta, en caso de que alguien necesite hacer lo mismo. Tal vez no sea la mejor manera, pero está funcionando. Lo que hice fue:

  • Cree una nueva ruta, como /api/login que apunte a un método (asegúrese de que esté fuera de su "autorización" de middleware, una vez que no esté enviando el token en esta llamada). Por ejemplo: Route::post('/login', 'Auth\LoginController@apiLogin');
  • en el método, haces una solicitud al oauth/token y, con el resultado, agregas los campos que deseas. prueba

     function apiLogin(Request $request) { $tokenRequest = $request->create('/oauth/token', 'POST', $request->all()); $request->request->add([ "client_id" => 'your_client_id', "client_secret" => 'your_client_secret', "grant_type" => 'password', "code" => '*', ]); $response = Route::dispatch($tokenRequest); $json = (array) json_decode($response->getContent()); $json['new_value'] = '123456'; $response->setContent(json_encode($json)); return $response }

    Esto es trabajo para mí. En mi caso, también tengo una sola aplicación, por lo que mi client_id, client_secret, grant_type y código se agregan en el lado del servidor. El cliente solo necesita pasar el nombre de usuario (o correo electrónico, depende de lo que esté usando) y la contraseña y luego obtendrá el token de acceso y la otra información que quiero enviar también. Espero que esto ayude a alguien más también.

Saludos, joao

about 4 years ago · Santiago Trujillo Report

0

@ joao.sauer Su propia respuesta está funcionando a la perfección, pero si no desea un poco más de libertad, puede extender el propio AccessTokenController de Passport.

Un ejemplo sencillo:

 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 } } }

créditos a Messi89: Laravel Passport - Personaliza la respuesta del token

about 4 years ago · Santiago Trujillo Report

0

Encontré una solución simple sin necesidad de una nueva solicitud, controlador o extensión, solo agregue parámetros para solicitar y llamar a issueToken a través de la aplicación, puede ser útil para empezar:

 // in routes/api.php Route::post('/token',function(Request $request){ $request->request->add([ 'grant_type' => 'password', 'client_id' => '2', 'client_secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx' ]); return app()->call('\Laravel\Passport\Http\Controllers\AccessTokenController@issueToken'); });

También puede agregar el bloque try...catch para manejar excepciones o agregar parámetros a la respuesta antes de enviarla al cliente

 Route::post('/token',function(Request $request){ $request->request->add([ 'grant_type' => 'password', 'client_id' => '2', 'client_secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx' ]); try { $response = app()->call('\Laravel\Passport\Http\Controllers\AccessTokenController@issueToken'); $newResponse = json_decode($response->content()); // Add parameters to response here $newResponse->user = ['user'=>'user','pass'=>'pass']; return Response()->json($newResponse); }catch (Laravel\Passport\Exceptions\OAuthServerException $e) { if ($e->statusCode() == 400) { return response()->json(['message' => 'Invalid request. Please enter username and password.'], $e->statusCode()); } else if ($e->statusCode() == 401) { return response()->json(['message' => 'Your credentials are incorrect. Please try again.'], $e->statusCode()); } return response()->json('Something went wrong on the server. Please try later.', $e->statusCode()); } });
about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!