laravel和jwt:始终返回未授权

时间:2019-06-25 15:56:31

标签: php laravel authentication jwt

我想使用JWT登录我的API,但它总是给我 错误:“未经授权”。

在此之前,我已经在尝试登录之前在数据库中注册了用户的电子邮件和密码

这是我的代码:

veryCoolThingExists

这是我的保护,默认为config / auth.php:

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');
    }

这是我使用VueJs进行登录的前端:

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

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

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

这是我的web.php:

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);
                })

这是我的Route::group(['prefix' => 'api'], function() { Route::post('/register', 'UserController@register'); Route::post('/login', 'UserController@login'); }); 的输出: php artisan route:list

3 个答案:

答案 0 :(得分:1)

基于注释,您不会对插入数据库中的用户的密码进行哈希处理。

但是您必须这样做,因为Auth::attempt检查所提供的密码是否与数据库中存储的哈希匹配。

如果您仍然想手动注册用户,则可以使用php artisan tinker命令连接修补程序交互式shell,然后使用设置的Laravel密码哈希系统(默认设置)使用用户Hash::make('yourpassword')生成哈希密码。进行加密)。

然后,您只需要将输出字符串复制到数据库中即可。登录应该最终可以正常工作,因为Auth Guard现在可以再次检查用户输入,然后使用正确的哈希密码再次检查正确的数据库用户。

答案 1 :(得分:0)

我遇到了完全不同的问题。
由于某些原因,auth()->attempt方法未将密码与我的User模型密码进行比较。
将以下内容添加到我的User模型中之后:

public function getAuthPassword() {
    return $this->password;
}  

一切都像魅力一样

答案 2 :(得分:-1)

同样的问题,我解决了:

  1. 使用 tinker 生成用户凭据、电子邮件和密码
  2. 标题中的内容类型:application/x-www-form-urlencoded