Estoy tratando de usar el pasaporte laravel para autenticar a los usuarios. Seguí cada paso en la documentación del pasaporte de laravel. Pero muestra un error cuando accedo a una ruta que está protegida por el middleware 'auth: api'. He buscado en Internet, pero ninguna de las respuestas funciona hasta ahora. Consulte el código y lo que he intentado hasta ahora a continuación.
Tecnología utilizada
Probado hasta ahora:
Passport::routes(); a Passport::routes(null, ['prefix' => 'api/oauth', 'middleware' => ['auth:api', 'web', 'auth']]); en AuthServiceProvider . También probé Passport::routes(null, ['prefix' => 'api/oauth');php artisan cache:clearrutas/api.php
Route::middleware('auth:api')->group(function() { Route::get('user', function() { return request()->user(); }); Route::get('posts', 'PostController@index')->name('posts'); Route::post('posts/store', 'PostController@store')->name('posts.store'); Route::get('posts/{id}/show')->name('posts.show'); Route::get('users/{id}/show')->name('users.show'); });Axios
mounted() { axios.get('/api/posts') .then(res => this.posts = res.data).catch(error => console.log('Unable to fetch posts.')) } Error
Encabezados:
Avíseme si necesita algunos detalles que aún no están indicados en mi publicación.
Configuración
composer require laravel/passport:9 para la instalación.php artisan migrate para las tablas.php artisan passport:install para generar las claves de cifrado.Laravel\Passport\HasApiTokens en el modelo de User .Passport::routes(); en AuthServiceProvider .api de guard a passport en config/auth.php .Código fuente completo:
Creo que deberías revisar tu código con los siguientes pasos.
Paso 1 : el modelo de User debe usar HasApiTokens
... class User extends Authenticatable { use HasApiTokens, Notifiable; } Paso 2 : Método Passport::routes dentro del método de arranque de su AuthServiceProvider
class AuthServiceProvider extends ServiceProvider { ... public function boot() { $this->registerPolicies(); Passport::routes(); } } Paso 3 : en su archivo de configuración config/auth.php , debe establecer la opción de controlador de la protección de autenticación de API en pasaporte
'guards' => [ 'api' => [ 'driver' => 'passport', 'provider' => 'users', ], ], Paso 4 (opcional): si desea consumir su API desde su aplicación de JavaScript, debe enviar manualmente un token de acceso a la aplicación y pasarlo con cada solicitud a su aplicación. Sin embargo, Passport incluye un middleware que puede manejar esto por usted. Todo lo que necesita hacer es agregar el middleware CreateFreshApiToken a su grupo de middleware web en su archivo app/Http/Kernel.php :
'web' => [ // Other middleware... \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class, ], ! Debe asegurarse de que el middleware CreateFreshApiToken sea el último middleware enumerado en su pila de middleware.
Editar (2021/10/17):
Debe intentar agregar el middleware de autenticación a $middlewareGroups de su Kernel.php
protected $middlewareGroups = [ ... 'api' => [ 'throttle:60,1', \Illuminate\Routing\Middleware\SubstituteBindings::class, 'auth:api', //Need to add ], ]; Editar (2021/10/25):
Descargué tu código y lo depuré. Cuando lo depure, obtendrá el siguiente resultado:
El encabezado JWT no es válido para la estructura JSON. Parece que hay una incompatibilidad entre la biblioteca de Laravel Passport y su sistema. Debe verificar la versión de su sistema (PHP, Laravel, etc.). Seguiré investigando. Si tienes alguna información nueva, por favor házmelo saber.
Editar (2021/11/02):
Actualice su dependencia de laravel/framework a ^6.0 en su archivo composer.json. Si está instalado, actualice su dependencia de laravel/passport a ^9.3.2 en su archivo composer.json.
https://laravel.com/docs/6.x/upgrade#updating-dependencies
Según la documentación de Laravel 6.x , la versión de Laravel Passport es de 9.3.2. Por favor, pruebe esta versión.
Si está utilizando el prefijo Api/oauth Y agrega el middleware auth:api de lo que necesita para autenticarse a través de tokens Bearer.
Por lo tanto, es posible que tenga un problema relacionado con el token csrf, así que intente deshabilitarlo a continuación.
Passport::ignoreCsrfToken(true);Debe agregar token bearer en sus solicitudes de ajax. Puede obtenerlo después de un inicio de sesión exitoso.
// laravel use Illuminate\Support\Facades\Auth; use App\Models\User; public function login() { $credentials = request(['email', 'password']); $user = User::where('email', $credentials['email'])->first(); if (!$user || !$token = Auth::attempt($credentials)) { return response()->json(['success'=> false, 'error' => 'неверный логин или пароль', 'cr' => $credentials], 422); } return $this->respondWithToken($token); } // vue login async function login(email, password) { try { const response = await axios.post('/auth/login', {email, password}); const token = response.data.token; // some func to store token, I am using vuex mutations for this storeToken(token); } catch(error) { console.error(error); } }; // vue regular function async function changePassword(newPassword) { // get token from global storage, with vuex it will be like store.state.auth.token const token = getToken(); await axios.post('/user/changePassword', {newPassword}, headers: { Authorization: `Bearer ${token}`}); }