laravel5.8 authentication jwt


fuente original:

https://blog.ezteven.com/tech/2019/05/30/utiliza-jwt-con-laravel-para-apis.html
creamos el proyecto:

composer create-project --prefer-dist laravel/laravel webpage "5.8.*"


en la carpeta del proyecto creado:

composer require tymon/jwt-auth:1.0.*

actualizar las librerias:

composer update

[para linux] cambiar el owner de la carpeta del proyecto:

desde la carpeta superior a la del proyecto...

sudo chown -R ibazan:ibazan webpage

generar la key para jwt:

php artisan jwt:secret


publicar el servicio:

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

el modelo de user:

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Foundation\Auth\User  as Authenticatable;

class  User  extends  Authenticatable  implements  JWTSubject {
use  Notifiable;

protected  $fillable = [
'name', 'surname', 'email', 'password',
];

protected  $hidden = [
'password', 'remember_token',
];

protected  $casts = [
'email_verified_at' => 'datetime',
];

public  function  getJWTIdentifier() {
return  $this->getKey();
}

public  function  getJWTCustomClaims() {
return [];
}
}

editamos config/auth.php

'guards' => [
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
],

creamos el AuthController:

php artisan make:controller AuthController

editamos el AuthController.php:

use App\Http\Requests\RegisterAuthRequest;
use App\User;
use Illuminate\Http\Request;
use  JWTAuth;
use Tymon\JWTAuth\Exceptions\JWTException;
class  AuthController extends  Controller {
public  $loginAfterSignUp = true;

public  function  register(Request  $request) {
$user = new  User();
$user->name = $request->name;
$user->surname = $request->surname;
$user->email = $request->email;
$user->password = bcrypt($request->password);
$user->save();

if ($this->loginAfterSignUp) {
return  $this->login($request);
}

return  response()->json([
'status' => 'ok',
'data' => $user
], 200);
}

public  function  login(Request  $request) {
$input = $request->only('email', 'password');
$jwt_token = null;
if (!$jwt_token = JWTAuth::attempt($input)) {
return  response()->json([
'status' => 'invalid_credentials',
'message' => 'Correo o contraseña no válidos.',
], 401);
}

return  response()->json([
'status' => 'ok',
'token' => $jwt_token,
]);
}

public  function  logout(Request  $request) {
$this->validate($request, [
'token' => 'required'
]);

try {
JWTAuth::invalidate($request->token);
return  response()->json([
'status' => 'ok',
'message' => 'Cierre de sesión exitoso.'
]);
} catch (JWTException  $exception) {
return  response()->json([
'status' => 'unknown_error',
'message' => 'Al usuario no se le pudo cerrar la sesión.'
], 500);
}
}

public  function  getAuthUser(Request  $request) {
$this->validate($request, [
'token' => 'required'
]);

$user = JWTAuth::authenticate($request->token);
return  response()->json(['user' => $user]);
}
}

creamos las rutas a las apis:

use Illuminate\Http\Request;

// estas rutas se pueden acceder sin proveer de un token válido.
Route::post('/login', 'AuthController@login');
Route::post('/register', 'AuthController@register');
// estas rutas requiren de un token válido para poder accederse.
Route::group(['middleware' => 'jwt.auth'], function () {
    Route::post('/logout', 'AuthController@logout');
});

editar en Http/Kernel.php:

protected $routeMiddleware = [
  ...
 'jwt.auth' => \Tymon\JWTAuth\Middleware\GetUserFromToken::class,
];

Adicionalmente podemos añadir al comienzo del public\index.php el siguiente código para evitar error de CORS durante nuestras pruebas:

// permite peticiones desde cualquier origen
header('Access-Control-Allow-Origin: *');
// permite peticiones con métodos GET, PUT, POST, DELETE y OPTIONS
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
// permite los headers Content-Type y Authorization
header('Access-Control-Allow-Headers: Content-Type, Authorization');

..y eso es todo!

ya podemos probar el registro:


post: http://127.0.0.1:8000/api/register

{
"name":"juan",
"surname":"perez",
"email":"jperez@mail.com",
"password":"123456",
}

lo que devolvera

{
"status":"ok",
"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC8xMjcuMC4wLjE6ODAwMFwvYXBpXC9yZWdpc3RlciIsImlhdCI6MTU2ODA1MDI2MywiZXhwIjoxNTY4MDUzODYzLCJuYmYiOjE1NjgwNTAyNjMsImp0aSI6ImtnOElmbmxJQ2w3TXJPUWoiLCJzdWIiOjIsInBydiI6Ijg3ZTBhZjFlZjlmZDE1ODEyZmRlYzk3MTUzYTE0ZTBiMDQ3NTQ2YWEifQ.6rMzjaqKneDgMtr0DVlCQGoFZVUhi7ZSOjH3EoF0HWU"
}

para desloguearnos debemos enviar el token, por ejemplo como parametro
post: http://127.0.0.1:8000/api/logout
{
"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC8xMjcuMC4wLjE6ODAwMFwvYXBpXC9yZWdpc3RlciIsImlhdCI6MTU2ODA1MDI2MywiZXhwIjoxNTY4MDUzODYzLCJuYmYiOjE1NjgwNTAyNjMsImp0aSI6ImtnOElmbmxJQ2w3TXJPUWoiLCJzdWIiOjIsInBydiI6Ijg3ZTBhZjFlZjlmZDE1ODEyZmRlYzk3MTUzYTE0ZTBiMDQ3NTQ2YWEifQ.6rMzjaqKneDgMtr0DVlCQGoFZVUhi7ZSOjH3EoF0HWU"
}

lo que devolvera

{
"status": "ok",
"message": "Cierre de sesión exitoso."
}




No hay comentarios:

Publicar un comentario

linux ubuntu mint actualizar chrome

 desde una terminal: $ sudo apt update $ sudo apt install google-chrome-stable