Mon application Laravel + GatsbyJS utilise auth:sanctum pour la gestion des connexions, d'autres utilisateurs reçoivent des erreurs du serveur 500, mais ma connexion fonctionne correctement
P粉215292716
2023-09-04 09:08:41
<p>J'ai donc une application (utilisant Laravel pour le backend et GatsbyJS pour le frontend) que j'aide à développer.
Il y a un mois, tous les utilisateurs pouvaient se connecter sans problème. Mais j'ai découvert que désormais, tous les utilisateurs ne peuvent pas se connecter à l'environnement de production (sauf moi). </p>
<p>fichier login.jsx</p>
<pre class="brush:php;toolbar:false;">const formChanged = async (e) =>
setError(faux);
e.preventDefault();
setSubmitting(true);
laissez loginData = getValues();
let réponse = attendre la connexion (loginData.email, loginData.password);
setSubmitting(faux);
si (réponse.erreur) {
setErreur(vrai);
setValue('mot de passe', '');
} autre {
naviguer('/app/idm/');
}
};</pré>
<p>let réponse = wait login() appelle une méthode nommée login, qui se trouve dans le fichier api.js</p>
<p>fichier api.js</p>
<pre class="brush:php;toolbar:false;">// Connectez-vous à l'application
export const login = async (email, mot de passe) =>
// envoyer une demande
let réponse = wait makeRequest('post', '/login', { email, mot de passe });
// S'il n'y a pas d'erreur, définissez le jeton et l'utilisateur
if (!response.error && isBrowser()) {
localStorage.setItem('idm_token', réponse.data.access_token);
let my_user = JSON.stringify(attendez-moi(response.data.access_token));
localStorage.setItem('idm_user', mon_user);
}
réponse de retour ;
};</pré>
<p>Lorsque nous transmettons l'e-mail et le mot de passe, ces données sont vérifiées et à ce stade, tous les utilisateurs peuvent générer des jetons sans problème. </p>
<p> (Pour référence uniquement, le code pour générer le jeton du sanctuaire)
fichier api.php</p>
<pre class="brush:php;toolbar:false;">Route::post('/login', function(Request $request) {
$login = $request->only('email', 'mot de passe');
if (Auth::attempt($login)) {
$user = Utilisateur::where('email', $request['email'])->firstOrFail();
$token = $user->createToken('auth_token')->plainTextToken;
retourner la réponse()->json([
'access_token' => $jeton,
'token_type' => 'Porteur'
]);
}
return réponse()->json(["message" => "Échec de l'authentification"], 401);
})->name('api.login');</pre>
<p>Le problème semble être lié à l'accès aux routes actuellement protégées par auth:sanctum. Encore une fois, tous les utilisateurs sont capables de générer des jetons, mais seules mes informations de connexion me permettent d'accéder à l'itinéraire.
Tous les autres utilisateurs recevront une erreur de serveur 500.</p>
<p>Cela se produit dans le fichier api.js lorsque nous essayons d'obtenir les détails de mon_utilisateur : </p>
<pre class="brush:php;toolbar:false;">let my_user = JSON.stringify(attendez-moi(response.data.access_token));</pre>
<p>Un autre problème que je rencontre est que mon application Laravel en production a cessé de générer des erreurs il y a quelques mois et je n'arrive pas à comprendre comment résoudre le problème de journalisation des erreurs en production (en développement, la journalisation des erreurs est OK). </p>
<p>Désolé pour le manque de détails, je suis très nouveau dans tout cela et s'il y a des conseils ou des choses à essayer, je l'apprécierais vraiment, même si je n'obtiens pas de réponse, je suis plus que prêt à travailler sur l’apprentissage et la résolution de cette question. </p>
Pour résoudre davantage le problème, j'ai décidé d'examiner pourquoi je ne recevais pas les journaux d'erreurs.
J'ai décidé de chmod 777 le dossier de stockage et son contenu
Ajoutez -R pour définir de manière récursive le contenu sur 777
Cela a en fait résolu mon problème de connexion, mais j'ai remarqué qu'après avoir restauré le niveau d'autorisation à 775, certains utilisateurs ont pu se reconnecter, mais pas tous.
Ensuite, j'ai pensé : j'ai peut-être un problème d'autorisation avec mon fichier/dossier journal et c'est peut-être pour cela que je n'imprime pas le journal des erreurs ?
J'ai donc examiné plus en détail mon fichier laravel.log. Il s'avère qu'il ne peut être lu que par l'utilisateur (ubuntu : ubuntu). J'ai décidé de changer son groupe en www-data
Cela m'est très utile, je peux à nouveau enregistrer les erreurs dans Laravel !
Maintenant, je vois mon erreur, à peu près comme suit :
J'ai donc vérifié toutes les autorisations sous stockage et constaté que mon dossier de données n'est accessible que par l'utilisateur
J'ai ajouté www-data en tant que groupe au dossier data :
Maintenant, mon problème est résolu ! (Remarque : mes autorisations chmod ont été restaurées à 775)