php - please - Laravel Passport Password Grant-Falló la autenticación del cliente
medium laravel passport (12)
Compruebe a fondo el tipo de subvención.
{
"grant_type": "password",
"client_id": 2,
"client_secret":
"username": ,
"password":
"scope": ""
}
En el ejemplo anterior, dice contraseña. Ahora revise la tabla: oauth_clients y asegúrese de que el valor de column password_client = 1
o busca la entrada con el password_client = 1
Después de escuchar mucho sobre el pasaporte de traslado, pensé en implementarlo en mi nuevo proyecto, donde mi requisito es crear una API que se utilizará en una aplicación móvil.
Así que mi aplicación móvil es un client
, que tendrá más usuarios que ellos.
Seguí los pasos mencionados por Taylor y también leí sobre esto here . En pocas palabras seguí estos pasos:
-
laravel/passport
instalado. - Creado un usuario del sitio web.
- Claves de pasaporte generadas
php artisan passport:install
-
client_secret
yclient_secret
conphp artisan passport:client
-
redirection
añadido y rutas decallback
enweb.php
- Autorizó al usuario y consiguió el token de acceso final.
Luego intenté llamar a api/user
(con la Authorization
encabezado que contiene el valor del Bearer eyJ0eXAiOiJKV1...(token)
Recibí los datos. Bastante simple y ordenado.
Pero los usuarios de mi aplicación no tendrán estos detalles. Así que pensé en configurar los tokens de concesión de contraseñas que se ajusten perfectamente a mis necesidades.
Ahora comienza el verdadero dolor de cabeza. He estado intentando configurar esto durante los últimos 3 días y continuamente obtengo
{"error":"invalid_client","message":"Client authentication failed"}
He intentado casi todas las guías que seguí en línea: problemas de redirección , agregar una solución de alcance de Atleast One , un problema P100Y , etc.
Pero todavía estoy recibiendo invalid client
error de invalid client
. Esto es lo que estoy pasando por oauth/token
a oauth/token
:
{
"grant_type": "password,"
"client_id": "3,"
"client_secret": "8BUPCSyYEdsgtZFnD6bFG6eg7MKuuKJHLsdW0k6g,"
"username": "[email protected],"
"password": "123456,"
"scope": ""
}
Cualquier ayuda sería apreciada.
Esto podría ayudarlo a orientarlo en la dirección correcta porque estamos implementando la concesión de la contraseña nosotros mismos.
1 - En tu paso 4 en lugar de ejecutar esto:
php artisan passport:install
ejecute lo siguiente para crear su contraseña de concesión de Cliente:
php artisan passport:client --password
El comando anterior le dará una pregunta de seguimiento para establecer el nombre de su Cliente de concesión de contraseña. Asegúrese de obtener la identificación y el secreto de este nuevo registro en su base de datos.
2 - Su objeto de solicitud POSTMAN Post debe estar envuelto dentro de un objeto similar al siguiente:
''form_params'' => [
''grant_type'' => ''password'',
''client_id'' => ''my_client-id'',
''client_secret'' => ''my_client-secret'',
''username'' => ''username or email'', <-pass through variables or something
''password'' => ''my-user-password'', <- pass through variables or something
''scope'' => '''',
],
Actualización 1 10/12/2016:
En una investigación adicional de este problema, me encontré exactamente en el mismo lugar en el que se encontraba y me vi obligado a bucear en el agujero de conejo del pasaporte.
Actualmente, por lo que veo, el sistema ha establecido el identificador de cliente como ''código_autorización'' cuando necesita ser ''contraseña''. Estoy investigando cómo resolver este problema que está teniendo, ya que también lo encontré. Pondré un código para ayudar a la gente a seguir dónde he estado y qué he estado haciendo, pero ahora son las 2:40 am, así que necesito dormir.
Actualización 2 10/12/2016
He estado depurando el problema por 7 horas ahora. Hay un método dentro del pasaporte que valida el cliente. Este método toma las entradas que ha agregado en el objeto (mencionado anteriormente) e intenta obtener la Entidad del Cliente a través de una clase de repositorio del cliente según lo que haya pasado. Si se encuentra un Cliente, se verificará para ver si una instancia de la Entidad del Cliente realmente existe dentro de la Interfaz de la Entidad del Cliente que PARECE como que extrae las credenciales del Cliente de la base de datos. Sin embargo, hay un bloque de código que devuelve NULL de lo que estoy obteniendo en mis pruebas. TODOS los campos se están introduciendo correctamente hasta ahora, pero parece que hay una confusión entre el repositorio y la interfaz. Lo que está causando que el error sea lanzado.
Al final, siento que estoy cerca de resolver este problema. Su paciencia es muy apreciada. =)
Actualización 3 10/12/2016
Después de un largo período de depuración he encontrado el problema inicial. Había campos que no estaban emparejados. En resumen, es un problema de configuración.
ASI QUE
La solución en este caso es:
DOBLE COMPROBAR TODOS LOS CAMPOS En la base de datos con TODAS las credenciales pasadas. Hasta períodos, guiones, espacios, contraseñas, identificación del cliente, secreto del cliente, URI / URL de redireccionamiento VÁLIDOS, grant_types y ámbitos (si los está usando):
Asegúrese de que el cliente en la base de datos tenga un ENUM de 1 en la columna "password_client", si no necesita crear uno usando el comando php artisan mencionado anteriormente, al cual haré referencia aquí:
php artisan passport:client --password
Asegúrese de que el secreto que está transmitiendo coincida con el carácter que figura para ese cliente en su base de datos para el carácter
Asegúrese de que la ID que está pasando coincida y sea de un tipo de datos enteros.
Asegúrese de que hay un nombre de algún tipo para el cliente
No se preocupe por la columna user_id cuando use las concesiones de contraseña
Asegúrate de que la ruta sea correcta
Asegúrese de que el correo electrónico en el que ingrese (nombre de usuario) sea un usuario real dentro de su tabla de usuarios dentro de su base de datos (o la tabla que haya personalizado para que el sistema laravel 5.3 acepte como su tabla de usuarios, agregaré un enlace sobre cómo personalizar laravel 5.3 sistema para aceptar una tabla de usuarios diferente como predeterminada si la necesita).
Asegúrate de que el grant_type esté escrito correctamente
Asegúrese de que está configurado para aceptar el token del portador de respuesta (es decir, access_token y refresh_token).
Aparte de eso, los pasos iniciales que he descrito en la parte anterior de esta Respuesta deberían hacer que vuelva al camino correcto. Hay otros aquí que sí mencionaron algunos pasos similares que son útiles, pero también abordan el mismo error que está relacionado con un problema separado (lo cual, estoy seguro, es el resultado de un problema de configuración relacionado con la configuración específica de su sistema).
Espero que esto ayude sin embargo.
Haz que intente ejecutar php artisan config:cache
después de todos los comandos de pasaporte.
Intente crear un nuevo cliente de contraseñas usando el pasaporte de php artisan: client --password, entonces probablemente no se asignará un usuario a ese cliente de contraseñas. edite la fila de la base de datos y agregue una ID de usuario existente a ella.
{
"grant_type": "password,"
"client_id": "" <- edited and added user id
"client_secret": "8BU......," <- new secret
"username": "[email protected]," <- email of above added user id
"password": "123456,"<- password
"scope": ""
}
Espero que puedas obtener token ahora
Logré que el Laravel Passport - Password_Grant_Token funcionara a través de RESTED (POSTMAN como servicio) sin ningún controlador adicional o middlewares. ¡Así es como me las he arreglado para hacerlo!
Instale el Auth-Scaffolding predeterminado en los documentos de laravel aquí
Instala el documento de pasaporte aqui
Registrar un usuario a través de auth-scaffolding
Ir a RESTED o POSTMAN, o cualquier otro servicio similar
Compruebe los datos en la tabla oauth_clients para sus form_params
Con RESTED a través de Request_body_form_data no los encabezados, escriba los formularios de sus formularios y envíe una solicitud POST a * / oauth / token (se requiere url completa)
(los form_params requeridos son grant_type, client_id, client_secret, nombre de usuario y contraseña)
Debería obtener a cambio un objeto con 4 claves (token_type, expires_in, access_token y refresh_token) y un estado de 200 OK.
Si todo fue exitoso hasta ahora ...
Abre otra ventana RESTED:
Envíe una solicitud GET a / api / user (nuevamente se requiere url completa) En los encabezados escriba 2 pares de nombre-valor (Aceptar => aplicación / json, Autorización => Portador ACCESS_TOKEN_GOTTEN_IN_PREVIOUS_REQUEST (a / oauth / token)
Y eso debería ser. Debería obtener un objeto de usuario como respuesta de / api / user.
Primero verifique sus credenciales si son correctas, luego verifique su tabla modelo que usa el rasgo /Laravel/Passport/HasApiTokens
saber si contiene una columna de email
, porque de manera predeterminada se usa para identificar a los usuarios al validar las credenciales. Si su tabla tiene una columna de username
o cualquier otra columna que se use para validar credenciales, debe definir una función findForPassport
en ese modelo. Me gusta esto,
public function findForPassport($username) {
return self::where(''username'', $username)->first(); // change column name whatever you use in credentials
}
Utilizo la columna de nombre de usuario y contraseña para validar un usuario, en {project_directory}/vendor/laravel/passport/src/Bridge/UserRepository.php
esta función valida tus credenciales,
public function getUserEntityByUserCredentials($username, $password, $grantType, ClientEntityInterface $clientEntity)
{
if (is_null($model = config(''auth.providers.users.model''))) {
throw new RuntimeException(''Unable to determine user model from configuration.'');
}
if (method_exists($model, ''findForPassport'')) { // if you define the method in that model it will grab it from there other wise use email as key
$user = (new $model)->findForPassport($username);
} else {
$user = (new $model)->where(''email'', $username)->first();
}
if (! $user || ! $this->hasher->check($password, $user->password)) {
return;
}
return new User($user->getAuthIdentifier());
}
note la segunda declaración if y usted sabrá lo que está sucediendo allí.
espero que esto ayude :)
Puedes definir dos variables como
$client_id = ''111'';
$client_secret = ''1212'';
y la condición está en su función como esta
protected $clientID = ''578324956347895'';
protected $clinetSecret =''hflieryt478'';
public function index(Request $request)
{
if (!($request->input(''clientID'') && $request->input(''clinetSecret''))) {
return false;
}
$project = User::all();
return $project
}
También estaba enfrentando el mismo problema, obtuve la solución de este enlace. Por favor, compruebe eso. https://github.com/laravel/passport/issues/71
Dice que: Llamas a / oauth / token como siempre lo harías para obtener tu token. Pero hazlo con un grant_type de custom_request. Deberá agregar un método byPassportCustomRequest ($ request) a su modelo de usuario (o al modelo que haya configurado para trabajar con Passport). Ese método aceptará un Illuminate / Http / Request y devolverá el modelo de usuario si puede autenticar al usuario a través de la solicitud, o devolverá el valor nulo.
Tuve el mismo problema y lo solucioné configurando los encabezados de basic.auth, con client_id como nombre de usuario y secreto como contraseña.
Entonces funcionó bien.
Verifique la URL de redireccionamiento / devolución de llamada cuando el cliente esté configurado en el servidor de pasaportes. Verifique la entrada donde obtiene el ID de cliente y el secreto de que la URL de redireccionamiento es correcta.
Recibí el mismo error y encontré que la URL de redireccionamiento no era correcta.
Debe estar apuntando a la ruta / callback (en los ejemplos que da Taylor)
use el siguiente código para generar un token de acceso, ya me ha funcionado:
$request->request->add([
''client_id'' => ''2'',
''client_secret'' => ''m3KtgNAKxq6Cm1WC6cDAXwR0nj3uPMxoRn3Ifr8L'',
''grant_type'' => ''password'',
''username'' => ''[email protected]'',
''password'' => ''pass22''
]);
$tokenRequest = $request->create(''/oauth/token'', ''POST'', $request->all());
$token = /Route::dispatch($tokenRequest);
{"error":"invalid_client","message":"Client authentication failed"}
significa que el client_id y el client_secret que está enviando actualmente es uno de los siguientes:
- client_id y client_secret que se envían no se registran en su servidor oauth
- Client_id y client_secret que se envían no es del tipo de concesión que especifique en el cuerpo de la publicación
Para mí, el valor de la columna password_client para ese cliente en particular fue 0. Lo cambié manualmente a 1 pero no ayudó. - Kanav el 4 de octubre a las 3:25.
Cuando leo su comentario sobre algunas de las respuestas, esta es evidente que utiliza el tipo incorrecto de client_id y client_secret para su flujo de concesión de contraseña, por lo que su caso fue el último. Puede verificar que al encontrar la entrada en la tabla oauth_clients para su client_id y client_secret suministrados
"grant_type": "password,"
"client_id": "3,"
"client_secret": "8BUPCSyYEdsgtZFnD6bFG6eg7MKuuKJHLsdW0k6g,"
SELECT * FROM oauth_clients WHERE id = 3 AND secret = ''8BUPCSyYEdsgtZFnD6bFG6eg7MKuuKJHLsdW0k6g'' AND password_client=1;
en su tabla oauth_clients para verificar si existe su client_id y client_secret suministrados para el flujo de concesión de contraseña en su servidor oauth. Y además, no cambia manualmente el tipo de cliente simplemente cambiando el valor de esa columna, tiene que crear un nuevo cliente para el tipo de concesión de contraseña.
php artisan migrate
Este comando migrará el archivo de migración laravel / passport para generar dos clientes predeterminados para cada tipo que laravel / passport admite actualmente. También puede crear un cliente para el flujo de concesión de contraseña con
php artisan passport:client --password
Cuando tenga un nuevo cliente para el tipo de concesión de contraseña, intente realizar POST nuevamente en / oauth / token para generar un token con su nuevo client_id y client_secret