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
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:
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
@ 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
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()); } });