Laravel JWTAuth::attempt($credentials) 在 Ubuntu 服务器中不起作用

Posted

技术标签:

【中文标题】Laravel JWTAuth::attempt($credentials) 在 Ubuntu 服务器中不起作用【英文标题】:Laravel JWTAuth::attempt($credentials) not working in Ubuntu Server 【发布时间】:2016-04-28 16:57:16 【问题描述】:

问题:JWTAuth::attempt($credentials) 在我的 Windows 本地机器上工作。当用户通过提供凭据(用户名和密码)调用 /userLogin 时,它会验证凭据并为用户创建一个令牌。但相同的代码:JWTAuth::attempt($credentials) 在我将项目部署到 Ubuntu 服务器时 工作。

说明: 我正在使用 tymondesigns/jwt-auth 在我的 Laravel 5.1 项目中实现 JSON Web Tokens。我已经构建了 2 个 REST API:/userRegister 和 /userLogin。

这是 /userRegisterUserController.php 中的代码:

public function userRegister(Request $request)

    $validator = Validator::make($request->all(), [
        'email' => 'required',
        'username' => 'required',
        'password' => 'required',
        'country' => 'required',
        'zip_code' => 'required',
        'date_time' => 'required',
        'gender' => 'required',
    ]);

    try
    
        if ($validator->fails())
            throw new Exception($validator->errors(), 409);

        $name = $request->input('name');
        $email = $request->input('email');
        $username = $request->input('username');
        $password = bcrypt($request->input('password'));
        $country = $request->input('country');
        $zip_code = $request->input('zip_code');
        $fb_login = $request->input('fb_login');
        $registration_date = $request->input('date_time');
        $gender = $request->input('gender');

        $user_email = UserProfile::where('email','=',$email)->first();
        if($user_email!=null)
        
            throw new Exception("User with this email is already registered");
        

        $check_username = UserProfile::where('username','=', $username)->first();
        if ($check_username != null)
        
            throw new Exception("User with this username is already registered. Please use different username");
        

        $saveUser = new UserProfile();
        $saveUser->name=$name;
        $saveUser->email=$email;
        $saveUser->username=$username;
        $saveUser->password=bcrypt($password);
        $saveUser->country=$country;
        $saveUser->zipcode=$zip_code;
        $saveUser->gender=$gender;
        $saveUser->fb_login=$fb_login;
        $saveUser->registration_date=$registration_date;

        $build_trial_date = new Carbon($registration_date);
        $trial_end_date = $build_trial_date->addDays(30);
       
        $saveUser->trial_end_date=$trial_end_date;
        $result = $saveUser->save();
        if (!$result)
            throw new Exception("Error in registration. Please try again.");

        $user_id = $saveUser->id;
        $loginUser = UserProfile::find($user_id);
        $loginUser->update(['logged_in' => 1]);

        return ResponseService::buildSuccessResponse("User registered successfully");
    
    catch(Exception $e)
    
        $data = [
            'error' => true,
            'result'  => [
                'status_code'   => $e->getCode(),
                'message'       => $e->getMessage(),
            ]
        ];
        $result = ResponseService::buildFailureResponse($data);
        return $result;
    

如您所见,我在保存密码之前使用了 bcrypt()

现在,这是 UserController 中 /userLogin 的代码:

public function userLogin(Request $request)

    // grab credentials from the request
    $credentials = $request->only('username', 'password');
    Log::info("username and password obtained from Request: ".json_encode($credentials));

    try
    
        if(JWTAuth::attempt($credentials)) // For Logging
        
            Log::info("$ token = JWTAuth::attempt $ credentials Result: TRUE");
        else
            Log::info("$ token = JWTAuth::attempt $ credentials Result: FALSE");
        

        // attempt to verify the credentials and create a token for the user
        if (! $token = JWTAuth::attempt($credentials))
        
            return response()->json(['error' => 'invalid_credentials'], 401);
        
     catch (JWTException $e) 
        // something went wrong whilst attempting to encode the token
        return response()->json(['error' => 'could_not_create_token'], 500);
    

    Log::info("Generated token is: ".json_encode(compact('token')));
    // all good so return the token
    return response()->json(compact('token'));

/userRegistration Api 也在我的 Windows 本地 m/c 中工作 就像在 Ubuntu 服务器中一样。密码上的 bcrypt() 也在工作 它。

但是,/userLogin 在我的 Windows 本地 m/c 中工作,但在我的本地 m/c 中不工作 Ubuntu 服务器。

帮我解决这个无声无息的错误。 TIA。

更多细节: 我还在我的 Windows 和 ubuntu 服务器中交叉检查了 jwt.php 文件。他们有相同的配置。我也在 ubuntu 服务器上使用了 php artisan jwt:generate

【问题讨论】:

【参考方案1】:

当我再次检查代码时,我终于可以解决问题了。幸运的是,我注意到了!这是我犯的错误。在某个时间点,我添加了此代码 bcrypt(),如下所示:

$password = bcrypt($request->input('password')); 

但在将 $password 保存到数据库之前,我已经在使用 bcrypt()。

$saveUser = new UserProfile();
$saveUser->password=bcrypt($password);

由于它在保存到数据库之前加密了两次,所以当我调用 /userLogin api 时,JWTAuth::attempt($credentials) 正在检查凭据并且无法验证。所以我在一个地方删除了 bcrypt() ,现在它工作正常。 [已解决]。

【讨论】:

以上是关于Laravel JWTAuth::attempt($credentials) 在 Ubuntu 服务器中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

laravel 判断 改了哪个定位

使用 laravel 安装程序创建 laravel 项目

Laravel:laravel 可翻译插件

win 怎么laravel命令

laravel 安装失败

laravel validator怎么验证整数