【问题标题】:laravel and jwt: always return Unauthorizedlaravel 和 jwt:总是返回 Unauthorized
【发布时间】:2019-11-07 12:29:50
【问题描述】:

我想使用 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 输出:

【问题讨论】:

  • 您是否在 Authentication 标头中根据您的请求传递令牌?您的请求是否也有 Accept: application/json 标头?
  • @mdexp 我没有使用邮递员
  • 如果可以,您可以将发出请求的相关代码发布到您的后端吗?
  • @mdexp 我已经发布了。这只是使用 axios 的简单请求
  • 您是否手动将用户注册到数据库中?

标签: php laravel authentication jwt


【解决方案1】:

根据 cmets,您没有对插入数据库中的用户的密码进行哈希处理。

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

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

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

【讨论】:

  • thnks 这正是我的问题,使用的数据库不是通过 laravel 生成的
【解决方案2】:

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

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

一切都像魅力一样运作

【讨论】:

    【解决方案3】:

    同样的问题,我解决了:

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

    【讨论】:

      猜你喜欢
      • 2021-10-11
      • 2018-01-26
      • 2015-03-13
      • 1970-01-01
      • 1970-01-01
      • 2020-02-09
      • 2020-08-02
      • 2020-12-15
      • 2020-10-02
      相关资源
      最近更新 更多