我的Laravel + GatsbyJS应用使用auth:sanctum进行登录管理,其他用户遇到服务器500错误,但我的登录却正常运行
P粉215292716
P粉215292716 2023-09-04 09:08:41
[PHP讨论组]

所以我有一个应用程序(后端使用laravel,前端使用GatsbyJS),我正在帮助开发。 一个月前,所有用户都能够无问题地登录。但是我发现现在,所有用户都无法在生产环境中登录(除了我)。

login.jsx文件

const formChanged = async (e) => {
    setError(false);
    e.preventDefault();
    setSubmitting(true);
    let loginData = getValues();
    let response = await login(loginData.email, loginData.password);
    setSubmitting(false);
    if (response.error) {
      setError(true);
      setValue('password', '');
    } else {
      navigate('/app/idm/');
    }
  };

let response = await login() 调用了一个名为login的方法,该方法位于api.js文件中

api.js文件

// 登录应用程序
export const login = async (email, password) => {

  // 发送请求
  let response = await makeRequest('post', '/login', { email, password });

  // 如果没有错误,设置令牌和用户
  if (!response.error && isBrowser()) {
    localStorage.setItem('idm_token', response.data.access_token);
    let my_user = JSON.stringify(await me(response.data.access_token));
    localStorage.setItem('idm_user', my_user);
  }

  return response;
};

当我们传递电子邮件和密码时,这些数据会进行验证,此时,所有用户都能够生成令牌,没有问题。

(仅供参考,生成sanctum令牌的代码) api.php文件

Route::post('/login', function(Request $request) {
    $login = $request->only('email', 'password');

    if (Auth::attempt($login)) {
        $user = User::where('email', $request['email'])->firstOrFail();
        
        $token = $user->createToken('auth_token')->plainTextToken;

        return response()->json([
            'access_token' => $token,
            'token_type' => 'Bearer'
        ]);
    }

    return response()->json(["message" => "认证失败"], 401);
})->name('api.login');

问题似乎出现在访问当前受auth:sanctum保护的路由上。再次强调,所有用户都能够生成令牌,但只有我的登录详细信息允许我访问该路由。 其他所有用户都会收到服务器500错误。

这在我们尝试获取my_user详细信息时发生在api.js文件中:

let my_user = JSON.stringify(await me(response.data.access_token));

我遇到的另一个问题是,我的生产环境中的laravel应用程序几个月前停止输出错误,我无法弄清楚如何修复生产环境中的错误日志记录问题(在开发环境中,错误日志记录正常)。

对于缺乏细节,我表示抱歉,我对这一切还很陌生,如果有任何提示或尝试的事情,我将非常感激,即使我得不到答案,我也非常愿意努力学习并解决这个问题。

P粉215292716
P粉215292716

全部回复(1)
P粉734486718

为了进一步排查问题,我决定查看为什么我没有收到错误日志。

我决定将存储文件夹及其内容设置为chmod 777

chmod -R 777 storage/

添加-R以递归地将内容设置为777

这实际上解决了我的登录问题,但我注意到将权限级别恢复为775后,一些用户能够再次登录,但并非所有用户。

然后我想,也许我的日志文件/文件夹存在权限问题,也许这就是为什么我没有打印出错误日志的原因?

所以我进一步研究了我的laravel.log文件。结果发现它只能由用户(ubuntu:ubuntu)读取。我决定将其组更改为www-data

chown ubuntu:www-data laravel.log

这对我非常有帮助,我又能够在laravel中记录错误日志了!

现在我看到了我的错误,大致如下:

production.ERROR: Unable to create lockable file: /var/www/main/backend/storage/framework/cache/data/d5/........etc...etcc

所以我检查了存储下的每个权限,发现我的data文件夹只能由用户访问

我将www-data添加为data文件夹的组:

chown ubuntu:www-data data

现在,我的问题已解决!(注意:我的chmod权限已恢复为775)

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号