laravel и jwt: всегда возвращать неавторизованным - PullRequest
0 голосов
/ 25 июня 2019

Я хочу использовать JWT для входа в мой API, но это всегда дает мне ошибка: «Несанкционированный».

До этого я уже регистрировал электронную почту и пароль пользователя в своей базе данных, прежде чем пытаться войти

вот мой код:

class UserController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth:api', ['except' => 'login']);
    }

    public function login(Request $request) {
        $validator = Validator::make($request->all(), [
            'email' => 'required|email|max:255',
            'password' => 'required|string|min:6|max:255',
        ]);

        if($validator->fails()) {
            return response()->json([
                'status' => 'error',
                'messages' => $validator->messages()
            ], 200);
        }

        if (! $token = auth()->attempt(['email' => $request->email, 'password' => $request->password])) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }

        return $this->respondWithToken($token);
    }

    protected function respondWithToken($token) {
        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => Auth::guard()->factory()->getTTL() * 60
        ]);
    }

    /**
     * Get the guard to be used during authentication.
     *
     * @return \Illuminate\Contracts\Auth\Guard
     */

    public function guard()
    {
        return Auth::guard('api');
    }

вот моя защита и значение по умолчанию в config / auth.php:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

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

'defaults' => [
        'guard' => 'api',
        'passwords' => 'users',
   ],

вот мой интерфейс, использующий VueJs, который выполняет вход:

axios.post('http://localhost:8000/api/login', loginData)
                .then(response => {
                    console.log(response)
                })
                .catch(error => {
                    commit('loginStop', error.response.data.error);
                    commit('updateAccessToken', null);
                    console.log(error.response);
                })

вот мой web.php:

Route::group(['prefix' => 'api'], function() {
    Route::post('/register', 'UserController@register');
    Route::post('/login', 'UserController@login');
});

Вот мой вывод php artisan route:list: php artisan route:list

1 Ответ

1 голос
/ 25 июня 2019

Судя по комментариям, вы не хэшируете пароль пользователя, которого вы вставили в базу данных.

Но вы должны сделать это, поскольку Auth::attempt проверяет, будет ли предоставленный пароль соответствовать хешу, хранящемуся в базе данных.

Если вы все еще хотите зарегистрировать пользователя вручную, вы можете подключить интерактивную оболочку tinker с помощью команды php artisan tinker, а затем пользователя Hash::make('yourpassword'), чтобы сгенерировать хешированный пароль, используя установленную систему хеширования паролей Laravel (по умолчанию bcrypt).

Тогда вам просто нужно скопировать строку вывода в вашу базу данных. Наконец, логин должен работать, так как Auth Guard теперь может проверять введенные пользователем данные о правильном пользователе базы данных с правильным хешированным паролем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...