[PYTHON] L'histoire de voir des yeux douloureux en regardant gentiment autour de l'authentification (essayez d'introduire l'authentification à l'aide de django-allauth)

introduction

Cette fois, en 6 semaines, j'ai participé à un projet allant du team building à la sortie du produit. Veuillez consulter le lien ci-dessous pour l'ensemble du projet. J'aimerais que vous lisiez les articles et les articles passés sur moi, mais bref, je suis inexpérimenté et je recherche un ingénieur.

Cliquez ici pour le projet

Calme, cet article parle de la partie authentification des fonctionnalités dont j'étais en charge pour le projet. Il existe de nombreuses possibilités de mettre en œuvre des fonctions liées à la soi-disant authentification telles que l'inscription, la connexion, la déconnexion, la réinitialisation du mot de passe, la réinitialisation de l'adresse e-mail, etc. Pour les débutants, cela se sent comme une compétence incontournable et donne envie de prendre l'initiative. Cette fois, c'est un package qui sera une option lors de l'introduction de la connexion sociale avec Django avec l'histoire que j'ai essayée et ressentie amèrement en développant en équipe. Je voudrais approfondir un peu l'introduction de django-allauth.

Ce que vous pouvez faire avec django-allauth

Comme vous pouvez le voir, si vous l'introduisez, vous serez en mesure de faire toutes les choses nécessaires autour de l'authentification. Cependant, ceux-ci sont utilisés d'une manière qui remplace la fonction d'authentification standard de Django, donc comme moi

** Peut-être que ce sera possible si vous le faites en regardant le site de commentaires **

Si vous avez une idée douce comme Cela ne fonctionne pas comme prévu et vous aurez du mal.

Points à garder à l'esprit lors de la mise en œuvre de l'authentification en premier lieu

Cette fois, j'ai participé à un projet de création d'une application Web en équipe (ci-après dénommé projet), et j'étais en charge d'environ deux fonctions de l'application là-bas, et j'étais également en charge de l'authentification séparément. Telle est la prémisse de cette histoire.

Alors, voici quelques éléments à garder à l'esprit lors de la mise en œuvre de l'authentification que vous avez ressentie lorsque vous avez participé au projet et que vous l'avez réellement développé en équipe. (J'ai honte de dire que je suis toujours à la recherche d'un emploi et que je n'ai aucune expérience de travail réelle, alors j'espère que vous le prendrez comme un sentiment.)

――Au premier MTG, le PL et la personne en charge de la conception et du modèle utilisateur et de la méthode d'authentification sont soigneusement frottés et les spécifications sont décidées.

→ Le modèle utilisateur est indissociable de l'authentification, et en même temps, pour les applications Web, le modèle utilisateur a tendance à avoir une relation de référence avec le modèle utilisé pour chaque fonction et la première clé externe. En d'autres termes, une fois le modèle utilisateur migré, il ne peut pas être changé et je pense qu'il vaut mieux ne pas le faire en premier lieu. Par conséquent, j'ai pensé qu'il serait plus facile d'éviter les problèmes si nous avions la conception des concepteurs après avoir partagé leurs points de vue sur les spécifications de conception et de certification lors du premier MTG et sélectionné les packages à adopter. C'était. En ayant négligé cela lorsque j'étais en charge de cette époque, j'ai fini par réécrire le modèle de manière arbitraire et décider arbitrairement des spécifications, ce qui a abouti à une implémentation non meilleure. C'était une très mauvaise chose pour le développement de l'équipe ...

--Il est préférable d'implémenter d'abord la fonction d'authentification

Comme mentionné ci-dessus, l'authentification est indissociablement liée au modèle utilisateur. Par exemple, si vous remplacez l'authentification standard Django par une authentification utilisant un package comme celui-ci, vous ne comprendrez pas le package et ne vous y habituerez pas. Il existe de nombreux endroits où il y a des inconvénients ou des problèmes dus à des facteurs tels que le manque. Dans ce cas, il sera nécessaire de redéfinir le modèle utilisateur et de refaire la migration, mais si vous faites cela, une erreur de dépendance apparaîtra côté DB, et dans ce cas, initialement django-allauth Je n'avais pas décidé d'introduire , j'ai donc dû modifier le répertoire et le nombre de tâches inattendues a augmenté. De plus, certaines fonctions ne peuvent être développées que si l'authentification est implémentée, et cette fonction était également disponible dans ce projet, mais en raison du report de l'authentification cette fois, le développement de cette fonction sera retardé. Un problème est survenu. (Cela a également été mentionné comme un point sur lequel PL devrait réfléchir)

À propos de django-allauth

Ce que vous pouvez faire avec l'introduction est comme je l'ai écrit au début. Pour l'installer, appuyez sur la commande install avec pip, etc.

#Exemple
pip install django-allauth

Après l'installation, ajoutez les éléments suivants au fichier settigs.py de Django


AUTHENTICATION_BACKENDS = [
    ...
    # Needed to login by username in Django admin, regardless of `allauth`
    'django.contrib.auth.backends.ModelBackend',

    # `allauth` specific authentication methods, such as login by e-mail
    'allauth.account.auth_backends.AuthenticationBackend',
    ...
]

INSTALLED_APPS = [
    ...
    'django.contrib.sites',
    'allauth',
    'allauth.account',
    'allauth.socialaccount',

    #Veuillez spécifier le fournisseur social que vous souhaitez utiliser pour la connexion sociale. Vous pouvez en spécifier plusieurs
    'allauth.socialaccount.providers.google',
]

SITE_ID = 1


C'est tout pour les éléments minimaux à spécifier. Si vous avez affaire à Django, vous connaissez probablement la partie TEMPLATE et les paramètres du dossier statique, je vais donc omettre les détails. La plupart des modèles sont spécifiés par templates, mais si vous souhaitez créer un dossier séparé et gérer tous les modèles utilisés par allauth, veuillez les définir individuellement.

Après cela, ajoutez les éléments suivants à urls.py (le fichier dans le même répertoire que settings.py, non préparé pour chaque application).


urlpatterns = [
    ...
    path('accounts/', include('allauth.urls')),
    ...
]

Après cela, c'est OK si vous routez comme suit dans urls.py (application avec modèle utilisateur) dans l'application de la fonction d'authentification.

from django.contrib import admin
from django.urls import include, path
from django.views.generic import TemplateView

app_name = 'accounts'

urlpatterns = [
    path('accounts/login/',
         TemplateView.as_view(template_name='login.html'), name='login'),
    path('accounts/logout/',
         TemplateView.as_view(template_name='logout.html'), name='logout'),
    path('accounts/signup/',
         TemplateView.as_view(template_name='signup.html'), name='signup'),
]


Après cela, veuillez migrer. Consultez également la section de dépannage ci-dessous pour la migration. Après la migration, créez un utilisateur administrateur avec la commande create superuser et accédez au site d'administration. Veuillez vous référer au document de l'article de référence tel que le paramétrage lié à l'authentification avec django-allauth.

Au fait, si vous installez django-allauth et migrez, en plus de la valeur par défaut et de chaque modèle d'application

--Site --Compte --Compte social

 allauthモデル.png

Trois modèles sont automatiquement ajoutés. Parmi eux, il est nécessaire d'enregistrer la clé de chaque fournisseur social comme indiqué dans l'image ci-dessous dans le modèle de compte social. Vous pouvez également le spécifier avec settings.py, mais cette fois j'ai pris la forme d'entrer sur le site de gestion et de m'inscrire.

socialモデル.png

Tout ce que vous avez à faire est de créer un modèle et vous avez terminé. Bien sûr, vous pouvez également appliquer CSS. Cependant, c'est difficile pour ceux qui ne sont pas familiers avec le mécanisme des templates, et le personnaliser de django-allauth est un peu compliqué référence, donc l'auteur Je pense que c'est une bonne idée d'emprunter la partie modèle de l'un des référentiels, de l'appliquer et de la modifier tout en vérifiant comment elle est réellement affichée sur le navigateur à l'aide de l'outil de développement. Surtout si vous souhaitez appliquer CSS individuellement, il est honnêtement gênant d'utiliser simplement le modèle, nous vous recommandons donc de le faire dans ce processus.

Dépôt django-allauth

Comme procédure

  1. Créez un dossier de compte sous les modèles. Si vous souhaitez introduire une connexion sociale, créez également un dossier de compte social
  2. Gérez les modèles d'écran d'authentification autres que la connexion sociale dans le compte et gérez les modèles de connexion sociale dans le dossier socialaccount.

C'est juste ça. En ce qui concerne l'application de CSS, c'est la même que celle de Django ordinaire, donc je vais l'omettre.

Éléments adoptés dans ce projet

Le but de ce projet est les trois points suivants.

—— Création d'un espace pour les participants à concevoir

—— Expérience des procédures et méthodes de développement d'équipe

――Après avoir accordé la priorité aux deux points ci-dessus, nous améliorerons le degré de perfection en tant qu'application Web dans la mesure du possible.

Cette fois, comme mentionné ci-dessus, ce qui a été implémenté lors de l'utilisation de django-allauth

--Fonction d'authentification normale (connexion, déconnexion, enregistrement des membres)

Il n'y avait que deux points. Ceci est le résultat de ma méconnaissance de django-allauth et du fait que la progression des autres participants ralentissait en raison de ne pas donner la priorité au travail d'authentification. À l'origine au moins en plus de ce qui précède

Je pense que c'est une grande réflexion que je ne pourrais pas faire cela parce que j'aurais dû inclure les 5 points.

Traitement lié à la session

Dans des tâches supplémentaires

** Liez les résultats de l'enquête aux utilisateurs enregistrés à partir de la session lorsque le bouton de création de compte est enfoncé **

Depuis qu'on m'a donné l'ajout de traitement, cela correspond.


#Code de traitement spécifique
def update_question_result(user_info, question_result_info):
    question_result_obj = QuestionResult.objects.get(
        id=question_result_info)
    user_obj = CustomUser.objects.get(id=user_info)
    question_result_obj.customuser_obj = user_obj
    data_to_update = question_result_obj.save()

    return data_to_update


#Code pour appeler et utiliser le processus ci-dessus(views.La partie qui frappe py)
class Top(LoginRequiredMixin, View):
    def get(self, request, *args, **kwargs):
        if 'unsaved_answer' in self.request.session and self.request.session['unsaved_answer'] == True:
            user_info = self.request.user.id
            question_result_info = self.request.session["primary_key"]
            update_question_result(user_info, question_result_info)
            self.request.session['unsaved_answer'] = False
        return render(request, 'top/top_page.html', context=context)


Le code de la partie de traitement est extrait du code réel. En fait, le premier code est défini dans un autre fichier .py, et il est appelé et utilisé par le deuxième code défini dans le fichier correspondant à views.py.

En tant que processus

  1. Le contenu du questionnaire est enregistré dans la base de données lorsque vous répondez au questionnaire.
  2. À ce moment-là, si l'utilisateur n'est pas connecté, il sera marqué comme «['unsaved_answer'] == True» dans la session.
  3. Après cela, créez un compte et la connexion sera terminée en même temps que vous redirigez vers la page d'accueil, donc si vous vérifiez la session à ce moment-là et cochez l'indicateur ['unsaved_answer'] == True, à partir des informations utilisateur L'identifiant utilisateur est acquis, les informations utilisateur sont acquises sous la forme d'un objet de la table CustomUser en utilisant cela comme clé, et le processus de mise à jour est effectué pour le question_result_obj.customuser_obj de l'enregistrement enregistré en 1 avec ce contenu. .. Puisque question_result_obj.customuser_obj est enregistré en tant qu'objet à cause de la clé primaire et de la relation, une erreur se produira si l'objet n'est pas mis à jour.

dépannage

→ Cela n'est pas limité à django-allauth, mais lors de la migration d'un modèle utilisateur, il y a une forte possibilité qu'une erreur se produise dans la dépendance si la migration est effectuée pour la commodité d'en faire une relation de référence avec une clé externe ou similaire. Alors avant de t'y habituer

  1. Effectuez make migraton et migrate individuellement pour chaque modèle utilisé dans chaque application (spécifiez le nom de l'application après chaque commande)
  2. Faites make migraton et migrate de django.contrib.admin et django.contrib.auth
  3. Après avoir configuré l'installation de django-allauth, effectuez à nouveau make migraton et migrate.

Je pense que vous devriez prendre des mesures telles que.

--Je veux migrer à nouveau

→ Supprimez le fichier de base de données et le dossier Migrations de chaque application, commentez ou supprimez toutes les parties liées à django-allauth de settings.py et ʻurls.py, puis effectuez des migrationsdans chaque application. Et puis exécutez la commandemigrate. Au fait, si une erreur se produit autour de django.contrib.admin ou django.contrib.auth et que vous ne pouvez pas migrer correctement, vous pouvez également commenter chaque élément de settings.py` pour le surmonter. Peut être possible.

Je ne peux pas m'empêcher de penser que la plupart des problèmes liés à l'authentification sont liés à la migration, donc je suis également troublé cette fois, alors j'espère que cela aide s'il y a une personne similaire.

À la fin

L'authentification est standard si vous utilisez un framework, vous pouvez donc le faire si vous voulez l'implémenter, mais c'est difficile si vous essayez de le faire correctement ou de faire quelque chose d'un peu différent. Après tout, on m'a rappelé que je ne devais pas lécher la certification.

Une autre chose que j'ai remarquée dans ce projet est que la méthode de certification doit être décidée de manière appropriée en fonction de l'objectif en fonction des livrables. Bien sûr, ce n'est pas une question de sécurité, mais au début, j'ai pensé que j'utiliserais mon adresse e-mail et mon mot de passe pour me connecter. J'ai en fait écrit le code pour le processus de passage de l'enregistrement temporaire à l'enregistrement complet par authentification par e-mail. Mais pour PL

Cette fois, il s'agit d'un produit (portfolio) plutôt que d'un service, et compte tenu de cela, n'est-il pas préférable de permettre aux utilisateurs de l'essayer plus facilement?

Il est difficile de taper pour se connecter avec une adresse e-mail, et certaines personnes peuvent trouver cela gênant et désagréable lors de la vérification des e-mails. Du point de vue de Il existe un historique de changement de méthode de connexion avec un nom d'utilisateur et un mot de passe. Il y a certainement une raison à cela. Si vous le considérez comme un livrable, il est important d'insister sur le fait que vous avez autant de compétences ou que vous l'avez créé, mais j'ai réalisé que vous devez penser aux personnes qui l'utilisent réellement. J'ai fait.

Postscript

Concernant la partie connexion sociale, il semble qu'une erreur s'est produite dans l'environnement de production, elle a donc été supprimée en pleurant. Cela aurait été bien si je pouvais le gérer, mais il semble que les mesures ont été prises car c'était une fonction qui n'était pas prévue à l'origine et qu'elle ne poserait aucun problème dans un proche avenir. Après tout, il semble que la relation de certification n'est pas simple ... Je ferai de mon mieux la prochaine fois.

référence

document django-allauth Définition de django-allauth [Django] Procédure d'implémentation de l'authentification sociale à l'aide de django-allauth Jango-Django django-allauth implémente une fonction de connexion sociale rapide Procédure de personnalisation du fichier de modèle django-allauth Création d'un écran de connexion dans Django allauth

Recommended Posts

L'histoire de voir des yeux douloureux en regardant gentiment autour de l'authentification (essayez d'introduire l'authentification à l'aide de django-allauth)
L'histoire de l'introduction d'une fonction d'authentification multifacteur utilisant un mot de passe à usage unique dans une application Java
Essayez d'utiliser le module de collections (ChainMap) de python3