我的Laravel + GatsbyJS應用程式使用auth:sanctum進行登入管理,其他用戶遇到伺服器500錯誤,但我的登入卻正常運行
P粉215292716
2023-09-04 09:08:41
<p>所以我有一個應用程式(後端使用laravel,前端使用GatsbyJS),我正在幫忙開發。
一個月前,所有用戶都能夠無問題地登入。但是我發現現在,所有使用者都無法在生產環境中登入(除了我)。 </p>
<p>login.jsx檔</p>
<pre class="brush:php;toolbar:false;">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/');
}
};</pre>
<p>let response = await login() 呼叫了一個名為login的方法,該方法位於api.js檔案中</p>
<p>api.js檔案</p>
<pre class="brush:php;toolbar:false;">// 登入應用程式
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;
};</pre>
<p>當我們傳遞電子郵件和密碼時,這些資料會進行驗證,此時,所有使用者都能夠產生令牌,沒有問題。 </p>
<p>(僅供參考,產生sanctum令牌的程式碼)
api.php檔</p>
<pre class="brush:php;toolbar:false;">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');</pre>
<p>問題似乎出現在訪問目前受auth:sanctum保護的路由上。再次強調,所有用戶都能夠產生令牌,但只有我的登入詳細資訊允許我存取該路由。
其他所有用戶都會收到伺服器500錯誤。 </p>
<p>這在我們嘗試獲取my_user詳細資訊時發生在api.js檔案中:</p>
<pre class="brush:php;toolbar:false;">let my_user = JSON.stringify(await me(response.data.access_token));</pre>
<p>我遇到的另一個問題是,我的生產環境中的laravel應用程式幾個月前停止輸出錯誤,我無法弄清楚如何修復生產環境中的錯誤日誌記錄問題(在開發環境中,錯誤日誌記錄正常)。</p>
<p>對於缺乏細節,我表示抱歉,我對這一切還很陌生,如果有任何提示或嘗試的事情,我將非常感激,即使我得不到答案,我也非常願意努力學習並解決這個問題。 </p>
為了進一步排查問題,我決定查看為什麼我沒有收到錯誤日誌。
我決定將儲存資料夾及其內容設定為chmod 777
新增-R以遞歸地將內容設定為777
這實際上解決了我的登入問題,但我注意到將權限等級恢復為775後,有些使用者能夠再次登錄,但並非所有使用者。
然後我想,也許我的日誌檔案/資料夾有權限問題,也許這就是為什麼我沒有列印出錯誤日誌的原因?
所以我進一步研究了我的laravel.log檔。結果發現它只能由使用者(ubuntu:ubuntu)讀取。我決定將其群組更改為www-data
這對我非常有幫助,我又能夠在laravel中記錄錯誤日誌了!
現在我看到了我的錯誤,大致如下:
所以我檢查了儲存下的每個權限,發現我的data資料夾只能由使用者存取
我將www-data加入為data資料夾的群組:
現在,我的問題已解決! (注意:我的chmod權限已恢復為775)