我想使用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');
});
的输出:
答案 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)
同样的问题,我解决了:
application/x-www-form-urlencoded