implementar google example php rest oauth yii2 oauth2-server

php - google - Cómo anular la respuesta predeterminada del servidor Yii2-Filsh Oauth



oauth server example (1)

Estoy usando Yii2 Filsh Oauth Server que funciona bien, sin embargo cuando inicio sesión genera AccessToken con sus campos predeterminados, es decir,

{ "access_token": "f3389e81c234276967079b2293795fc9104a2fac", "expires_in": 86400, "token_type": "Bearer", "user_id": 9, "scope": null, "refresh_token": "851464a210f56bb831da378a43e1016bd3e765d7", }

Pero necesitaba agregar información de usuario en su respuesta algo así como

{ "access_token": "f3389e81c234276967079b2293795fc9104a2fac", "expires_in": 86400, "token_type": "Bearer", "scope": null, "refresh_token": "851464a210f56bb831da378a43e1016bd3e765d7", "user": { "id": 9, "first_name": "Test", "last_name": "Test2", "username": "test", "email": "[email protected]", "status": 1, "dob": "20-08-1990", "gender": "Male", } }

Se me ocurrió una extraña solución. Personalicé el archivo de la biblioteca principal de bshaffer (que no es un buen enfoque) para cumplir con mis requisitos. Lo que hice fue cambiar esta línea en el modelo de usuario:

return [''user_id'' => $user->getId()];

A ESTO

return [''user_id'' => [$user->getId(), $userObject]]; //I get all user info in $userObject and passed an array with two fields

ya que estoy pasando una matriz en lugar de single $user->getId() por lo tanto, necesitaba modificar el archivo de la biblioteca bshaffer AccessToken.php que está disponible en esta ruta: vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessToken.php en la línea 76

CAMBIÉ ESTO:

public function createAccessToken($client_id, $user_id, $scope = null, $includeRefreshToken = true) { $token = array( "access_token" => $this->generateAccessToken(), "expires_in" => $this->config[''access_lifetime''], "token_type" => $this->config[''token_type''], "user_id" => $user_id, "scope" => $scope ); $this->tokenStorage->setAccessToken($token["access_token"], $client_id, $user_id, $this->config[''access_lifetime''] ? time() + $this->config[''access_lifetime''] : null, $scope); if ($includeRefreshToken && $this->refreshStorage) { $token["refresh_token"] = $this->generateRefreshToken(); $expires = 0; if ($this->config[''refresh_token_lifetime''] > 0) { $expires = time() + $this->config[''refresh_token_lifetime'']; } $this->refreshStorage->setRefreshToken($token[''refresh_token''], $client_id, $user_id, $expires, $scope); } return $token; }

A ESTO:

public function createAccessToken($client_id, $user_id, $scope = null, $includeRefreshToken = true) { $token = array( "access_token" => $this->generateAccessToken(), "expires_in" => $this->config[''access_lifetime''], "token_type" => $this->config[''token_type''], "scope" => $scope, "user" => $user_id[1] //NOTE: I added new user field and passed second index of array which is user node ); //NOTE: Here I passed $user_id[0] since $user_id is array hence I am using its 0 index here which has id $this->tokenStorage->setAccessToken($token["access_token"], $client_id, $user_id[0], $this->config[''access_lifetime''] ? time() + $this->config[''access_lifetime''] : null, $scope); if ($includeRefreshToken && $this->refreshStorage) { $token["refresh_token"] = $this->generateRefreshToken(); $expires = 0; if ($this->config[''refresh_token_lifetime''] > 0) { $expires = time() + $this->config[''refresh_token_lifetime'']; } //NOTE: Same goes here passing $user_id[0] $this->refreshStorage->setRefreshToken($token[''refresh_token''], $client_id, $user_id[0], $expires, $scope); } return $token; }

Todo funciona bien ahora el PROBLEMA es que desde que modifiqué el archivo core bshaffer cuando ejecuto el compositor de nuevo, sobrescribe su código predeterminado y mis cambios simplemente desaparecen cada vez que ejecuto el compositor. De nuevo, necesito modificar el mismo archivo. Necesito un workaround adecuado, puede ser cualquier component donde anule este calss / method y coloco mis cambios para que se ejecute de la misma manera luego de ejecutar el compositor.


Obviamente, no debe modificar nada en la carpeta del vendor porque dichos cambios se anularán en la próxima actualización del compositor.

Hasta donde puedo ver, no hay ninguna opción para configurar eso, y lo que lo hace más difícil es el hecho de que es un problema de la biblioteca dependiente de la extensión y no de la extensión en sí misma. Al principio, intente encontrar una forma de configurar eso o agregar una solución alternativa sin necesidad de realizar dichos cambios. Si no puedes, las posibles opciones son:

1) Crea una solicitud de emisión / extracción y espera a que se agreguen cambios en bshaffer/oauth2-server-php . Asegúrese de que Filsh/yii2-oauth2-server tenga la dependencia correcta, de modo que permita la actualización a la versión más nueva de bshaffer/oauth2-server-php (probablemente se requiera una solicitud más de emisión / extracción para Filsh/yii2-oauth2-server en este caso). Esto puede llevar bastante tiempo.

2) Cree las horquillas para ambas bibliotecas, realice los cambios deseados y utilícelos en su lugar. Puede usar la sección de repositorios en composer.json si no desea publicarlo en Packagist. Ver más información en los documentos oficiales de Composer .

3) Copie ambas extensiones en su código de proyecto y póngalas bajo control de versión, modifíquelas y utilícelas en lugar de aquellas que están en la carpeta del vendor .

4) Agregue el parche de mono. Dado que esta característica no es compatible con PHP de forma nativa, puede usar la extensión que proporciona dicha funcionalidad: antecedente / patchwork .

En este caso, puedes reemplazar este método con el tuyo.

Además de ejemplos en documentos oficiales , encontré un artículo que también me puede ayudar y un ejemplo con las clases. En tu caso, es más simple y será algo así:

replace(/OAuth2/ResponseType:AccessToken:class. ''::createAccessToken'', function ($client_id, $user_id, $scope = null, $includeRefreshToken = true) { // Redefine method behavior as you want here });

La opción 1 puede llevar mucho tiempo y siempre existe la posibilidad de que su solicitud de emisión o extracción sea rechazada. Con las opciones 2 y 3 , pierde la posibilidad de actualizaciones.

Si tu:

  • no puede encontrar una forma de configurarlo o una solución alternativa sin necesidad de realizar dichos cambios;

  • Necesito esto con urgencia.

  • siente que se ve como una característica específica del proyecto en lugar de una característica común.

use la opción 4 , probablemente sea la mejor en este caso.

ACTUALIZAR:

Aquí hay otra opción que usa la función incorporada de Yii2.

5) Puede usar Yii :: $ classMap () para reemplazar la clase con la personalizada. Lo probé y funciona bien con las clases de extensión.

Copie el vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessToken.php y péguelo en la carpeta common/components . Modifique el método createAccessToken , pero no modifique el espacio de nombres (de lo contrario, obtendrá el error Class not found ).

Cambia la clase usando un mapa de clase durante el arranque de la aplicación:

Yii::$classMap[''OAuth2/ResponseType/AccessToken''] = ''@common/components/AccessToken.php'';

Puede colocarlo en index.php justo antes de inicializar y ejecutar la aplicación:

$application = new yii/web/Application($config); $application->run();

Sin embargo, recomiendo crear un componente de arranque independiente que implemente BootstrapInterface e incluirlo en la configuración de la aplicación.

Ahora, cuando se refiera a OAuth2/ResponseType/AccessToken su clase personalizada. La desventaja es que no puede extenderse desde la clase de extensión y anular solo un método, pero eso se debe a que necesita mantener el espacio de nombre original.

Verifique esta respuesta SO relacionada .