Repository: pennersr/django-allauth
Pull request #3717 (2024-04-05 03:58:14)

fix(locale): Correct spelling mistakes and add new translation
# Submitting Pull Requests

## General

 - [x] Make sure you use [semantic commit messages](https://seesparkbox.com/foundry/semantic_commit_messages).
       Examples: `"fix(google): Fixed foobar bug"`, `"feat(accounts): Added foobar feature"`.
 - [x] All Python code must formatted using Black, and clean from pep8 and isort issues.
 - [x] JavaScript code should adhere to [StandardJS](https://standardjs.com).
 - [ ] If your changes are significant, please update `ChangeLog.rst`.
 - [ ] If your change is substantial, feel free to add yourself to `AUTHORS`.

 ## Provider Specifics

 In case you add a new provider:

- [ ] Make sure unit tests are available.
- [ ] Add an entry of your provider in `test_settings.py::INSTALLED_APPS` and `docs/installation.rst::INSTALLED_APPS`.
- [ ] Add documentation to `docs/providers/<provider name>.rst` and `docs/providers/index.rst` Provider Specifics toctree.
- [ ] Add an entry to the list of supported providers over at `docs/overview.rst`.



Patch:
diff --git a/AUTHORS b/AUTHORS
index ab41bdf6..9a0d08a7 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -15,6 +15,7 @@ Ahmet Emre Aladağ
 Aiden Lu
 Aldiantoro Nugroho
 Alexander Gaevsky
+Alfredo Altamirano
 Andrean Franc
 Andrei Satsevich
 Andrew Chen Wang
diff --git a/ChangeLog.rst b/ChangeLog.rst
index 6537638c..e084f3ab 100644
--- a/ChangeLog.rst
+++ b/ChangeLog.rst
@@ -6,6 +6,20 @@ Note worthy changes
 
 - Added a dummy provider, useful for testing purposes: ``allauth.socialaccount.providers.dummy``.
 
+- Added a new provider, Atlassian
+
+
+Backwards incompatible changes
+------------------------------
+
+- The django-allauth required dependencies are now more fine grained.  If you do
+  not use any of the social account functionality, a `pip install
+  django-allauth` will, e.g., no longer pull in dependencies for handling
+  JWT. If you are using social account functionality, install using `pip install
+  django-allauth[socialaccount]`.  That will install the dependencies covering
+  most common providers. If you are using the Steam provider, install using `pip
+  install django-allauth[socialaccount,steam]`.
+
 
 0.61.1 (2024-02-09)
 *******************
diff --git a/README.rst b/README.rst
index 123c6256..81be752e 100644
--- a/README.rst
+++ b/README.rst
@@ -2,41 +2,36 @@
 Welcome to django-allauth!
 ==========================
 
-.. image:: https://github.com/pennersr/django-allauth/actions/workflows/ci.yml/badge.svg
+.. |ci| image:: https://img.shields.io/github/actions/workflow/status/pennersr/django-allauth/ci.yml.png
    :target: https://github.com/pennersr/django-allauth/actions
-
-.. image:: https://img.shields.io/pypi/v/django-allauth.svg
+.. |pypi| image:: https://img.shields.io/pypi/v/django-allauth.png
    :target: https://pypi.python.org/pypi/django-allauth
-
-.. image:: https://coveralls.io/repos/pennersr/django-allauth/badge.svg?branch=main
+.. |cov| image:: https://img.shields.io/coverallsCoverage/github/pennersr/django-allauth.png
    :alt: Coverage Status
    :target: https://coveralls.io/r/pennersr/django-allauth
-
-.. image:: https://pennersr.github.io/img/bitcoin-badge.svg
+.. |btc| image:: https://img.shields.io/badge/bitcoin-donate-yellow.png
    :target: https://blockchain.info/address/1AJXuBMPHkaDCNX2rwAy34bGgs7hmrePEr
-
-.. image:: https://badgen.net/liberapay/receives/pennersr
+.. |liberapay| image:: https://img.shields.io/liberapay/receives/pennersr.png
    :target: https://en.liberapay.com/pennersr
-
-.. image:: https://img.shields.io/badge/code%20style-pep8-green.svg
+.. |pystyle| image:: https://img.shields.io/badge/code%20style-pep8-green.png
    :target: https://www.python.org/dev/peps/pep-0008/
-
-.. image:: https://img.shields.io/badge/code_style-standard-brightgreen.svg
+.. |jsstyle| image:: https://img.shields.io/badge/code_style-standard-brightgreen.png
    :target: http://standardjs.com
-
-.. image:: https://pennersr.github.io/img/emacs-badge.svg
+.. |editor| image:: https://img.shields.io/badge/editor-emacs-purple.png
    :target: https://www.gnu.org/software/emacs/
-
-.. image:: https://hosted.weblate.org/widget/django-allauth/django-allauth/svg-badge.svg
+.. |i18n| image:: https://img.shields.io/weblate/progress/django-allauth.png
    :target: https://hosted.weblate.org/engage/django-allauth/
-
-.. image:: https://img.shields.io/pypi/dm/django-allauth.svg
+.. |pypidl| image:: https://img.shields.io/pypi/dm/django-allauth.png
    :target: https://pypistats.org/packages/django-allauth
    :alt: PyPI - Downloads
-
-.. image:: https://img.shields.io/badge/%E2%96%B6-demo-red
+.. |djangodemo| image:: https://img.shields.io/badge/%E2%96%B6%20demo-Django%20project-red.png
    :target: https://django.demo.allauth.org/
-   :alt: View Demo
+   :alt: View Django Demo
+.. |reactdemo| image:: https://img.shields.io/badge/%E2%96%B6%20demo-React%20SPA-red.png
+   :target: https://react.demo.allauth.org/
+   :alt: View React SPA Demo
+
+|ci| |pypi| |cov| |btc| |liberapay| |pystyle| |jsstyle| |editor| |i18n| |pypidl| |djangodemo| |reactdemo|
 
 Integrated set of Django applications addressing authentication,
 registration, account management as well as 3rd party (social) account
diff --git a/allauth/locale/es/LC_MESSAGES/django.po b/allauth/locale/es/LC_MESSAGES/django.po
index 32c1c6d2..c151f2f3 100644
--- a/allauth/locale/es/LC_MESSAGES/django.po
+++ b/allauth/locale/es/LC_MESSAGES/django.po
@@ -7,15 +7,16 @@ msgstr ""
 "Project-Id-Version: 0.61.1\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2024-01-23 12:50-0600\n"
-"PO-Revision-Date: 2024-02-26 19:28+0100\n"
-"Last-Translator: Quique <cronopios@gmail.com>\n"
-"Language-Team: Spanish <>\n"
+"PO-Revision-Date: 2024-04-11 15:01+0000\n"
+"Last-Translator: gallegonovato <fran-carro@hotmail.es>\n"
+"Language-Team: Spanish <https://hosted.weblate.org/projects/django-allauth/"
+"django-allauth/es/>\n"
 "Language: es\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n > 1)\n"
-"X-Generator: Gtranslator 42.0\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Weblate 5.5-dev\n"
 
 #: account/adapter.py:50
 msgid "Username can not be used. Please use other username."
@@ -247,7 +248,7 @@ msgstr "Códigos de recuperación"
 
 #: mfa/models.py:20
 msgid "TOTP Authenticator"
-msgstr ""
+msgstr "Verificador TOTP"
 
 #: socialaccount/adapter.py:31
 #, python-format
@@ -417,11 +418,11 @@ msgstr "Confirmar acceso"
 
 #: templates/account/base_reauthenticate.html:11
 msgid "Please reauthenticate to safeguard your account."
-msgstr ""
+msgstr "Por favor, vuelva a autenticarse para proteger su cuenta."
 
 #: templates/account/base_reauthenticate.html:17
 msgid "Alternative options"
-msgstr ""
+msgstr "Opciones alternativas"
 
 #: templates/account/email.html:4 templates/account/email.html:8
 msgid "Email Addresses"
@@ -486,6 +487,18 @@ msgid ""
 "\n"
 "%(password_reset_url)s"
 msgstr ""
+"Usted está recibiendo este correo electrónico porque usted u otra persona "
+"intentó registrarse para una cuenta de\n"
+"cuenta utilizando la dirección de correo electrónico\n"
+"\n"
+"%(email)s\n"
+"\n"
+"Sin embargo, ya existe una cuenta con esa dirección de correo electrónico.  "
+"En caso de que\n"
+"olvidado, utilice el procedimiento de olvido de contraseña para recuperar\n"
+"su cuenta:\n"
+"\n"
+"%(password_reset_url)s"
 
 #: templates/account/email/account_already_exists_subject.txt:3
 msgid "Account Already Exists"
@@ -510,6 +523,8 @@ msgid ""
 "You are receiving this mail because the following change was made to your "
 "account:"
 msgstr ""
+"Está recibiendo este correo porque se ha realizado el siguiente cambio en su "
+"cuenta:"
 
 #: templates/account/email/base_notification.txt:10
 #, python-format
@@ -521,47 +536,43 @@ msgid ""
 "- Browser: %(user_agent)s\n"
 "- Date: %(timestamp)s"
 msgstr ""
+"Si no reconoce este cambio, tome inmediatamente las precauciones de "
+"seguridad adecuadas. El cambio en su cuenta se origina en:\n"
+"\n"
+"- Dirección IP: %(ip)s\n"
+"- Navegador: %(user_agent)s\n"
+"- Fecha: %(timestamp)s"
 
 #: templates/account/email/email_changed_message.txt:4
 #, python-format
 msgid "Your email has been changed from %(from_email)s to %(to_email)s."
-msgstr ""
+msgstr "Tu email ha sido cambiado de %(from_email)s a %(to_email)s."
 
 #: templates/account/email/email_changed_subject.txt:3
-#, fuzzy
-#| msgid "Email address"
 msgid "Email Changed"
-msgstr "Correo electrónico"
+msgstr "Correo electrónico modificado"
 
 #: templates/account/email/email_confirm_message.txt:4
-#, fuzzy
-#| msgid "Your password has been deleted."
 msgid "Your email has been confirmed."
-msgstr "Tu contraseña fue eliminada."
+msgstr "Su correo electrónico ha sido verificado."
 
 #: templates/account/email/email_confirm_subject.txt:3
-#, fuzzy
-#| msgid "email confirmation"
 msgid "Email Confirmation"
-msgstr "confirmación de correo electrónico"
+msgstr "Correo electrónico confirmado"
 
 #: templates/account/email/email_confirmation_message.txt:5
-#, fuzzy, python-format
-#| msgid ""
-#| "You're receiving this e-mail because user %(user_display)s has given your "
-#| "e-mail address to register an account on %(site_domain)s.\n"
-#| "\n"
-#| "To confirm this is correct, go to %(activate_url)s"
+#, python-format
 msgid ""
 "You're receiving this email because user %(user_display)s has given your "
 "email address to register an account on %(site_domain)s.\n"
 "\n"
 "To confirm this is correct, go to %(activate_url)s"
 msgstr ""
-"Ha recibido este correo electrónico porque el usuario %(user_display)s ha "
-"proporcionado su dirección para registrar una cuenta en %(site_domain)s.\n"
+"Está recibiendo este correo electrónico porque el usuario %(user_display)s "
+"ha facilitado su dirección de correo electrónico para registrar una cuenta "
+"en %(site_domain)s.\n"
 "\n"
-"Para confirmar que esto es correcto, siga este enlace %(activate_url)s"
+"Para confirmar que esto es correcto, vaya a %(activate_url)s"
 
 #: templates/account/email/email_confirmation_subject.txt:3
 msgid "Please Confirm Your Email Address"
@@ -571,32 +582,22 @@ msgstr "Por favor, confirme su dirección de correo electrónico"
 #, python-format
 msgid "Email address %(deleted_email)s has been removed from your account."
 msgstr ""
+"La dirección de correo electrónico %(deleted_email)s ha sido eliminada de tu "
+"cuenta."
 
 #: templates/account/email/email_deleted_subject.txt:3
-#, fuzzy
-#| msgid "Remove"
 msgid "Email Removed"
-msgstr "Eliminar"
+msgstr "Correo electrónico eliminado"
 
 #: templates/account/email/password_changed_message.txt:4
-#, fuzzy
-#| msgid "Your password is now changed."
 msgid "Your password has been changed."
-msgstr "Su contraseña ha cambiado."
+msgstr "Su contraseña ha sido modificada."
 
 #: templates/account/email/password_changed_subject.txt:3
-#, fuzzy
-#| msgid "Password (again)"
 msgid "Password Changed"
-msgstr "Contraseña (de nuevo)"
+msgstr "Contraseña modificada"
 
 #: templates/account/email/password_reset_key_message.txt:4
-#, fuzzy
-#| msgid ""
-#| "You're receiving this e-mail because you or someone else has requested a "
-#| "password for your user account.\n"
-#| "It can be safely ignored if you did not request a password reset. Click "
-#| "the link below to reset your password."
 msgid ""
 "You're receiving this email because you or someone else has requested a "
 "password reset for your user account.\n"
@@ -604,9 +605,9 @@ msgid ""
 "link below to reset your password."
 msgstr ""
 "Está recibiendo este correo electrónico porque usted u otra persona ha "
-"solicitado una contraseña para su cuenta de usuario.\n"
-"Se puede ignorar de forma segura si no solicitó un restablecimiento de "
-"contraseña. Siga el siguiente enlace para restablecer su contraseña."
+"solicitado un restablecimiento de contraseña para su cuenta de usuario.\n"
+"Puedes ignorarlo si no lo has solicitado. Haga clic en el siguiente enlace "
+"para restablecer su contraseña."
 
 #: templates/account/email/password_reset_key_message.txt:9
 #, python-format
@@ -619,10 +620,8 @@ msgid "Password Reset Email"
 msgstr "Correo electrónico para restablecer contraseña"
 
 #: templates/account/email/password_reset_message.txt:4
-#, fuzzy
-#| msgid "Your password has been deleted."
 msgid "Your password has been reset."
-msgstr "Tu contraseña fue eliminada."
+msgstr "Su contraseña ha sido restablecida."
 
 #: templates/account/email/password_reset_subject.txt:3
 #: templates/account/password_reset.html:4
@@ -633,24 +632,15 @@ msgid "Password Reset"
 msgstr "Restablecer Contraseña"
 
 #: templates/account/email/password_set_message.txt:4
-#, fuzzy
-#| msgid "Your password has been deleted."
 msgid "Your password has been set."
-msgstr "Tu contraseña fue eliminada."
+msgstr "Su contraseña ha sido establecida."
 
 #: templates/account/email/password_set_subject.txt:3
-#, fuzzy
-#| msgid "Password Reset"
 msgid "Password Set"
-msgstr "Restablecer Contraseña"
+msgstr "Establecer contraseña"
 
 #: templates/account/email/unknown_account_message.txt:4
-#, fuzzy, python-format
-#| msgid ""
-#| "You're receiving this e-mail because you or someone else has requested a "
-#| "password for your user account.\n"
-#| "It can be safely ignored if you did not request a password reset. Click "
-#| "the link below to reset your password."
+#, python-format
 msgid ""
 "You are receiving this email because you or someone else has requested a\n"
 "password for your user account. However, we do not have any record of a "
@@ -662,42 +652,41 @@ msgid ""
 "If it was you, you can sign up for an account using the link below."
 msgstr ""
 "Está recibiendo este correo electrónico porque usted u otra persona ha "
-"solicitado una contraseña para su cuenta de usuario.\n"
-"Se puede ignorar de forma segura si no solicitó un restablecimiento de "
-"contraseña. Siga el siguiente enlace para restablecer su contraseña."
+"solicitado una\n"
+"contraseña para su cuenta de usuario. Sin embargo, no tenemos ningún "
+"registro de un usuario\n"
+"con email %(email)s en nuestra base de datos.\n"
+"\n"
+"Este correo puede ser ignorado con seguridad si usted no solicitó un "
+"restablecimiento de contraseña.\n"
+"\n"
+"Si has sido tú, puedes registrarte para obtener una cuenta utilizando el "
+"siguiente enlace."
 
 #: templates/account/email_change.html:5 templates/account/email_change.html:9
-#, fuzzy
-#| msgid "Email Addresses"
 msgid "Email Address"
-msgstr "Direcciones de correo electrónico"
+msgstr "Correo electrónico"
 
 #: templates/account/email_change.html:21
 #: templates/account/email_change.html:29
-#, fuzzy
-#| msgid "Current Password"
 msgid "Current email"
-msgstr "Contraseña actual"
+msgstr "Correo electrónico actual"
 
 #: templates/account/email_change.html:31
 msgid "Changing to"
-msgstr ""
+msgstr "Cambiando a"
 
 #: templates/account/email_change.html:35
-#, fuzzy
-#| msgid "Your primary email address must be verified."
 msgid "Your email address is still pending verification."
-msgstr "Su dirección principal de correo electrónico debe ser verificada."
+msgstr "Su dirección de correo electrónico está pendiente de verificación."
 
 #: templates/account/email_change.html:41
 msgid "Cancel Change"
-msgstr ""
+msgstr "Cancelar el cambio"
 
 #: templates/account/email_change.html:49
-#, fuzzy
-#| msgid "Change Email"
 msgid "Change to"
-msgstr "Cambiar correo electrónico"
+msgstr "Cambiar a"
 
 #: templates/account/email_change.html:55
 #: templates/allauth/layouts/base.html:29
@@ -710,16 +699,13 @@ msgid "Confirm Email Address"
 msgstr "Confirmar dirección de correo electrónico"
 
 #: templates/account/email_confirm.html:16
-#, fuzzy, python-format
-#| msgid ""
-#| "Please confirm that <a href=\"mailto:%(email)s\">%(email)s</a> is an e-"
-#| "mail address for user %(user_display)s."
+#, python-format
 msgid ""
 "Please confirm that <a href=\"mailto:%(email)s\">%(email)s</a> is an email "
 "address for user %(user_display)s."
 msgstr ""
-"Por favor confirme que <a href=\"mailto:%(email)s\">%(email)s</a> es una "
-"dirección de correo electrónico del usuario %(user_display)s."
+"Por favor, confirme que <a href=\"mailto:%(email)s\">%(email)s</a> es una "
+"dirección de correo electrónico para el usuario %(user_display)s."
 
 #: templates/account/email_confirm.html:23
 #: templates/account/reauthenticate.html:20
@@ -729,25 +715,22 @@ msgstr "Confirmar"
 
 #: templates/account/email_confirm.html:29
 #: templates/account/messages/email_confirmation_failed.txt:2
-#, fuzzy, python-format
-#| msgid "The social account is already connected to a different account."
+#, python-format
 msgid ""
 "Unable to confirm %(email)s because it is already confirmed by a different "
 "account."
-msgstr "Esta cuenta de red social ya ha sido asociada a otra cuenta."
+msgstr ""
+"No se puede confirmar %(email)s porque ya está confirmado por otra cuenta."
 
 #: templates/account/email_confirm.html:35
-#, fuzzy, python-format
-#| msgid ""
-#| "This e-mail confirmation link expired or is invalid. Please <a "
-#| "href=\"%(email_url)s\">issue a new e-mail confirmation request</a>."
+#, python-format
 msgid ""
 "This email confirmation link expired or is invalid. Please <a "
 "href=\"%(email_url)s\">issue a new email confirmation request</a>."
 msgstr ""
-"Este enlace de verificación de correo ha expirado o es inválido. Por favor "
-"<a href=\"%(email_url)s\">solicite una nueva verificación por correo "
-"electrónico.</a>."
+"Este enlace de confirmación por correo electrónico ha caducado o no es "
+"válido. Por favor, <a href=\"%(email_url)s\"> emita una nueva solicitud de "
+"confirmación por correo electrónico</a>."
 
 #: templates/account/login.html:5 templates/account/login.html:9
 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36
@@ -758,16 +741,13 @@ msgid "Sign In"
 msgstr "Iniciar sesión"
 
 #: templates/account/login.html:12
-#, fuzzy, python-format
-#| msgid ""
-#| "If you have not created an account yet, then please\n"
-#| "<a href=\"%(signup_url)s\">sign up</a> first."
+#, python-format
 msgid ""
 "If you have not created an account yet, then please\n"
 "    <a href=\"%(signup_url)s\">sign up</a> first."
 msgstr ""
-"Si todavía no ha creado una cuenta, entonces por favor\n"
-"<a href=\"%(signup_url)s\">regístrese</a> primero."
+"Si aún no ha creado una cuenta, por favor\n"
+"    <a href=\"%(signup_url)s\">regístrese</a> primero."
 
 #: templates/account/logout.html:4 templates/account/logout.html:8
 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32
@@ -858,18 +838,13 @@ msgstr ""
 "contáctenos."
 
 #: templates/account/password_reset_done.html:16
-#, fuzzy
-#| msgid ""
-#| "We have sent you an e-mail. If you have not received it please check your "
-#| "spam folder. Otherwise contact us if you do not receive it in a few "
-#| "minutes."
 msgid ""
 "We have sent you an email. If you have not received it please check your "
 "spam folder. Otherwise contact us if you do not receive it in a few minutes."
 msgstr ""
-"Le hemos enviado un correo electrónico. Si no lo ha recibido, por favor "
-"revise su carpeta de correo no deseado. En caso contrario, póngase en "
-"contacto con nosotros si no lo recibe en unos minutos."
+"Le hemos enviado un correo electrónico. Si no lo ha recibido, compruebe su "
+"carpeta de correo no deseado. De lo contrario, póngase en contacto con "
+"nosotros si no lo recibe en unos minutos."
 
 #: templates/account/password_reset_from_key.html:10
 msgid "Bad Token"
@@ -939,18 +914,13 @@ msgid "Warning:"
 msgstr "Advertencia:"
 
 #: templates/account/snippets/warn_no_email.html:3
-#, fuzzy
-#| msgid ""
-#| "You currently do not have any e-mail address set up. You should really "
-#| "add an e-mail address so you can receive notifications, reset your "
-#| "password, etc."
 msgid ""
 "You currently do not have any email address set up. You should really add an "
 "email address so you can receive notifications, reset your password, etc."
 msgstr ""
-"Actualmente no tiene ninguna dirección de correo electrónico definida. "
-"Debería añadir una dirección de correo electrónico para poder recibir "
-"notificaciones, restablecer la contraseña, etc."
+"Actualmente no tienes ninguna dirección de correo electrónico configurada. "
+"Debería añadir una dirección de correo electrónico para recibir "
+"notificaciones, restablecer su contraseña, etc."
 
 #: templates/account/verification_sent.html:5
 #: templates/account/verification_sent.html:9
@@ -960,12 +930,6 @@ msgid "Verify Your Email Address"
 msgstr "Verifique su dirección de correo electrónico"
 
 #: templates/account/verification_sent.html:12
-#, fuzzy
-#| msgid ""
-#| "We have sent an e-mail to you for verification. Follow the link provided "
-#| "to finalize the signup process. If you do not see the verification e-mail "
-#| "in your main inbox, check your spam folder. Please contact us if you do "
-#| "not receive the verification e-mail within a few minutes."
 msgid ""
 "We have sent an email to you for verification. Follow the link provided to "
 "finalize the signup process. If you do not see the verification email in "
@@ -973,32 +937,22 @@ msgid ""
 "receive the verification email within a few minutes."
 msgstr ""
 "Le hemos enviado un correo electrónico para su verificación. Siga el enlace "
-"para completar el proceso de registro. Por favor contacte con nosotros si no "
-"lo recibe en unos minutos."
+"proporcionado para finalizar el proceso de registro. Si no ves el correo "
+"electrónico de verificación en tu bandeja de entrada principal, comprueba tu "
+"carpeta de correo no deseado. Por favor, póngase en contacto con nosotros si "
+"no recibe el correo electrónico de verificación en unos minutos."
 
 #: templates/account/verified_email_required.html:13
-#, fuzzy
-#| msgid ""
-#| "This part of the site requires us to verify that\n"
-#| "you are who you claim to be. For this purpose, we require that you\n"
-#| "verify ownership of your e-mail address. "
 msgid ""
 "This part of the site requires us to verify that\n"
 "you are who you claim to be. For this purpose, we require that you\n"
 "verify ownership of your email address. "
 msgstr ""
-"Esta parte del sitio web requiere que verifiquemos que es quien dice ser. "
-"Para este fin, le requerimos que verifique la propiedad de su correo "
-"electrónico. "
+"Esta parte de la página requiere que verifiquemos que\n"
+"usted es quien dice ser. Para ello, le pedimos que\n"
+"verifique la titularidad de su dirección de correo electrónico. "
 
 #: templates/account/verified_email_required.html:18
-#, fuzzy
-#| msgid ""
-#| "We have sent an e-mail to you for\n"
-#| "verification. Please click on the link inside that e-mail. If you do not "
-#| "see the verification e-mail in your main inbox, check your spam folder. "
-#| "Otherwise\n"
-#| "contact us if you do not receive it within a few minutes."
 msgid ""
 "We have sent an email to you for\n"
 "verification. Please click on the link inside that email. If you do not see "
@@ -1006,20 +960,20 @@ msgid ""
 "Otherwise\n"
 "contact us if you do not receive it within a few minutes."
 msgstr ""
-"Le hemos enviado un correo electrónico para su verificación. Por favor, siga "
-"el enlace de ese correo. Contacte con nosotros si no lo recibe en unos "
-"minutos."
+"Le hemos enviado un correo electrónico para\n"
+"verificación. Por favor, haga clic en el enlace que aparece en ese correo "
+"electrónico. Si no ve el correo electrónico de verificación en su bandeja de "
+"entrada principal, compruebe su carpeta de correo no deseado. De lo "
+"contrario,\n"
+"póngase en contacto con nosotros si no lo recibe en unos minutos."
 
 #: templates/account/verified_email_required.html:23
-#, fuzzy, python-format
-#| msgid ""
-#| "<strong>Note:</strong> you can still <a href=\"%(email_url)s\">change "
-#| "your e-mail address</a>."
+#, python-format
 msgid ""
 "<strong>Note:</strong> you can still <a href=\"%(email_url)s\">change your "
 "email address</a>."
 msgstr ""
-"<strong>Nota:</strong> todavía puede <a href=\"%(email_url)s\">cambiar su "
+"<strong>Nota:</strong> aún puedes <a href=\"%(email_url)s\">cambiar tu "
 "dirección de correo electrónico</a>."
 
 #: templates/allauth/layouts/base.html:18
@@ -1033,13 +987,15 @@ msgstr "Menú:"
 #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5
 #: templates/mfa/index.html:9
 msgid "Two-Factor Authentication"
-msgstr ""
+msgstr "Autenticació de doble factor"
 
 #: templates/mfa/authenticate.html:12
 msgid ""
 "Your account is protected by two-factor authentication. Please enter an "
 "authenticator code:"
 msgstr ""
+"Su cuenta está protegida por doble factor de autenticación. Por favor, entre "
+"el código del autenticador:"
 
 #: templates/mfa/authenticate.html:27
 msgid "Cancel"
@@ -1049,58 +1005,56 @@ msgstr "Cancelar"
 msgid ""
 "A new set of Two-Factor Authentication recovery codes has been generated."
 msgstr ""
+"Se ha generado un nuevo conjunto de códigos de recuperación de Autenticación "
+"de Dos Factores."
 
 #: templates/mfa/email/recovery_codes_generated_subject.txt:3
 msgid "New Recovery Codes Generated"
-msgstr ""
+msgstr "Generados nevos códigos de recuperación"
 
 #: templates/mfa/email/totp_activated_message.txt:4
 #: templates/mfa/messages/totp_activated.txt:2
 msgid "Authenticator app activated."
-msgstr ""
+msgstr "La aplicación de autenticación ha sido activada."
 
 #: templates/mfa/email/totp_activated_subject.txt:3
-#, fuzzy
-#| msgid "token secret"
 msgid "Authenticator App Activated"
-msgstr "frase secreta de token"
+msgstr "Aplicación de autenticación activada."
 
 #: templates/mfa/email/totp_deactivated_message.txt:4
 #: templates/mfa/messages/totp_deactivated.txt:2
 msgid "Authenticator app deactivated."
-msgstr ""
+msgstr "Aplicación de autenticación desactivada."
 
 #: templates/mfa/email/totp_deactivated_subject.txt:3
-#, fuzzy
-#| msgid "token secret"
 msgid "Authenticator App Deactivated"
-msgstr "frase secreta de token"
+msgstr "Aplicación de autenticación desactivada."
 
 #: templates/mfa/index.html:14 templates/mfa/totp/base.html:4
 msgid "Authenticator App"
-msgstr ""
+msgstr "Aplicación de autenticación"
 
 #: templates/mfa/index.html:18
 msgid "Authentication using an authenticator app is active."
-msgstr ""
+msgstr "La autenticación con una aplicación de autenticación está activa."
 
 #: templates/mfa/index.html:20
 msgid "An authenticator app is not active."
-msgstr ""
+msgstr "No hay ninguna aplicación de autenticación activa."
 
 #: templates/mfa/index.html:28 templates/mfa/totp/deactivate_form.html:24
 msgid "Deactivate"
-msgstr ""
+msgstr "Desactivar"
 
 #: templates/mfa/index.html:32 templates/mfa/totp/activate_form.html:32
 msgid "Activate"
-msgstr ""
+msgstr "Activar"
 
 #: templates/mfa/index.html:42 templates/mfa/recovery_codes/base.html:4
 #: templates/mfa/recovery_codes/generate.html:6
 #: templates/mfa/recovery_codes/index.html:6
 msgid "Recovery Codes"
-msgstr ""
+msgstr "Códigos de recuperación"
 
 #: templates/mfa/index.html:47 templates/mfa/recovery_codes/index.html:9
 #, python-format
@@ -1109,62 +1063,64 @@ msgid ""
 msgid_plural ""
 "There are %(unused_count)s out of %(total_count)s recovery codes available."
 msgstr[0] ""
+"Hay %(unused_count)s de %(total_count)s códigos de recuperación disponibles."
 msgstr[1] ""
+"Hay %(unused_count)s de %(total_count)s códigos de recuperación disponibles."
 
 #: templates/mfa/index.html:50
 msgid "No recovery codes set up."
-msgstr ""
+msgstr "No se han configurado códigos de recuperación."
 
 #: templates/mfa/index.html:59
 msgid "View"
-msgstr ""
+msgstr "Mostrar"
 
 #: templates/mfa/index.html:65
 msgid "Download"
-msgstr ""
+msgstr "Descargar"
 
 #: templates/mfa/index.html:73 templates/mfa/recovery_codes/generate.html:29
 msgid "Generate"
-msgstr ""
+msgstr "Generar"
 
 #: templates/mfa/messages/recovery_codes_generated.txt:2
 msgid "A new set of recovery codes has been generated."
-msgstr ""
+msgstr "Se ha generado un nuevo conjunto de código de recuperación."
 
 #: templates/mfa/reauthenticate.html:5
-#, fuzzy
-#| msgid "token secret"
 msgid "Enter an authenticator code:"
-msgstr "frase secreta de token"
+msgstr "Ingrese un código de autenticación:"
 
 #: templates/mfa/recovery_codes/generate.html:9
 msgid "You are about to generate a new set of recovery codes for your account."
 msgstr ""
+"Está a punto de generar un nuevo conjunto de código de recuperación para su "
+"cuenta."
 
 #: templates/mfa/recovery_codes/generate.html:11
 msgid "This action will invalidate your existing codes."
-msgstr ""
+msgstr "Esta operación invalidará sus códigos existentes."
 
 #: templates/mfa/recovery_codes/generate.html:13
 msgid "Are you sure?"
-msgstr ""
+msgstr "¿Está seguro?"
 
 #: templates/mfa/recovery_codes/index.html:13
 msgid "Unused codes"
-msgstr ""
+msgstr "Códigos no utilizados"
 
 #: templates/mfa/recovery_codes/index.html:25
 msgid "Download codes"
-msgstr ""
+msgstr "Descarga los códigos"
 
 #: templates/mfa/recovery_codes/index.html:30
 msgid "Generate new codes"
-msgstr ""
+msgstr "Crear nuevos códigos"
 
 #: templates/mfa/totp/activate_form.html:4
 #: templates/mfa/totp/activate_form.html:8
 msgid "Activate Authenticator App"
-msgstr ""
+msgstr "Activar la aplicación de autenticación"
 
 #: templates/mfa/totp/activate_form.html:11
 msgid ""
@@ -1172,47 +1128,46 @@ msgid ""
 "below with your authenticator app. Then, input the verification code "
 "generated by the app below."
 msgstr ""
+"Escanee el código QR a continuación con su aplicación de autenticación para "
+"proteger su cuenta con autenticación de dos factores. Luego, ingrese el "
+"código de verificación generado por la aplicación a continuación."
 
 #: templates/mfa/totp/activate_form.html:21
-#, fuzzy
-#| msgid "token secret"
 msgid "Authenticator secret"
-msgstr "frase secreta de token"
+msgstr "Secreto de autenticador"
 
 #: templates/mfa/totp/activate_form.html:24
 msgid ""
 "You can store this secret and use it to reinstall your authenticator app at "
 "a later time."
 msgstr ""
+"Puede guardar este secreto y usarlo más tarde para reinstalar su aplicación "
+"de autenticación."
 
 #: templates/mfa/totp/deactivate_form.html:5
 #: templates/mfa/totp/deactivate_form.html:9
 msgid "Deactivate Authenticator App"
-msgstr ""
+msgstr "Deshabilitar la aplicación de autenticación"
 
 #: templates/mfa/totp/deactivate_form.html:12
 msgid ""
 "You are about to deactivate authenticator app based authentication. Are you "
 "sure?"
 msgstr ""
+"Está a punto de desactivar la autenticación a través de la aplicación de "
+"autenticación. ¿Está seguro?"
 
 #: templates/socialaccount/authentication_error.html:5
 #: templates/socialaccount/authentication_error.html:9
-#, fuzzy
-#| msgid "Social Network Login Failure"
 msgid "Third-Party Login Failure"
-msgstr "Error de inicio de sesión con red social"
+msgstr "Falló la autenticación de terceros"
 
 #: templates/socialaccount/authentication_error.html:11
-#, fuzzy
-#| msgid ""
-#| "An error occurred while attempting to login via your social network "
-#| "account."
 msgid ""
 "An error occurred while attempting to login via your third-party account."
 msgstr ""
-"Se produjo un error al intentar iniciar sesión a través de su cuenta de red "
-"social."
+"Se produjo un error al intentar iniciar sesión a través de su cuenta de "
+"terceros."
 
 #: templates/socialaccount/connections.html:5
 #: templates/socialaccount/connections.html:9
@@ -1220,40 +1175,30 @@ msgid "Account Connections"
 msgstr "Conexiones de Cuenta"
 
 #: templates/socialaccount/connections.html:13
-#, fuzzy
-#| msgid ""
-#| "You can sign in to your account using any of the following third party "
-#| "accounts:"
 msgid ""
 "You can sign in to your account using any of the following third-party "
 "accounts:"
-msgstr "Puede iniciar sesión con alguna de las siguientes cuentas externas:"
+msgstr ""
+"Puede iniciar sesión en su cuenta utilizando una de las siguientes cuentas "
+"de terceros:"
 
 #: templates/socialaccount/connections.html:45
-#, fuzzy
-#| msgid ""
-#| "You currently have no social network accounts connected to this account."
 msgid "You currently have no third-party accounts connected to this account."
-msgstr ""
-"Actualmente no tiene ninguna cuenta de red social asociada a esta cuenta."
+msgstr "Actualmente no tiene cuentas de terceros conectadas a esta cuenta."
 
 #: templates/socialaccount/connections.html:48
-#, fuzzy
-#| msgid "Add a 3rd Party Account"
 msgid "Add a Third-Party Account"
-msgstr "Agregar una cuenta de una red social externa"
+msgstr "Agregar una cuenta de terceros"
 
 #: templates/socialaccount/email/account_connected_message.txt:4
 #, python-format
 msgid ""
 "A third-party account from %(provider)s has been connected to your account."
-msgstr ""
+msgstr "Una cuenta de terceros de %(provider)s se ha conectado a su cuenta."
 
 #: templates/socialaccount/email/account_connected_subject.txt:3
-#, fuzzy
-#| msgid "Add a 3rd Party Account"
 msgid "Third-Party Account Connected"
-msgstr "Agregar una cuenta de una red social externa"
+msgstr "Cuenta de terceros vinculada"
 
 #: templates/socialaccount/email/account_disconnected_message.txt:4
 #, python-format
@@ -1261,6 +1206,7 @@ msgid ""
 "A third-party account from %(provider)s has been disconnected from your "
 "account."
 msgstr ""
+"La cuenta de terceros desde %(provider)s ha sido desvinculada de tu cuenta."
 
 #: templates/socialaccount/email/account_disconnected_subject.txt:3
 msgid "Third-Party Account Disconnected"
diff --git a/allauth/locale/ja/LC_MESSAGES/django.po b/allauth/locale/ja/LC_MESSAGES/django.po
index 2e96e82d..2550e118 100644
--- a/allauth/locale/ja/LC_MESSAGES/django.po
+++ b/allauth/locale/ja/LC_MESSAGES/django.po
@@ -3,20 +3,21 @@
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 #
-#, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2024-01-17 12:01-0600\n"
-"PO-Revision-Date: 2024-01-28 12:36+0900\n"
-"Last-Translator: k-brahma <k.brahma.nirvana@gmail.com>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: ja-JP\n"
+"PO-Revision-Date: 2024-03-29 08:01+0000\n"
+"Last-Translator: SATOH Fumiyasu <fumiyas@osstech.co.jp>\n"
+"Language-Team: Japanese <https://hosted.weblate.org/projects/django-allauth/"
+"django-allauth/ja/>\n"
+"Language: ja\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 5.5-dev\n"
 
 #: account/adapter.py:50
 msgid "Username can not be used. Please use other username."
@@ -35,10 +36,8 @@ msgid "Please type your current password."
 msgstr "現在のパスワードを入力してください。"
 
 #: account/adapter.py:60
-#, fuzzy
-#| msgid "Current Password"
 msgid "Incorrect password."
-msgstr "現在のパスワード"
+msgstr "不正なパスワードです。"
 
 #: account/adapter.py:61
 #, python-brace-format
@@ -58,10 +57,8 @@ msgid "Use your authenticator app"
 msgstr "認証アプリを利用する"
 
 #: account/admin.py:23
-#, fuzzy
-#| msgid "Your primary email address must be verified."
 msgid "Mark selected email addresses as verified"
-msgstr "メインのメールアドレスは確認済みでなければいけません。"
+msgstr "確認済みにするメールアドレスを選択"
 
 #: account/apps.py:11
 msgid "Accounts"
@@ -117,13 +114,12 @@ msgid "Login"
 msgstr "ログイン"
 
 #: account/forms.py:146
-#| msgid "Forgot Password?"
 msgid "Forgot your password?"
-msgstr "パスワードをお忘れですか？"
+msgstr "パスワードをお忘れですか?"
 
 #: account/forms.py:316
 msgid "Email (again)"
-msgstr "メールアドレス（確認用）"
+msgstr "メールアドレス (確認用)"
 
 #: account/forms.py:320
 #| msgid "email confirmation"
@@ -132,7 +128,7 @@ msgstr "メールアドレスの確認"
 
 #: account/forms.py:328
 msgid "Email (optional)"
-msgstr "メールアドレス（オプション）"
+msgstr "メールアドレス (オプション)"
 
 #: account/forms.py:383
 #| msgid "You must type the same password each time."
@@ -141,17 +137,16 @@ msgstr "同じパスワードを入力してください。"
 
 #: account/forms.py:418 account/forms.py:557
 msgid "Password (again)"
-msgstr "パスワード（再入力）"
+msgstr "パスワード (再入力)"
 
 #: account/forms.py:489
 msgid "This email address is already associated with this account."
 msgstr "このメールアドレスはすでに登録されています。"
 
 #: account/forms.py:491
-#, fuzzy, python-format
-#| msgid "Your account has no verified email address."
+#, python-format
 msgid "You cannot add more than %d email addresses."
-msgstr "確認済みのメールアドレスの登録が必要です。"
+msgstr "メールアドレスは %d 個までしか登録できません。"
 
 #: account/forms.py:529
 msgid "Current Password"
@@ -163,7 +158,7 @@ msgstr "新しいパスワード"
 
 #: account/forms.py:535 account/forms.py:638
 msgid "New Password (again)"
-msgstr "新しいパスワード（再入力）"
+msgstr "新しいパスワード (再入力)"
 
 #: account/forms.py:658
 msgid "The password reset token was invalid."
@@ -229,15 +224,15 @@ msgstr "コードが正しくありません。"
 
 #: mfa/adapter.py:27
 msgid "You cannot deactivate two-factor authentication."
-msgstr ""
+msgstr "二要素認証は無効化できません。"
 
 #: mfa/apps.py:9
 msgid "MFA"
-msgstr ""
+msgstr "多要素認証"
 
 #: mfa/forms.py:15 mfa/forms.py:17 mfa/forms.py:52
 msgid "Code"
-msgstr ""
+msgstr "コード"
 
 #: mfa/forms.py:50
 msgid "Authenticator code"
@@ -245,23 +240,19 @@ msgstr "認証アプリコード"
 
 #: mfa/models.py:19
 msgid "Recovery codes"
-msgstr ""
+msgstr "リカバリーコード"
 
 #: mfa/models.py:20
 msgid "TOTP Authenticator"
-msgstr ""
+msgstr "TOTP 認証アプリ"
 
 #: socialaccount/adapter.py:31
-#, fuzzy, python-format
-#| msgid ""
-#| "An account already exists with this e-mail address. Please sign in to "
-#| "that account first, then connect your %s account."
+#, python-format
 msgid ""
 "An account already exists with this email address. Please sign in to that "
 "account first, then connect your %s account."
-msgstr ""
-"このメールアドレスを使用するアカウントが既にあります。そのアカウントにログイ"
-"ンしてから%sアカウントを接続してください"
+msgstr "このメールアドレスを使用するアカウントが既にあります。"
+"そのアカウントにログインしてから %s アカウントを接続してください。"
 
 #: socialaccount/adapter.py:148
 msgid "Your account has no password set up."
@@ -290,11 +281,11 @@ msgstr "ユーザー名"
 
 #: socialaccount/models.py:52
 msgid "client id"
-msgstr "ユーザID"
+msgstr "ユーザー ID"
 
 #: socialaccount/models.py:54
 msgid "App ID, or consumer key"
-msgstr "App IDもしくはコンシューマキー"
+msgstr "App ID もしくはコンシューマキー"
 
 #: socialaccount/models.py:57
 msgid "secret key"
@@ -302,8 +293,7 @@ msgstr "シークレットキー"
 
 #: socialaccount/models.py:60
 msgid "API secret, client secret, or consumer secret"
-msgstr ""
-"APIシークレット、クライアントシークレット、またはコンシューマーシークレット"
+msgstr "API シークレット、クライアントシークレット、またはコンシューマーシークレット"
 
 #: socialaccount/models.py:63
 msgid "Key"
@@ -319,7 +309,7 @@ msgstr "ソーシャルアプリケーション"
 
 #: socialaccount/models.py:111
 msgid "uid"
-msgstr ""
+msgstr "ユーザー名"
 
 #: socialaccount/models.py:113
 msgid "last login"
@@ -347,7 +337,7 @@ msgstr "トークン"
 
 #: socialaccount/models.py:155
 msgid "\"oauth_token\" (OAuth1) or access token (OAuth2)"
-msgstr "\"oauth_token\" (OAuth1) もしくは Access Token (OAuth2)"
+msgstr "「oauth_token」(OAuth1) もしくは Access Token (OAuth2)"
 
 #: socialaccount/models.py:159
 msgid "token secret"
@@ -355,7 +345,7 @@ msgstr "トークンシークレット"
 
 #: socialaccount/models.py:160
 msgid "\"oauth_token_secret\" (OAuth1) or refresh token (OAuth2)"
-msgstr "\"oauth_token_secret\" (OAuth1) もしくは Refresh Token (OAuth2)"
+msgstr "「oauth_token_secret」(OAuth1) もしくは Refresh Token (OAuth2)"
 
 #: socialaccount/models.py:163
 msgid "expires at"
@@ -374,43 +364,38 @@ msgid "Invalid profile data"
 msgstr "無効なプロファイルデータ"
 
 #: socialaccount/providers/oauth/client.py:85
-#, fuzzy, python-format
-#| msgid "Invalid response while obtaining request token from \"%s\"."
+#, python-format
 msgid ""
 "Invalid response while obtaining request token from \"%s\". Response was: %s."
-msgstr ""
-"不正なレスポンスが返されたため、 \"%s\" からリクエストトークンを取得できませ"
-"んでした。"
+msgstr "「%s」からのリクエストトークン取得中に不正な応答がありました。レスポンス: %s"
 
 #: socialaccount/providers/oauth/client.py:119
 #: socialaccount/providers/pocket/client.py:86
 #, python-format
 msgid "Invalid response while obtaining access token from \"%s\"."
-msgstr ""
-"不正なレスポンスが返されたため、 \"%s\" からアクセストークンを取得できません"
-"でした。"
+msgstr "不正なレスポンスが返されたため、「%s」からアクセストークンを取得できませんで"
+"した。"
 
 #: socialaccount/providers/oauth/client.py:140
 #, python-format
 msgid "No request token saved for \"%s\"."
-msgstr "\"%s\" のリクエストトークンを保存できませんでした。"
+msgstr "「%s」のリクエストトークンを保存できませんでした。"
 
 #: socialaccount/providers/oauth/client.py:191
 #, python-format
 msgid "No access token saved for \"%s\"."
-msgstr "\"%s\" のアクセストークンを保存できませんでした。"
+msgstr "「%s」のアクセストークンを保存できませんでした。"
 
 #: socialaccount/providers/oauth/client.py:212
 #, python-format
 msgid "No access to private resources at \"%s\"."
-msgstr "\"%s\" の情報にアクセスできませんでした。"
+msgstr "「%s」の情報にアクセスできませんでした。"
 
 #: socialaccount/providers/pocket/client.py:41
 #, python-format
 msgid "Invalid response while obtaining request token from \"%s\"."
-msgstr ""
-"不正なレスポンスが返されたため、 \"%s\" からリクエストトークンを取得できませ"
-"んでした。"
+msgstr "不正なレスポンスが返されたため、「%s」からリクエストトークンを取得できません"
+"でした。"
 
 #: templates/account/account_inactive.html:5
 #: templates/account/account_inactive.html:9
@@ -440,7 +425,7 @@ msgstr "メールアドレス"
 
 #: templates/account/email.html:11
 msgid "The following email addresses are associated with your account:"
-msgstr "以下のメールアドレスがアカウントに登録されています："
+msgstr "以下のメールアドレスがアカウントに登録されています:"
 
 #: templates/account/email.html:23
 msgid "Verified"
@@ -476,7 +461,7 @@ msgstr "メールアドレスの登録"
 
 #: templates/account/email.html:79
 msgid "Do you really want to remove the selected email address?"
-msgstr "選択されたメールアドレスを削除してもよろしいですか？"
+msgstr "選択されたメールアドレスを削除してもよろしいですか?"
 
 #: templates/account/email/account_already_exists_message.txt:4
 #, python-format
@@ -498,12 +483,12 @@ msgstr ""
 
 #: templates/account/email/account_already_exists_subject.txt:3
 msgid "Account Already Exists"
-msgstr ""
+msgstr "アカウントが既に存在"
 
 #: templates/account/email/base_message.txt:1
 #, python-format
 msgid "Hello from %(site_name)s!"
-msgstr "こんにちは、%(site_name)sです。"
+msgstr "こんにちは、%(site_name)s!"
 
 #: templates/account/email/base_message.txt:5
 #, python-format
@@ -511,7 +496,7 @@ msgid ""
 "Thank you for using %(site_name)s!\n"
 "%(site_domain)s"
 msgstr ""
-"%(site_name)sを利用いただきありがとうございます!\n"
+"%(site_name)s を利用いただきありがとうございます!\n"
 "%(site_domain)s"
 
 #: templates/account/email/base_notification.txt:5
@@ -542,9 +527,8 @@ msgid "Email Changed"
 msgstr "メールアドレスが変更されました"
 
 #: templates/account/email/email_confirm_message.txt:4
-#| msgid "You have confirmed %(email)s."
 msgid "Your email has been confirmed."
-msgstr "あなたのメールアドレスは確認されました。"
+msgstr "あなたのメールアドレスが確認されました。"
 
 #: templates/account/email/email_confirm_subject.txt:3
 #| msgid "email confirmation"
@@ -558,8 +542,10 @@ msgid ""
 "\n"
 "To confirm this is correct, go to %(activate_url)s"
 msgstr ""
-"%(user_display)s さんが %(site_domain)s にこのメールアドレスを登録しようとしています。\n"
-"問題がなければ、確認のために以下のURLをクリックしてください。\n"
+"%(user_display)s さんが %(site_domain)s "
+"にこのメールアドレスを登録しようとしています。\n"
+"\n"
+"問題がなければ、確認のために下記の URL をクリックしてください。\n"
 "%(activate_url)s"
 
 #: templates/account/email/email_confirmation_subject.txt:3
@@ -569,7 +555,7 @@ msgstr "メールアドレスを確認してください"
 #: templates/account/email/email_deleted_message.txt:4
 #, python-format
 msgid "Email address %(deleted_email)s has been removed from your account."
-msgstr "メールアドレス %(deleted_email)s はあなたのアカウントから削除されました。"
+msgstr "メールアドレス %(deleted_email)s があなたのアカウントから削除されました。"
 
 #: templates/account/email/email_deleted_subject.txt:3
 #| msgid "Remove"
@@ -587,26 +573,22 @@ msgid "Password Changed"
 msgstr "パスワードが変更されました"
 
 #: templates/account/email/password_reset_key_message.txt:4
-#| msgid ""
-#| "You're receiving this e-mail because you or someone else has requested a "
-#| "password for your user account.\n"
-#| "It can be safely ignored if you did not request a password reset. Click "
-#| "the link below to reset your password."
 msgid ""
 "You're receiving this email because you or someone else has requested a "
 "password reset for your user account.\n"
 "It can be safely ignored if you did not request a password reset. Click the "
 "link below to reset your password."
 msgstr ""
-"このメールは、あなた（もしくは別の誰か）がパスワードの再設定を行おうとしたた"
-"めに送られました。\n"
+"このメールは、あなた (もしくは別の誰か) "
+"がパスワードの再設定を行おうとしたために送られました。\n"
 "パスワードの再設定を要求したのがあなたではない場合、このメールは無視してくだ"
-"さい。パスワードを再設定するためには、以下のリンクをクリックしてください。"
+"さい。\n"
+"パスワードを再設定するためには、以下のリンクをクリックしてください。"
 
 #: templates/account/email/password_reset_key_message.txt:9
 #, python-format
 msgid "In case you forgot, your username is %(username)s."
-msgstr "あなたのアカウント（ユーザー名）は %(username)s です。"
+msgstr "あなたのアカウントのユーザー名は %(username)s です。"
 
 #: templates/account/email/password_reset_key_subject.txt:3
 #: templates/account/email/unknown_account_subject.txt:3
@@ -632,9 +614,8 @@ msgid "Your password has been set."
 msgstr "パスワードが設定されました。"
 
 #: templates/account/email/password_set_subject.txt:3
-#| msgid "Password Reset"
 msgid "Password Set"
-msgstr "パスワード再設定"
+msgstr "パスワード設定"
 
 #: templates/account/email/unknown_account_message.txt:4
 #| msgid ""
@@ -682,10 +663,8 @@ msgid "Cancel Change"
 msgstr ""
 
 #: templates/account/email_change.html:49
-#, fuzzy
-#| msgid "Email"
 msgid "Change to"
-msgstr "メールアドレス"
+msgstr ""
 
 #: templates/account/email_change.html:55
 #: templates/allauth/layouts/base.html:29
@@ -714,24 +693,20 @@ msgstr "確認する"
 
 #: templates/account/email_confirm.html:29
 #: templates/account/messages/email_confirmation_failed.txt:2
-#, fuzzy, python-format
-#| msgid "The social account is already connected to a different account."
+#, python-format
 msgid ""
 "Unable to confirm %(email)s because it is already confirmed by a different "
 "account."
-msgstr "この外部アカウントは他のアカウントにリンクされています。"
+msgstr "%(email)s はすでにほかのアカウントで確認済みです。"
 
 #: templates/account/email_confirm.html:35
-#, fuzzy, python-format
-#| msgid ""
-#| "This e-mail confirmation link expired or is invalid. Please <a "
-#| "href=\"%(email_url)s\">issue a new e-mail confirmation request</a>."
+#, python-format
 msgid ""
 "This email confirmation link expired or is invalid. Please <a "
 "href=\"%(email_url)s\">issue a new email confirmation request</a>."
 msgstr ""
-"メールアドレス確認用のリンクが不正か、期限が切れています。<a "
-"href=\"%(email_url)s\">確認用のメールを再送</a>してください。"
+"メールアドレス確認用のリンクが不正か、期限が切れています。<a href=\""
+"%(email_url)s\">確認用のメールを再送</a>してください。"
 
 #: templates/account/login.html:5 templates/account/login.html:9
 #: templates/account/login.html:29 templates/allauth/layouts/base.html:36
@@ -745,8 +720,8 @@ msgstr "ログイン"
 msgid ""
 "If you have not created an account yet, then please\n"
 "    <a href=\"%(signup_url)s\">sign up</a> first."
-msgstr ""
-"アカウントをまだお持ちでなければ、こちらから <a href=\"%(signup_url)s\">ユーザー登録</a> してください。"
+msgstr "アカウントをまだお持ちでなければ、 <a href=\"%(signup_url)s\""
+">こちらからユーザー登録</a> してください。"
 
 #: templates/account/logout.html:4 templates/account/logout.html:8
 #: templates/account/logout.html:23 templates/allauth/layouts/base.html:32
@@ -756,22 +731,22 @@ msgstr "ログアウト"
 
 #: templates/account/logout.html:10
 msgid "Are you sure you want to sign out?"
-msgstr "ログアウトしますか？"
+msgstr "ログアウトしますか?"
 
 #: templates/account/messages/cannot_delete_primary_email.txt:2
 #, python-format
 msgid "You cannot remove your primary email address (%(email)s)."
-msgstr "メインのメールアドレス（%(email)s）を削除することはできません。"
+msgstr "メインのメールアドレス (%(email)s) を削除することはできません。"
 
 #: templates/account/messages/email_confirmation_sent.txt:2
 #, python-format
 msgid "Confirmation email sent to %(email)s."
-msgstr "%(email)s に確認メールを送信しました。"
+msgstr "確認メールを %(email)s へ送信しました。"
 
 #: templates/account/messages/email_confirmed.txt:2
 #, python-format
 msgid "You have confirmed %(email)s."
-msgstr "%(email)s は確認されました。"
+msgstr "%(email)s が確認されました。"
 
 #: templates/account/messages/email_deleted.txt:2
 #, python-format
@@ -816,14 +791,14 @@ msgstr "パスワード変更"
 
 #: templates/account/password_change.html:21
 msgid "Forgot Password?"
-msgstr "パスワードをお忘れですか？"
+msgstr "パスワードをお忘れですか?"
 
 #: templates/account/password_reset.html:14
 msgid ""
 "Forgotten your password? Enter your email address below, and we'll send you "
 "an email allowing you to reset it."
-msgstr ""
-"パスワードをお忘れですか？パスワードをリセットするために、メールアドレスを入力してください。"
+msgstr "パスワードをお忘れですか? "
+"パスワードをリセットするために、メールアドレスを入力してください。"
 
 #: templates/account/password_reset.html:25
 msgid "Reset My Password"
@@ -907,7 +882,7 @@ msgstr "%(user_display)s さんとしてすでにログイン中です。"
 
 #: templates/account/snippets/warn_no_email.html:3
 msgid "Warning:"
-msgstr "注意："
+msgstr "注意:"
 
 #: templates/account/snippets/warn_no_email.html:3
 msgid ""
@@ -936,11 +911,6 @@ msgstr ""
 "さい。"
 
 #: templates/account/verified_email_required.html:13
-#, fuzzy
-#| msgid ""
-#| "This part of the site requires us to verify that\n"
-#| "you are who you claim to be. For this purpose, we require that you\n"
-#| "verify ownership of your e-mail address. "
 msgid ""
 "This part of the site requires us to verify that\n"
 "you are who you claim to be. For this purpose, we require that you\n"
@@ -948,7 +918,7 @@ msgid ""
 msgstr ""
 "このページにアクセスするためには、本人確認が必要です。\n"
 "そのために、登録されているメールアドレスがご自身のものであることを確認してい"
-"ただきます。"
+"ただきます。 "
 
 #: templates/account/verified_email_required.html:18
 msgid ""
@@ -958,8 +928,10 @@ msgid ""
 "Otherwise\n"
 "contact us if you do not receive it within a few minutes."
 msgstr ""
-"確認のためのメールを送信しました。メールに記載されたリンクをクリックしてください。\n"
-"確認メールが受信ボックスに見つからない場合は、スパムフォルダをチェックしてください。"
+"確認のためのメールを送信しました。メールに記載されたリンクをクリックしてくだ"
+"さい。\n"
+"確認メールが受信ボックスに見つからない場合は、迷惑メールフォルダをチェックし"
+"てください。\n"
 "数分以内にメールが届かない場合はご連絡ください。"
 
 #: templates/account/verified_email_required.html:23
@@ -972,24 +944,23 @@ msgstr ""
 
 #: templates/allauth/layouts/base.html:18
 msgid "Messages:"
-msgstr "メッセージ"
+msgstr "メッセージ:"
 
 #: templates/allauth/layouts/base.html:25
 msgid "Menu:"
-msgstr "メニュー"
+msgstr "メニュー:"
 
 #: templates/mfa/authenticate.html:9 templates/mfa/index.html:5
 #: templates/mfa/index.html:9
 msgid "Two-Factor Authentication"
-msgstr "二段階認証"
+msgstr "二要素認証"
 
 #: templates/mfa/authenticate.html:12
 msgid ""
 "Your account is protected by two-factor authentication. Please enter an "
 "authenticator code:"
-msgstr ""
-"あなたのアカウントは二段階認証で保護されています。"
-"認証コードを入力してください:"
+msgstr "あなたのアカウントは二要素認証で保護されています。認証コードを入力してくださ"
+"い:"
 
 #: templates/mfa/authenticate.html:27
 msgid "Cancel"
@@ -998,11 +969,11 @@ msgstr "キャンセル"
 #: templates/mfa/email/recovery_codes_generated_message.txt:4
 msgid ""
 "A new set of Two-Factor Authentication recovery codes has been generated."
-msgstr "二段階認証用のリカバリーコードを新たに生成しました。"
+msgstr "二要素認証用のリカバリーコードを新たに生成しました。"
 
 #: templates/mfa/email/recovery_codes_generated_subject.txt:3
 msgid "New Recovery Codes Generated"
-msgstr "二段階認証用のリカバリーコードを生成しました。"
+msgstr "二要素認証用のリカバリーコードを生成しました"
 
 #: templates/mfa/email/totp_activated_message.txt:4
 #: templates/mfa/messages/totp_activated.txt:2
@@ -1011,7 +982,7 @@ msgstr "認証アプリが有効化されました。"
 
 #: templates/mfa/email/totp_activated_subject.txt:3
 msgid "Authenticator App Activated"
-msgstr "認証アプリが有効化されました。"
+msgstr "認証アプリが有効化されました"
 
 #: templates/mfa/email/totp_deactivated_message.txt:4
 #: templates/mfa/messages/totp_deactivated.txt:2
@@ -1019,10 +990,8 @@ msgid "Authenticator app deactivated."
 msgstr "認証アプリが無効化されました。"
 
 #: templates/mfa/email/totp_deactivated_subject.txt:3
-#, fuzzy
-#| msgid "token secret"
 msgid "Authenticator App Deactivated"
-msgstr "トークンシークレット"
+msgstr "認証アプリが無効化されました"
 
 #: templates/mfa/index.html:14 templates/mfa/totp/base.html:4
 msgid "Authenticator App"
@@ -1056,10 +1025,7 @@ msgid ""
 "There is %(unused_count)s out of %(total_count)s recovery codes available."
 msgid_plural ""
 "There are %(unused_count)s out of %(total_count)s recovery codes available."
-msgstr[0] ""
-"利用可能なリカバリーコードは%(unused_count)s個中%(total_count)s個です。"
-msgstr[1] ""
-"利用可能なリカバリーコードは%(unused_count)s個中%(total_count)s個です。"
+msgstr[0] "利用可能なリカバリーコードは %(unused_count)s 個中 %(total_count)s 個です。"
 
 #: templates/mfa/index.html:50
 msgid "No recovery codes set up."
@@ -1067,7 +1033,7 @@ msgstr "リカバリーコードがセットアップされていません。"
 
 #: templates/mfa/index.html:59
 msgid "View"
-msgstr ""
+msgstr "表示"
 
 #: templates/mfa/index.html:65
 msgid "Download"
@@ -1083,7 +1049,7 @@ msgstr "新しいリカバリーコードセットが生成されました。"
 
 #: templates/mfa/reauthenticate.html:5
 msgid "Enter an authenticator code:"
-msgstr "認証アプリのコードを入力する"
+msgstr "認証アプリのコードを入力:"
 
 #: templates/mfa/recovery_codes/generate.html:9
 msgid "You are about to generate a new set of recovery codes for your account."
@@ -1095,7 +1061,7 @@ msgstr "この操作により、現在のコードが無効になります。"
 
 #: templates/mfa/recovery_codes/generate.html:13
 msgid "Are you sure?"
-msgstr "本当によろしいですか？"
+msgstr "本当によろしいですか?"
 
 #: templates/mfa/recovery_codes/index.html:13
 msgid "Unused codes"
@@ -1120,20 +1086,19 @@ msgid ""
 "below with your authenticator app. Then, input the verification code "
 "generated by the app below."
 msgstr ""
-"アカウントを二要素認証で保護するために、認証アプリで以下のQRコードをスキャン"
-"してください。次に、アプリで生成された確認コードを以下に入力してください。"
+"アカウントを二要素認証で保護するために、認証アプリで以下の QR コードをスキャ"
+"ンしてください。次に、アプリで生成された確認コードを以下に入力してください。"
 
 #: templates/mfa/totp/activate_form.html:21
 msgid "Authenticator secret"
-msgstr "トークンシークレット"
+msgstr "認証アプリシークレット"
 
 #: templates/mfa/totp/activate_form.html:24
 msgid ""
 "You can store this secret and use it to reinstall your authenticator app at "
 "a later time."
-msgstr ""
-"このシークレットを保存し、後でオーセンティケーターアプリを再インストールする"
-"際に使用できます。"
+msgstr "このシークレットを保存し、後で認証アプリを再インストールする際に使用できます"
+"。"
 
 #: templates/mfa/totp/deactivate_form.html:5
 #: templates/mfa/totp/deactivate_form.html:9
@@ -1144,7 +1109,7 @@ msgstr "認証アプリを無効化する"
 msgid ""
 "You are about to deactivate authenticator app based authentication. Are you "
 "sure?"
-msgstr "認証アプリによる認証を無効化しようとしています。本当によろしいですか。"
+msgstr "認証アプリによる認証を無効化しようとしています。本当によろしいですか?"
 
 #: templates/socialaccount/authentication_error.html:5
 #: templates/socialaccount/authentication_error.html:9
@@ -1161,13 +1126,13 @@ msgstr ""
 #: templates/socialaccount/connections.html:5
 #: templates/socialaccount/connections.html:9
 msgid "Account Connections"
-msgstr "アカウントリンク"
+msgstr "アカウント接続"
 
 #: templates/socialaccount/connections.html:13
 msgid ""
 "You can sign in to your account using any of the following third-party "
 "accounts:"
-msgstr "以下の外部アカウントを使ってログインすることができます："
+msgstr "以下の外部アカウントを使ってログインすることができます:"
 
 #: templates/socialaccount/connections.html:45
 msgid "You currently have no third-party accounts connected to this account."
@@ -1184,10 +1149,8 @@ msgid ""
 msgstr ""
 
 #: templates/socialaccount/email/account_connected_subject.txt:3
-#, fuzzy
-#| msgid "Add a 3rd Party Account"
 msgid "Third-Party Account Connected"
-msgstr "外部アカウントを追加する"
+msgstr "外部アカウントと接続されました"
 
 #: templates/socialaccount/email/account_disconnected_message.txt:4
 #, python-format
@@ -1203,21 +1166,20 @@ msgstr "外部アカウントは接続解除されました"
 #: templates/socialaccount/login.html:10
 #, python-format
 msgid "Connect %(provider)s"
-msgstr "%(provider)sと連携する"
+msgstr "%(provider)s と接続する"
 
 #: templates/socialaccount/login.html:13
 msgid "You are about to connect a new third-party account from %(provider)s."
-msgstr ""
-"%(provider)sの新しいサードパーティーアカウントを連携しようとしています。"
+msgstr "%(provider)sの新しい外部アカウントを接続しようとしています。"
 
 #: templates/socialaccount/login.html:17
 #, python-format
 msgid "Sign In Via %(provider)s"
-msgstr "%(provider)sでログインする"
+msgstr "%(provider)s でログインする"
 
 #: templates/socialaccount/login.html:20
 msgid "You are about to sign in using a third-party account from %(provider)s."
-msgstr "%(provider)sのサードパーティーアカウントを使用してログインしようとしています。"
+msgstr "%(provider)s の外部アカウントを使用してログインしようとしています。"
 
 #: templates/socialaccount/login.html:27
 msgid "Continue"
@@ -1236,29 +1198,27 @@ msgid ""
 "href=\"%(login_url)s\">sign in</a>."
 msgstr ""
 "既存の外部アカウントを使ったログインはキャンセルされました。\n"
-"やり直される場合は<a href=\"%(login_url)s\">ログイン</a>ページにお進みくださ"
-"い。"
+"やり直す場合は<a href=\"%(login_url)s\">ログインページ</a>にお進みください。"
 
 #: templates/socialaccount/messages/account_connected.txt:2
-#| msgid "The social account has been connected."
 msgid "The third-party account has been connected."
-msgstr "外部アカウントがリンクされました"
+msgstr "外部アカウントが接続されました。"
 
 #: templates/socialaccount/messages/account_connected_other.txt:2
-#| msgid "The social account is already connected to a different account."
 msgid "The third-party account is already connected to a different account."
-msgstr "この外部アカウントは他のアカウントにリンクされています。"
+msgstr "この外部アカウントは他のアカウントに接続されています。"
 
 #: templates/socialaccount/messages/account_disconnected.txt:2
 msgid "The third-party account has been disconnected."
-msgstr "外部アカウントのリンクが解除されました。"
+msgstr "外部アカウントの接続が解除されました。"
 
 #: templates/socialaccount/signup.html:12
 msgid ""
 "You are about to use your %(provider_name)s account to login to\n"
 "%(site_name)s. As a final step, please complete the following form:"
 msgstr ""
-"%(provider_name)s アカウントを使って %(site_name)s にログインしようとしています。"
+"%(provider_name)s アカウントを使って %(site_name)s "
+"にログインしようとしています。\n"
 "ユーザー登録のために、以下のフォームに記入してください。"
 
 #: templates/socialaccount/snippets/login.html:9
@@ -1272,29 +1232,27 @@ msgstr ""
 #: templates/usersessions/usersession_list.html:6
 #: templates/usersessions/usersession_list.html:10
 msgid "Sessions"
-msgstr ""
+msgstr "セッション"
 
 #: templates/usersessions/usersession_list.html:23
 msgid "Started At"
-msgstr ""
+msgstr "開始日時"
 
 #: templates/usersessions/usersession_list.html:24
-#, fuzzy
-#| msgid "Email Addresses"
 msgid "IP Address"
-msgstr "メールアドレス"
+msgstr "IP アドレス"
 
 #: templates/usersessions/usersession_list.html:25
 msgid "Browser"
-msgstr ""
+msgstr "ブラウザー"
 
 #: templates/usersessions/usersession_list.html:27
 msgid "Last seen at"
-msgstr ""
+msgstr "閲覧日時"
 
 #: templates/usersessions/usersession_list.html:47
 msgid "Current"
-msgstr "現在のパスワード"
+msgstr "現在の"
 
 #: templates/usersessions/usersession_list.html:60
 msgid "Sign Out Other Sessions"
@@ -1302,11 +1260,11 @@ msgstr ""
 
 #: usersessions/apps.py:9
 msgid "User Sessions"
-msgstr ""
+msgstr "ユーザーセッション"
 
 #: usersessions/models.py:48
 msgid "session key"
-msgstr ""
+msgstr "セッションキー"
 
 #, fuzzy
 #~| msgid "The following email addresses are associated with your account:"
diff --git a/allauth/locale/ru/LC_MESSAGES/django.po b/allauth/locale/ru/LC_MESSAGES/django.po
index 6f79fec9..1b7ce0d0 100644
--- a/allauth/locale/ru/LC_MESSAGES/django.po
+++ b/allauth/locale/ru/LC_MESSAGES/django.po
@@ -90,7 +90,7 @@ msgstr "Указанные вами адрес электронной почты
 
 #: account/forms.py:102
 msgid "The username and/or password you specified are not correct."
-msgstr "Имя пользователя и/или пароль не верны."
+msgstr "Имя пользователя и/или пароль неверны."
 
 #: account/forms.py:112 account/forms.py:287 account/forms.py:477
 #: account/forms.py:574
@@ -573,25 +573,19 @@ msgstr "Пожалуйста, подтвердите Ваш адрес элек
 #: templates/account/email/email_deleted_message.txt:4
 #, python-format
 msgid "Email address %(deleted_email)s has been removed from your account."
-msgstr ""
+msgstr "Адрес электронной почты %(deleted_email)s был удалён из вашей учётной записи"
 
 #: templates/account/email/email_deleted_subject.txt:3
-#, fuzzy
-#| msgid "Remove"
 msgid "Email Removed"
-msgstr "Удалить"
+msgstr "Email удалён"
 
 #: templates/account/email/password_changed_message.txt:4
-#, fuzzy
-#| msgid "Your password is now changed."
 msgid "Your password has been changed."
 msgstr "Ваш пароль изменён."
 
 #: templates/account/email/password_changed_subject.txt:3
-#, fuzzy
-#| msgid "Password (again)"
 msgid "Password Changed"
-msgstr "Пароль (ещё раз)"
+msgstr "Пароль Изменён"
 
 #: templates/account/email/password_reset_key_message.txt:4
 msgid ""
@@ -616,10 +610,8 @@ msgid "Password Reset Email"
 msgstr "Письмо для сброса пароля"
 
 #: templates/account/email/password_reset_message.txt:4
-#, fuzzy
-#| msgid "Your password has been deleted."
 msgid "Your password has been reset."
-msgstr "Ваш пароль был удален."
+msgstr "Ваш пароль был сброшен."
 
 #: templates/account/email/password_reset_subject.txt:3
 #: templates/account/password_reset.html:4
@@ -630,16 +622,12 @@ msgid "Password Reset"
 msgstr "Сброс пароля"
 
 #: templates/account/email/password_set_message.txt:4
-#, fuzzy
-#| msgid "Your password has been deleted."
 msgid "Your password has been set."
-msgstr "Ваш пароль был удален."
+msgstr "Ваш пароль был установлен."
 
 #: templates/account/email/password_set_subject.txt:3
-#, fuzzy
-#| msgid "Password Reset"
 msgid "Password Set"
-msgstr "Сброс пароля"
+msgstr "Пароль Установлен"
 
 #: templates/account/email/unknown_account_message.txt:4
 #, python-format
@@ -1004,10 +992,8 @@ msgid ""
 msgstr "Был создан новый набор кодов восстановления."
 
 #: templates/mfa/email/recovery_codes_generated_subject.txt:3
-#, fuzzy
-#| msgid "Recovery Codes"
 msgid "New Recovery Codes Generated"
-msgstr "Коды восстановления"
+msgstr "Сгенерированы Новые Коды Восстановления"
 
 #: templates/mfa/email/totp_activated_message.txt:4
 #: templates/mfa/messages/totp_activated.txt:2
diff --git a/allauth/socialaccount/providers/atlassian/__init__.py b/allauth/socialaccount/providers/atlassian/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/allauth/socialaccount/providers/atlassian/provider.py b/allauth/socialaccount/providers/atlassian/provider.py
new file mode 100644
index 00000000..566d0ab3
--- /dev/null
+++ b/allauth/socialaccount/providers/atlassian/provider.py
@@ -0,0 +1,38 @@
+from allauth.socialaccount.providers.base import ProviderAccount
+from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider
+
+from .views import AtlassianOAuth2Adapter
+
+
+class AtlassianAccount(ProviderAccount):
+    def get_profile_url(self):
+        return self.account.extra_data.get("picture")
+
+
+class AtlassianProvider(OAuth2Provider):
+    id = "atlassian"
+    name = "Atlassian"
+    account_class = AtlassianAccount
+    oauth2_adapter_class = AtlassianOAuth2Adapter
+
+    def extract_uid(self, data):
+        return data["account_id"]
+
+    def extract_common_fields(self, data):
+        return {
+            "email": data.get("email"),
+            "name": data.get("name"),
+            "username": data.get("nickname"),
+            "email_verified": data.get("email_verified"),
+        }
+
+    def get_default_scope(self):
+        return ["read:me"]
+
+    def get_auth_params(self):
+        params = super().get_auth_params()
+        params.update({"audience": "api.atlassian.com", "prompt": "consent"})
+        return params
+
+
+provider_classes = [AtlassianProvider]
diff --git a/allauth/socialaccount/providers/atlassian/urls.py b/allauth/socialaccount/providers/atlassian/urls.py
new file mode 100644
index 00000000..3c540d13
--- /dev/null
+++ b/allauth/socialaccount/providers/atlassian/urls.py
@@ -0,0 +1,6 @@
+from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns
+
+from .provider import AtlassianProvider
+
+
+urlpatterns = default_urlpatterns(AtlassianProvider)
diff --git a/allauth/socialaccount/providers/atlassian/views.py b/allauth/socialaccount/providers/atlassian/views.py
new file mode 100644
index 00000000..3acb92e2
--- /dev/null
+++ b/allauth/socialaccount/providers/atlassian/views.py
@@ -0,0 +1,29 @@
+from allauth.socialaccount.adapter import get_adapter
+from allauth.socialaccount.providers.oauth2.views import (
+    OAuth2Adapter,
+    OAuth2CallbackView,
+    OAuth2LoginView,
+)
+
+
+class AtlassianOAuth2Adapter(OAuth2Adapter):
+    provider_id = "atlassian"
+    access_token_url = "https://api.atlassian.com/oauth/token"
+    authorize_url = "https://auth.atlassian.com/authorize"
+    profile_url = "https://api.atlassian.com/me"
+
+    def complete_login(self, request, app, access_token, **kwargs):
+        headers = {
+            "Authorization": f"Bearer {access_token}",
+            "Accept": "application/json",
+        }
+        response = (
+            get_adapter().get_requests_session().get(self.profile_url, headers=headers)
+        )
+        response.raise_for_status()
+        data = response.json()
+        return self.get_provider().sociallogin_from_response(request, data)
+
+
+oauth2_login = OAuth2LoginView.adapter_view(AtlassianOAuth2Adapter)
+oauth2_callback = OAuth2CallbackView.adapter_view(AtlassianOAuth2Adapter)
diff --git a/allauth/socialaccount/providers/facebook/flows.py b/allauth/socialaccount/providers/facebook/flows.py
new file mode 100644
index 00000000..b46f6187
--- /dev/null
+++ b/allauth/socialaccount/providers/facebook/flows.py
@@ -0,0 +1,137 @@
+import hashlib
+import hmac
+from datetime import timedelta
+
+from django.core.cache import cache
+from django.utils import timezone
+
+from allauth.socialaccount.adapter import get_adapter
+from allauth.socialaccount.models import SocialLogin, SocialToken
+from allauth.socialaccount.providers.base import Provider
+from allauth.socialaccount.providers.facebook.constants import GRAPH_API_URL
+
+
+def compute_appsecret_proof(app, token):
+    # Generate an appsecret_proof parameter to secure the Graph API call
+    # see https://developers.facebook.com/docs/graph-api/securing-requests
+    msg = token.token.encode("utf-8")
+    key = app.secret.encode("utf-8")
+    appsecret_proof = hmac.new(key, msg, digestmod=hashlib.sha256).hexdigest()
+    return appsecret_proof
+
+
+def complete_login(request, provider, token):
+    resp = (
+        get_adapter()
+        .get_requests_session()
+        .get(
+            GRAPH_API_URL + "/me",
+            params={
+                "fields": ",".join(provider.get_fields()),
+                "access_token": token.token,
+                "appsecret_proof": compute_appsecret_proof(provider.app, token),
+            },
+        )
+    )
+    resp.raise_for_status()
+    extra_data = resp.json()
+    login = provider.sociallogin_from_response(request, extra_data)
+    return login
+
+
+def get_app_token(provider):
+    app = provider.app
+    cache_key = f"allauth.facebook.app_token[{app.client_id}]"
+    app_token = cache.get(cache_key)
+    if not app_token:
+        resp = (
+            get_adapter()
+            .get_requests_session()
+            .get(
+                GRAPH_API_URL + "/oauth/access_token",
+                params={
+                    "client_id": app.client_id,
+                    "client_secret": app.secret,
+                    "grant_type": "client_credentials",
+                },
+            )
+        )
+        resp.raise_for_status()
+        data = resp.json()
+        app_token = data["access_token"]
+        timeout = provider.get_settings().get("APP_TOKEN_CACHE_TIMEOUT", 300)
+        cache.set(cache_key, app_token, timeout=timeout)
+    return app_token
+
+
+def inspect_token(provider, input_token):
+    app_token = get_app_token(provider)
+    resp = (
+        get_adapter()
+        .get_requests_session()
+        .get(
+            GRAPH_API_URL + "/debug_token",
+            params={"input_token": input_token, "access_token": app_token},
+        )
+    )
+    resp.raise_for_status()
+    data = resp.json()["data"]
+    if not data["is_valid"]:
+        raise get_adapter().validation_error("invalid_token")
+    if data["app_id"] != provider.app.client_id or not data["is_valid"]:
+        raise get_adapter().validation_error("invalid_token")
+
+
+def verify_token(
+    request,
+    provider: Provider,
+    access_token: str,
+    auth_type: str = "",
+    auth_nonce: str = "",
+) -> SocialLogin:
+    app = provider.app
+    inspect_token(provider, access_token)
+    expires_at = None
+    if auth_type == "reauthenticate":
+        resp = (
+            get_adapter()
+            .get_requests_session()
+            .get(
+                GRAPH_API_URL + "/oauth/access_token_info",
+                params={
+                    "client_id": app.client_id,
+                    "access_token": access_token,
+                },
+            )
+        )
+        resp.raise_for_status()
+        info = resp.json()
+        ok = auth_nonce and auth_nonce == info.get("auth_nonce")
+        if not ok:
+            raise get_adapter().validation_error("invalid_token")
+
+    if provider.get_settings().get("EXCHANGE_TOKEN"):
+        resp = (
+            get_adapter()
+            .get_requests_session()
+            .get(
+                GRAPH_API_URL + "/oauth/access_token",
+                params={
+                    "grant_type": "fb_exchange_token",
+                    "client_id": app.client_id,
+                    "client_secret": app.secret,
+                    "fb_exchange_token": access_token,
+                },
+            )
+        )
+        resp.raise_for_status()
+        info = resp.json()
+        access_token = info["access_token"]
+        expires_in = info.get("expires_in")
+        if expires_in:
+            expires_at = timezone.now() + timedelta(seconds=int(expires_in))
+
+    token = SocialToken(app=app, token=access_token, expires_at=expires_at)
+    login = complete_login(request, provider, token)
+    login.token = token
+    return login
diff --git a/allauth/socialaccount/providers/facebook/provider.py b/allauth/socialaccount/providers/facebook/provider.py
index b0ab6197..8f0bb0f5 100644
--- a/allauth/socialaccount/providers/facebook/provider.py
+++ b/allauth/socialaccount/providers/facebook/provider.py
@@ -1,4 +1,5 @@
 import json
+import requests
 import string
 from urllib.parse import quote
 
@@ -9,6 +10,7 @@ from django.utils.crypto import get_random_string
 from django.utils.html import escapejs, mark_safe
 
 from allauth.account.models import EmailAddress
+from allauth.socialaccount.adapter import get_adapter
 from allauth.socialaccount.app_settings import QUERY_EMAIL
 from allauth.socialaccount.providers.base import (
     AuthAction,
@@ -25,6 +27,7 @@ from allauth.socialaccount.providers.facebook.constants import (
 from allauth.socialaccount.providers.facebook.views import (
     FacebookOAuth2Adapter,
 )
+from allauth.socialaccount.providers.oauth2.client import OAuth2Error
 from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider
 from allauth.utils import import_callable
 
@@ -55,6 +58,7 @@ class FacebookProvider(OAuth2Provider):
     name = "Facebook"
     account_class = FacebookAccount
     oauth2_adapter_class = FacebookOAuth2Adapter
+    supports_token_authentication = True
 
     def __init__(self, *args, **kwargs):
         self._locale_callable_cache = None
@@ -204,5 +208,17 @@ class FacebookProvider(OAuth2Provider):
             ret.append(EmailAddress(email=email, verified=False, primary=True))
         return ret
 
+    def verify_token(self, request, token):
+        from allauth.socialaccount.providers.facebook import flows
+
+        access_token = token.get("access_token")
+        if not access_token:
+            raise get_adapter().validation_error("invalid_token")
+        try:
+            login = flows.verify_token(request, self, access_token)
+        except (OAuth2Error, requests.RequestException) as e:
+            raise get_adapter().validation_error("invalid_token") from e
+        return login
+
 
 provider_classes = [FacebookProvider]
diff --git a/allauth/socialaccount/providers/facebook/views.py b/allauth/socialaccount/providers/facebook/views.py
index f2b951f7..3fe7db18 100644
--- a/allauth/socialaccount/providers/facebook/views.py
+++ b/allauth/socialaccount/providers/facebook/views.py
@@ -1,13 +1,8 @@
-import hashlib
-import hmac
 import logging
 import requests
-from datetime import timedelta
 
 from django import forms
-from django.core.cache import cache
 from django.core.exceptions import PermissionDenied
-from django.utils import timezone
 from django.views.generic import View
 
 from allauth.socialaccount import app_settings
@@ -16,7 +11,8 @@ from allauth.socialaccount.helpers import (
     complete_social_login,
     render_authentication_error,
 )
-from allauth.socialaccount.models import SocialLogin, SocialToken
+from allauth.socialaccount.models import SocialLogin
+from allauth.socialaccount.providers.facebook import flows
 from allauth.socialaccount.providers.facebook.constants import (
     GRAPH_API_URL,
     GRAPH_API_VERSION,
@@ -34,35 +30,6 @@ from .forms import FacebookConnectForm
 logger = logging.getLogger(__name__)
 
 
-def compute_appsecret_proof(app, token):
-    # Generate an appsecret_proof parameter to secure the Graph API call
-    # see https://developers.facebook.com/docs/graph-api/securing-requests
-    msg = token.token.encode("utf-8")
-    key = app.secret.encode("utf-8")
-    appsecret_proof = hmac.new(key, msg, digestmod=hashlib.sha256).hexdigest()
-    return appsecret_proof
-
-
-def fb_complete_login(request, app, token):
-    provider = app.get_provider(request)
-    resp = (
-        get_adapter()
-        .get_requests_session()
-        .get(
-            GRAPH_API_URL + "/me",
-            params={
-                "fields": ",".join(provider.get_fields()),
-                "access_token": token.token,
-                "appsecret_proof": compute_appsecret_proof(app, token),
-            },
-        )
-    )
-    resp.raise_for_status()
-    extra_data = resp.json()
-    login = provider.sociallogin_from_response(request, extra_data)
-    return login
-
-
 class FacebookOAuth2Adapter(OAuth2Adapter):
     provider_id = PROVIDER_ID
     provider_default_auth_url = "https://www.facebook.com/{}/dialog/oauth".format(
@@ -77,7 +44,8 @@ class FacebookOAuth2Adapter(OAuth2Adapter):
     expires_in_key = "expires_in"
 
     def complete_login(self, request, app, access_token, **kwargs):
-        return fb_complete_login(request, app, access_token)
+        provider = self.get_provider()
+        return flows.complete_login(request, provider, access_token)
 
 
 oauth2_login = OAuth2LoginView.adapter_view(FacebookOAuth2Adapter)
@@ -106,99 +74,19 @@ class LoginByTokenView(View):
         form = FacebookConnectForm(request.POST)
         if not form.is_valid():
             raise self.adapter.validation_error("invalid_token")
-
+        access_token = form.cleaned_data["access_token"]
         provider = self.provider
         login_options = provider.get_fb_login_options(request)
-        app = provider.app
-        access_token = form.cleaned_data["access_token"]
-
-        self.inspect_token(provider, access_token)
-
-        expires_at = None
-        if login_options.get("auth_type") == "reauthenticate":
-            info = (
-                get_adapter()
-                .get_requests_session()
-                .get(
-                    GRAPH_API_URL + "/oauth/access_token_info",
-                    params={
-                        "client_id": app.client_id,
-                        "access_token": access_token,
-                    },
-                )
-                .json()
-            )
-            nonce = provider.get_nonce(request, pop=True)
-            ok = nonce and nonce == info.get("auth_nonce")
-        else:
-            ok = True
-        if ok and provider.get_settings().get("EXCHANGE_TOKEN"):
-            resp = (
-                get_adapter()
-                .get_requests_session()
-                .get(
-                    GRAPH_API_URL + "/oauth/access_token",
-                    params={
-                        "grant_type": "fb_exchange_token",
-                        "client_id": app.client_id,
-                        "client_secret": app.secret,
-                        "fb_exchange_token": access_token,
-                    },
-                )
-                .json()
-            )
-            access_token = resp["access_token"]
-            expires_in = resp.get("expires_in")
-            if expires_in:
-                expires_at = timezone.now() + timedelta(seconds=int(expires_in))
-        if ok:
-            token = SocialToken(app=app, token=access_token, expires_at=expires_at)
-            login = fb_complete_login(request, app, token)
-            login.token = token
-            login.state = SocialLogin.state_from_request(request)
-            ret = complete_social_login(request, login)
-        return ret
-
-    def get_app_token(self, provider):
-        app = provider.app
-        cache_key = f"allauth.facebook.app_token[{app.client_id}]"
-        app_token = cache.get(cache_key)
-        if not app_token:
-            resp = (
-                get_adapter()
-                .get_requests_session()
-                .get(
-                    GRAPH_API_URL + "/oauth/access_token",
-                    params={
-                        "client_id": app.client_id,
-                        "client_secret": app.secret,
-                        "grant_type": "client_credentials",
-                    },
-                )
-            )
-            resp.raise_for_status()
-            data = resp.json()
-            app_token = data["access_token"]
-            timeout = provider.get_settings().get("APP_TOKEN_CACHE_TIMEOUT", 300)
-            cache.set(cache_key, app_token, timeout=timeout)
-        return app_token
-
-    def inspect_token(self, provider, input_token):
-        app_token = self.get_app_token(provider)
-        resp = (
-            get_adapter()
-            .get_requests_session()
-            .get(
-                GRAPH_API_URL + "/debug_token",
-                params={"input_token": input_token, "access_token": app_token},
-            )
+        auth_type = login_options.get("auth_type")
+        auth_nonce = ""
+        if auth_type == "reauthenticate":
+            auth_nonce = provider.get_nonce(request, pop=True)
+        login = flows.verify_token(
+            request, provider, access_token, auth_type, auth_nonce
         )
-        resp.raise_for_status()
-        data = resp.json()["data"]
-        if not data["is_valid"]:
-            raise PermissionDenied("token is not valid")
-        if data["app_id"] != provider.app.client_id or not data["is_valid"]:
-            raise PermissionDenied("token app_id mismatch")
+        login.state = SocialLogin.state_from_request(request)
+        ret = complete_social_login(request, login)
+        return ret
 
 
 login_by_token = LoginByTokenView.as_view()
diff --git a/docs/installation/quickstart.rst b/docs/installation/quickstart.rst
index 687a184d..95802a2f 100644
--- a/docs/installation/quickstart.rst
+++ b/docs/installation/quickstart.rst
@@ -1,10 +1,15 @@
 Quickstart
 ==========
 
-First, Install the python package::
+First, install the python package. If you do not need any of the social account
+related functionality, install using::
 
     pip install django-allauth
 
+Otherwise, install using::
+
+    pip install django-allauth[socialaccount]
+
 Then, assuming you have a Django project up and running, add the following to
 the ``settings.py`` of your project::
 
@@ -43,6 +48,8 @@ the ``settings.py`` of your project::
 
         'allauth',
         'allauth.account',
+
+        # Optional -- requires install using `django-allauth[socialacocunt]`.
         'allauth.socialaccount',
         # ... include the providers you want to enable:
         'allauth.socialaccount.providers.agave',
@@ -161,6 +168,7 @@ the ``settings.py`` of your project::
         'allauth.socialaccount.providers.zoom',
         'allauth.socialaccount.providers.okta',
         'allauth.socialaccount.providers.feishu',
+        "allauth.socialaccount.providers.atlassian",
         ...
     ]
 
diff --git a/docs/socialaccount/introduction.rst b/docs/socialaccount/introduction.rst
index 3cd1f125..a7871d24 100644
--- a/docs/socialaccount/introduction.rst
+++ b/docs/socialaccount/introduction.rst
@@ -1,7 +1,9 @@
 Introduction
 ============
 
-A social account is a user account where authentication is delegated to an external identity provider. The ``allauth.socialaccount`` app is responsible for managing social accounts. It supports:
+A social account is a user account where authentication is delegated to an
+external identity provider. The ``allauth.socialaccount`` app is responsible for
+managing social accounts. It supports:
 
 - Connecting one or more social accounts to a local/regular account
 
@@ -9,3 +11,8 @@ A social account is a user account where authentication is delegated to an exter
   only the local account remains
 
 - Optional instant-signup for social accounts -- no questions asked
+
+Note that in order to use this functionality you need to install the ``socialaccount``
+extras of the ``django-allauth`` package::
+
+  pip install django-allauth[socialaccount]
diff --git a/docs/socialaccount/providers/atlassian.rst b/docs/socialaccount/providers/atlassian.rst
new file mode 100644
index 00000000..cb04fb2a
--- /dev/null
+++ b/docs/socialaccount/providers/atlassian.rst
@@ -0,0 +1,56 @@
+Atlassian
+---------
+
+Atlassian OAuth 2.0 (3LO) apps provider.
+
+More info:
+    https://developer.atlassian.com/cloud/jira/platform/oauth-2-3lo-apps/
+
+
+Enabling OAuth 2.0 (3LO)
+************************
+Before you can implement OAuth 2.0 (3LO) for your app, you need to enable it for your app using the developer console.
+
+Atlassian developer console
+    https://developer.atlassian.com/console/myapps/
+
+1. From any page on developer.atlassian.com, select your profile icon in the top-right corner, and from the dropdown, select Developer console.
+2. Select your app from the list (or create one if you don't already have one).
+3. Select Authorization in the left menu.
+4. Next to OAuth 2.0 (3LO), select Configure.
+5. Enter the Callback URL. Ex. ``http://127.0.0.1:8000/accounts/atlassian/login/callback/``
+6. Click Save changes.
+
+Note, if you haven't already added an API to your app, you should do this now:
+
+1. Select Permissions in the left menu.
+2. Next to the API you want to add, select Add.
+
+
+Django setup
+************
+The app credentials are configured for your Django installation via the admin
+interface. Create a new socialapp through ``/admin/socialaccount/socialapp/``.
+
+Fill in the form as follows:
+
+* Provider, "Atlassian"
+* Name, your pick, suggest "Atlassian"
+* Client id, is called "Client ID" by Atlassian
+* Secret key, is called "Secret" by Atlassian
+* Key, is not needed, leave blank.
+
+Optionally, you can specify the scope to use as follows:
+
+.. code-block:: python
+
+    SOCIALACCOUNT_PROVIDERS = {
+        'atlassian': {
+            'SCOPE': [
+                'read:me',
+                'write:jira-work',
+            ],
+        }
+    }
+
+.. note:: By default (if you do not specify ``SCOPE``), ``read:me`` scope is requested.
diff --git a/docs/socialaccount/providers/index.rst b/docs/socialaccount/providers/index.rst
index 862e5a5d..19ea2bbd 100644
--- a/docs/socialaccount/providers/index.rst
+++ b/docs/socialaccount/providers/index.rst
@@ -40,6 +40,7 @@ Provider Specifics
    amazon
    angellist
    apple
+   atlassian
    auth0
    authentiq
    baidu
diff --git a/docs/socialaccount/providers/openid.rst b/docs/socialaccount/providers/openid.rst
index 943e8b7a..98882dc0 100644
--- a/docs/socialaccount/providers/openid.rst
+++ b/docs/socialaccount/providers/openid.rst
@@ -1,11 +1,16 @@
 OpenID
 ------
 
-The OpenID provider does not require any settings per se. However, a typical
-OpenID login page presents the user with a predefined list of OpenID providers
-and allows the user to input their own OpenID identity URL in case their
-provider is not listed by default. The list of providers displayed by the
-builtin templates can be configured as follows:
+The OpenID provider requires dependencies that are not installed by
+default. Install using::
+
+    $ pip install django-allauth[socialaccount,openid]
+
+The provider does not require any settings per se. However, a typical OpenID
+login page presents the user with a predefined list of OpenID providers and
+allows the user to input their own OpenID identity URL in case their provider is
+not listed by default. The list of providers displayed by the builtin templates
+can be configured as follows:
 
 .. code-block:: python
 
diff --git a/docs/socialaccount/providers/steam.rst b/docs/socialaccount/providers/steam.rst
index 44955a83..7bb48a99 100644
--- a/docs/socialaccount/providers/steam.rst
+++ b/docs/socialaccount/providers/steam.rst
@@ -4,6 +4,11 @@ Steam
 Steam is an OpenID-compliant provider. However, the `steam` provider allows
 access to more of the user's details such as username, full name, avatar, etc.
 
+Its implementation requires dependencies that are not installed by
+default. Install using::
+
+    $ pip install django-allauth[socialaccount,steam]
+
 You need to register an API key here:
     https://steamcommunity.com/dev/apikey
 
diff --git a/examples/react-spa/backend/requirements.txt b/examples/react-spa/backend/requirements.txt
index 0556abeb..1c54f0e0 100644
--- a/examples/react-spa/backend/requirements.txt
+++ b/examples/react-spa/backend/requirements.txt
@@ -1,1 +1,1 @@
-django-allauth==0.60.1
+django-allauth[mfa,socialaccount]==0.60.1
diff --git a/examples/regular-django/README.org b/examples/regular-django/README.org
index 0b532e24..64c2b1e6 100644
--- a/examples/regular-django/README.org
+++ b/examples/regular-django/README.org
@@ -20,7 +20,7 @@ django-allauth example application in this directory:
   cd django-allauth/examples/regular-django
   virtualenv venv
   . venv/bin/activate
-  pip install "../..[mfa,saml]"
+  pip install "../..[mfa,saml,socialaccount]"
 #+end_src
 
 Now we need to create the database tables and an admin user.
diff --git a/examples/regular-django/requirements.txt b/examples/regular-django/requirements.txt
index 4a884292..43f88988 100644
--- a/examples/regular-django/requirements.txt
+++ b/examples/regular-django/requirements.txt
@@ -1,1 +1,1 @@
-django-allauth[mfa,saml]==0.60.1
+django-allauth[mfa,saml,socialaccount]==0.60.1
diff --git a/setup.cfg b/setup.cfg
index ad2bef56..e811b49d 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -47,15 +47,20 @@ tests_require =
     pytest-django >= 4.5.2
 install_requires =
     Django >= 3.2
-    python3-openid >= 3.0.8
-    requests-oauthlib >= 0.3.0
-    requests >= 2.0.0
-    pyjwt[crypto] >= 1.7
 
 [options.extras_require]
-saml = python3-saml>=1.15.0,<2.0.0
 mfa =
     qrcode >= 7.0.0
+openid =
+    python3-openid >= 3.0.8
+saml =
+    python3-saml>=1.15.0,<2.0.0
+steam =
+    python3-openid >= 3.0.8
+socialaccount =
+    requests-oauthlib >= 0.3.0
+    requests >= 2.0.0
+    pyjwt[crypto] >= 1.7
 
 [options.packages.find]
 exclude =
diff --git a/tox.ini b/tox.ini
index 21dd189f..650a1683 100644
--- a/tox.ini
+++ b/tox.ini
@@ -29,6 +29,9 @@ deps =
     python3-saml>=1.15.0,<2.0.0
 extras =
     mfa
+    openid
+    socialaccount
+    steam
 commands =
     coverage run -m pytest {posargs:allauth}
     coverage report


Test patch:
diff --git a/allauth/socialaccount/providers/atlassian/tests.py b/allauth/socialaccount/providers/atlassian/tests.py
new file mode 100644
index 00000000..53d15b36
--- /dev/null
+++ b/allauth/socialaccount/providers/atlassian/tests.py
@@ -0,0 +1,30 @@
+from allauth.socialaccount.tests import OAuth2TestsMixin
+from allauth.tests import MockedResponse, TestCase
+
+from .provider import AtlassianProvider
+
+
+class AtlassianTests(OAuth2TestsMixin, TestCase):
+    provider_id = AtlassianProvider.id
+
+    def get_mocked_response(self):
+        response_data = """
+        {
+            "account_type": "atlassian",
+            "account_id": "112233aa-bb11-cc22-33dd-445566abcabc",
+            "email": "mia@example.com",
+            "email_verified": true,
+            "name": "Mia Krystof",
+            "picture": "https://avatar-management--avatars.us-west-2.prod.public.atl-paas.net/112233aa-bb11-cc22-33dd-445566abcabc/1234abcd-9876-54aa-33aa-1234dfsade9487ds",
+            "account_status": "active",
+            "nickname": "mkrystof",
+            "zoneinfo": "Australia/Sydney",
+            "locale": "en-US",
+            "extended_profile": {
+                "job_title": "Designer",
+                "organization": "mia@example.com",
+                "department": "Design team",
+                "location": "Sydney"
+            }
+        }"""
+        return MockedResponse(200, response_data)
diff --git a/allauth/socialaccount/providers/facebook/tests.py b/allauth/socialaccount/providers/facebook/tests.py
index 7bce38c0..2d511d70 100644
--- a/allauth/socialaccount/providers/facebook/tests.py
+++ b/allauth/socialaccount/providers/facebook/tests.py
@@ -84,6 +84,21 @@ class FacebookTests(OAuth2TestsMixin, TestCase):
         script = self.provider.media_js(request)
         self.assertTrue('"appId": "app123id"' in script)
 
+    def test_token_auth(self):
+        with mocked_response(
+            {"access_token": "app_token"},
+            {
+                "data": {
+                    "app_id": "app123id",
+                    "is_valid": True,
+                }
+            },
+            self.get_mocked_response(),
+        ):
+            login = self.provider.verify_token(None, {"access_token": "dummy"})
+            assert login.user.email == "raymond.penners@example.com"
+            assert login.token.token == "dummy"
+
     def test_login_by_token(self):
         resp = self.client.get(reverse("account_login"))
         with mocked_response(
diff --git a/test_settings.py b/test_settings.py
index 87517141..b2a71a16 100644
--- a/test_settings.py
+++ b/test_settings.py
@@ -82,6 +82,7 @@ INSTALLED_APPS = (
     "allauth.socialaccount.providers.angellist",
     "allauth.socialaccount.providers.apple",
     "allauth.socialaccount.providers.asana",
+    "allauth.socialaccount.providers.atlassian",
     "allauth.socialaccount.providers.auth0",
     "allauth.socialaccount.providers.authentiq",
     "allauth.socialaccount.providers.baidu",