My intuition is that Webauthn will be hard to support because of the varieties of ways to secure the private key (Yubikey, HIDGlobal, etc.) and the complexities of managing key pairs without devices. PGP/GnuPG followed a trajectory where we had ways to secure email, but it was too complicated to achieve wide adoption.
Would it be better to support email only login in core, e.g. to support passwordless 1FA? This is something that shouldn't require much in terms of protocol support since Django's email support is so good no one needs to rewrite or support through libraries. This is only 1FA, but it is passwordless. It could be coupled with the use of something like Google Authenticator or MS Authenticator - not sure how hard this latter part is to put in core. MFA is typically built with some form of federated login, and most applications will fall into two camps (1) those needing federated business login for business purposes, or (2) those needing federated social login for better conversions. In the middle ground, buy vs. build probably applies since there are so many SaaS services here. Because of this, implementing login well with MFA is usually a matter of supporting a federated login protocol such as SAML, OpenID Connect/OAuth2, or CAS. And it is that server protocol that implements the MFA. Many users may not even choose their protocol. Once you have these protocols, MFA can be done via a Google or Github account. Since OIDC federated login can be purchased as SaaS within AWS, Azure, Okta, etc., that's the best protocol to support within a "generic" application at this time. There are already mature libraries that cover SAML, CAS, and OIDC very well and work with a wide range of Django versions. There is often some customization necessary for MFA with a particular federated login. Over many years I've had to write middleware (not Middleware) to support federated login based on a keypair where the private key never leaves my PIV card, and the public key (in terms of certificates) is authenticated by a CA so that it need not be registered with a server/registry. I did a lightning talk <https://danizen.net/anti-social-auth/> at DjangoCon 2016 on this topic. At that time, we used django-cas-ng <https://djangocas.dev/> for a CAS implementation in front of NIH Login. In the cloud we use python-social-auth <https://python-social-auth.readthedocs.io/en/latest/> in front of AWS Cognito in front of NIH Login. I've also worked with SAML to enable PIV command-line login to AWS, see https://nlm-occs.github.io/nlmfedcred/. All of these have required some middleware (a Backend and either a middleware or a set of decorators). P.S. - I don't speak for NLM or NCBI. NIH Login is no longer as "antisocial" as it was, it now does have buttons for "Google" and "Facebook", but NCBI still wraps it to make it easier to click to login - see https://account.ncbi.nlm.nih.gov/?back_url=https%3A//pubmed.ncbi.nlm.nih.gov/ . P.P.S - Most of the versions of OpenSSL out there do not support OpenSC (smart card), and due to the Heartbleed issue, most security professionals (if they pay close attention to Django libraries) will want libraries to link with LibreSSL instead. This may not be as large a deal on the server side, but it is a big problem with testing this using Python code - until CPython is built against a version of OpenSSL/LibreSSL that includes PKCS11, linking up with smart cards and keys will be somewhat difficult. On Thu, Apr 7, 2022 at 9:18 PM Yonas <ytilahu...@alumni.alueducation.com> wrote: > Hi Tobias, > > Thanks for the feedback. > > There are multiple ways to implement MFA, as you mentioned. But the goal > here is to provide a simple mechanism. It's "not necessary" to cover every > use case, and I believe that's where third-party packages come in. > > Based on a study conducted by Microsoft, a user account is "99.9% less > likely to be compromised if" the user uses MFA. So, it would be beneficial > to have this feature in Django. > On Thursday, April 7, 2022 at 9:55:32 PM UTC+3 Tobias Bengfort wrote: > >> Hi Yonas, >> >> the best place to start is probably to look at thrid party packages, >> e.g.: >> >> https://github.com/django-otp/django-otp >> https://github.com/jazzband/django-two-factor-auth >> https://github.com/mkalioby/django-mfa2 >> https://gitlab.com/stavros/django-webauthin >> https://github.com/xi/django-mfa3 (mine) >> >> I am not convinced that moving this into django is the best approach >> though. There is just so many ways you can do MFA/passwordless. Recovery >> in particular is complex with a lot of different solutions, depending on >> context. >> >> I also noticed that you omitted FIDO2/webauthn from your list of >> protocols. It is the newest of these protocols and requires a very >> different architecture, but I guess that IETF and W3C had reasons to >> choose it. >> >> I do agree that a simple, opinionated solution in django itself could >> push 2FA adaption and therefore general security on the web, which is >> clearly a good thing. But I still think this works better in a third >> party app such as django-mfa3. >> >> best, >> tobias >> >> >> On 07/04/2022 14.42, Yonas wrote: >> > Hello, >> > >> > The idea to implement MFA (2FA) has been brought up a couple of times >> > over the past years. And the community seems interested. >> > >> > I am willing to implement this feature (HOTP, TOTP, and email). >> However, >> > a QR code generator is required. >> > >> > If someone can help with this, it would be awesome. Otherwise, what do >> > you think about bringing a third-party QR code generator into core? >> > >> > If both options are not feasible, displaying the secret key to the user >> > is another alternative (not ideal). But the developer has the freedom >> to >> > install a third-party package and show the QR code. >> > >> > Best, >> > Yonas >> > >> > -- >> > You received this message because you are subscribed to the Google >> > Groups "Django developers (Contributions to Django itself)" group. >> > To unsubscribe from this group and stop receiving emails from it, send >> > an email to django-develop...@googlegroups.com >> > <mailto:django-develop...@googlegroups.com>. >> > To view this discussion on the web visit >> > >> https://groups.google.com/d/msgid/django-developers/1d65ecc4-01a3-461e-bf72-e576a5860345n%40googlegroups.com >> > < >> https://groups.google.com/d/msgid/django-developers/1d65ecc4-01a3-461e-bf72-e576a5860345n%40googlegroups.com?utm_medium=email&utm_source=footer>. >> >> > -- > You received this message because you are subscribed to the Google Groups > "Django developers (Contributions to Django itself)" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to django-developers+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/django-developers/87921818-06cf-4e1e-976f-69d444edbd15n%40googlegroups.com > <https://groups.google.com/d/msgid/django-developers/87921818-06cf-4e1e-976f-69d444edbd15n%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-developers+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/CAFzonYYiTSwRaS7p%2BKGcjnApQQ3EUotLkRER1S9VECHOpknwbA%40mail.gmail.com.