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