From 2af838bfd39d0bfb72cb315b37250babb2bd589f Mon Sep 17 00:00:00 2001 From: Mohamed El-Kalioby Date: Thu, 24 Jan 2019 19:44:24 +0300 Subject: [PATCH 01/14] Updated README file --- README.md | 7 +++++-- setup.py | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4495ca7..b022d35 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,16 @@ # django-mfa2 A Django app that handles MFA, it supports TOTP, U2F, FIDO2 U2F (Web Authn), Email Tokens , and Trusted Devices -Web Authencation API (Webauthn) is state-of-the art techology that is expected to replace passwords. +[![PyPI version](https://badge.fury.io/py/django-mfa2.svg)](https://badge.fury.io/py/django-mfa2) + +Web Authencation API (WebAuthn) is state-of-the art techology that is expected to replace passwords. ![Andriod Fingerprint](https://cdn-images-1.medium.com/max/800/1*1FWkRE8D7NTA2Kn1DrPjPA.png) - For FIDO2, both security keys and android-safetynet are supported. +In English :), It allows you to verify the user by security keys on PC, Laptops and Fingerprint/PIN on Andriod Phones. + Trusted device is a mode for the user to add a device that doesn't support security keys like iOS and andriod without fingerprints or NFC. **Note**: `U2F and FIDO2 can only be served under secure context (https)` diff --git a/setup.py b/setup.py index aac4ef1..94f3e6f 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ setup( author='Mohamed El-Kalioby', author_email = 'mkalioby@mkalioby.com', url = 'https://github.com/mkalioby/django-mfa2/', - + long_description=open('README.md').read(), download_url='https://github.com/mkalioby/django-mfa2/', license='MIT', packages=find_packages(), From 263a5e2b8c2a7d751b0399e01c00dc080ab63f98 Mon Sep 17 00:00:00 2001 From: Mohamed El-Kalioby Date: Fri, 25 Jan 2019 14:50:40 +0300 Subject: [PATCH 02/14] Fixing Setup file --- setup.py | 1 - 1 file changed, 1 deletion(-) diff --git a/setup.py b/setup.py index 94f3e6f..7b9b1ed 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,6 @@ setup( author='Mohamed El-Kalioby', author_email = 'mkalioby@mkalioby.com', url = 'https://github.com/mkalioby/django-mfa2/', - long_description=open('README.md').read(), download_url='https://github.com/mkalioby/django-mfa2/', license='MIT', packages=find_packages(), From 8fe3d4e496c18869c1b9ea65fb545483651c4a13 Mon Sep 17 00:00:00 2001 From: Mohamed El-Kalioby Date: Fri, 25 Jan 2019 14:56:06 +0300 Subject: [PATCH 03/14] Fixed Redirections, Removed the need for FIDO2_LOGIN_URL --- README.md | 2 ++ mfa/FIDO2.py | 4 ++-- setup.py | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b022d35..d24e282 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,8 @@ Depends on * Trusted_Devices * Email + **Note**: Starting version 1.1, ~~FIDO_LOGIN_URL~~ isn't required for FIDO2 anymore. + 1. Break your login function Usually your login function will check for username and password, log the user in if the username and password are correct and create the user session, to support mfa, this has to change diff --git a/mfa/FIDO2.py b/mfa/FIDO2.py index 22ba92f..82376ca 100644 --- a/mfa/FIDO2.py +++ b/mfa/FIDO2.py @@ -112,6 +112,6 @@ def authenticate_complete(request): mfa["next_check"] = int((datetime.datetime.now()+ datetime.timedelta( seconds=random.randint(settings.MFA_RECHECK_MIN, settings.MFA_RECHECK_MAX))).strftime("%s")) request.session["mfa"] = mfa - login(request) - return HttpResponse(simplejson.dumps({'status':"OK","redirect":settings.FIDO_LOGIN_URL}),content_type="application/json") + res=login(request) + return HttpResponse(simplejson.dumps({'status':"OK","redirect":res["location"]}),content_type="application/json") return HttpResponse(simplejson.dumps({'status': "err"}),content_type="application/json") diff --git a/setup.py b/setup.py index 7b9b1ed..82d26f5 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ from setuptools import find_packages, setup setup( name='django-mfa2', - version='1.0.4', + version='1.1', description='Allows user to add 2FA to their accounts', long_description=open("README.md").read(), long_description_content_type="text/markdown", From 852c2d7e0cda5b19849e304833d55d48b5a96f67 Mon Sep 17 00:00:00 2001 From: Mohamed El-Kalioby Date: Fri, 25 Jan 2019 22:11:50 +0300 Subject: [PATCH 04/14] Adding Docs --- docs/installation.md | 75 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 docs/installation.md diff --git a/docs/installation.md b/docs/installation.md new file mode 100644 index 0000000..36fcb4e --- /dev/null +++ b/docs/installation.md @@ -0,0 +1,75 @@ +# Installation +1. Install the package +```sh + pip install django-mfa2 + ``` +1. in your settings.py add the application to your installed apps + ```python + INSTALLED_APPS=( + '......', + 'mfa', + '......') + ``` +1. Add the following settings to your file + + ```python + MFA_UNALLOWED_METHODS=() # Methods that shouldn't be allowed for the user + MFA_LOGIN_CALLBACK="" # A function that should be called by username to login the user in session + MFA_RECHECK=True # Allow random rechecking of the user + MFA_RECHECK_MIN=10 # Minimum interval in seconds + MFA_RECHECK_MAX=30 # Maximum in seconds + MFA_QUICKLOGIN=True # Allow quick login for returning users by provide only their 2FA + + TOKEN_ISSUER_NAME="PROJECT_NAME" #TOTP Issuer name + + U2F_APPID="https://localhost" #URL For U2F + FIDO_SERVER_ID=u"localehost" # Server rp id for FIDO2, it the full domain of your project + FIDO_SERVER_NAME=u"PROJECT_NAME" + FIDO_LOGIN_URL=BASE_URL + ``` + **Method Names** + * U2F + * FIDO2 + * TOTP + * Trusted_Devices + * Email + + **Note**: Starting version 1.1, ~~FIDO_LOGIN_URL~~ isn't required for FIDO2 anymore. + +1. Break your login function + + Usually your login function will check for username and password, log the user in if the username and password are correct and create the user session, to support mfa, this has to change + + * authenticate the user + * if username and password are correct , check if the user has mfa or not + * if user has mfa then redirect to mfa page + * if user doesn't have mfa then call your function to create the user session + + ```python + def login(request): # this function handles the login form POST + user = auth.authenticate(username=username, password=password) + if user is not None: # if the user object exist + from mfa.helpers import has_mfa + res = has_mfa(username = username,request=request) # has_mfa returns false or HttpResponseRedirect + if res: + return res + return log_user_in(request,username=user.username) + #log_user_in is a function that handles creatung user session, it should be in the setting file as MFA_CALLBACK + ``` +1. Add mfa to urls.py + ```python + import mfa + import mfa.TrustedDevice + urls_patterns= [ + '...', + url(r'^mfa/', include('mfa.urls')), + url(r'devices/add$', mfa.TrustedDevice.add,name="mfa_add_new_trusted_device"), # This short link to add new trusted device + '....', + ] + ``` +1. Provide `mfa_auth_base.html` in your templaes with block called 'head' and 'content' + The template will be included during the user login. + If you will use Email Token method, then you have to provide template named `mfa_email_token_template.html` that will content the format of the email with parameter named `user` and `otp`. +1. To match the look and feel of your project, MFA includes `base.html` but it needs blocks named `head` & `content` to added its content to it. +1. Somewhere in your app, add a link to 'mfa_home' +```
  • Security
  • ``` From 153be3a5585dd4dcba962e4b0335193ebefce6dc Mon Sep 17 00:00:00 2001 From: Mohamed El-Kalioby Date: Fri, 25 Jan 2019 23:19:34 +0300 Subject: [PATCH 05/14] Adding more docs --- docs/change_login.md | 23 +++++++++++++++++++++++ docs/index.md | 36 ++++++++++++++++++++++++++++++++++++ docs/installation.md | 22 ++-------------------- 3 files changed, 61 insertions(+), 20 deletions(-) create mode 100644 docs/change_login.md create mode 100644 docs/index.md diff --git a/docs/change_login.md b/docs/change_login.md new file mode 100644 index 0000000..32e3617 --- /dev/null +++ b/docs/change_login.md @@ -0,0 +1,23 @@ +# Change of login function + +## Break your login function + +Usually your login function will check for username and password, log the user in if the username and password are correct and create the user session, to support mfa, this has to change + + * authenticate the user + * if username and password are correct , check if the user has mfa or not + * if user has mfa then redirect to mfa page + * if user doesn't have mfa then call your function to create the user session + + + def login(request): # this function handles the login form POST + user = auth.authenticate(username=username, password=password) + if user is not None: # if the user object exist + from mfa.helpers import has_mfa + res = has_mfa(username = username,request=request) # has_mfa returns false or HttpResponseRedirect + if res: + return res + return log_user_in(request,username=user.username) + #log_user_in is a function that handles creatung user session, it should be in the setting file as MFA_CALLBACK + + diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..8071dde --- /dev/null +++ b/docs/index.md @@ -0,0 +1,36 @@ +# django-mfa2 +A Django app that handles MFA, it supports TOTP, U2F, FIDO2 U2F (Web Authn), Email Tokens , and Trusted Devices + +[![PyPI version](https://badge.fury.io/py/django-mfa2.svg)](https://badge.fury.io/py/django-mfa2) + +Web Authencation API (WebAuthn) is state-of-the art techology that is expected to replace passwords. + +![Andriod Fingerprint](https://cdn-images-1.medium.com/max/800/1*1FWkRE8D7NTA2Kn1DrPjPA.png) + +For FIDO2, both security keys and android-safetynet are supported. + +In English :), It allows you to verify the user by security keys on PC, Laptops and Fingerprint/PIN on Andriod Phones. + +Trusted device is a mode for the user to add a device that doesn't support security keys like iOS and andriod without fingerprints or NFC. + +**Note**: `U2F and FIDO2 can only be served under secure context (https)` + +Package tested with Django 1.8, Django 2.1 on Python 2.7 and Python 3.5+ but it was not checked with any version in between but open for issues. + +Depends on + +* pyotp +* python-u2flib-server +* ua-parser +* user-agents +* python-jose +* fido2==0.5 + +# Example + +For Example, See https://github.com/mkalioby/AutoDeploy/commit/5f1d94b1804e0aa33c79e9e8530ce849d9eb78cc in AutDeploy Project + +# Table of Contents +* [Installation](installation.md) +* [Change Login Code](change_login.md) + diff --git a/docs/installation.md b/docs/installation.md index 36fcb4e..7f1cb81 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -36,26 +36,6 @@ **Note**: Starting version 1.1, ~~FIDO_LOGIN_URL~~ isn't required for FIDO2 anymore. -1. Break your login function - - Usually your login function will check for username and password, log the user in if the username and password are correct and create the user session, to support mfa, this has to change - - * authenticate the user - * if username and password are correct , check if the user has mfa or not - * if user has mfa then redirect to mfa page - * if user doesn't have mfa then call your function to create the user session - - ```python - def login(request): # this function handles the login form POST - user = auth.authenticate(username=username, password=password) - if user is not None: # if the user object exist - from mfa.helpers import has_mfa - res = has_mfa(username = username,request=request) # has_mfa returns false or HttpResponseRedirect - if res: - return res - return log_user_in(request,username=user.username) - #log_user_in is a function that handles creatung user session, it should be in the setting file as MFA_CALLBACK - ``` 1. Add mfa to urls.py ```python import mfa @@ -73,3 +53,5 @@ 1. To match the look and feel of your project, MFA includes `base.html` but it needs blocks named `head` & `content` to added its content to it. 1. Somewhere in your app, add a link to 'mfa_home' ```
  • Security
  • ``` + +Next, you need to [change your login code](change_login.md) From f89518e91d5546f56b4d2abaf74e5d92f13ae3e7 Mon Sep 17 00:00:00 2001 From: Mohamed El-Kalioby Date: Fri, 25 Jan 2019 23:26:59 +0300 Subject: [PATCH 06/14] Adding mkdocs.yaml --- docs/mkdocs.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 docs/mkdocs.yml diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml new file mode 100644 index 0000000..b1eead6 --- /dev/null +++ b/docs/mkdocs.yml @@ -0,0 +1,4 @@ +site_name: MkLorum +nav: + - Home: index.md +theme: readthedocs From eb2095e6507b7d54f15cede58ee4e95f065c9009 Mon Sep 17 00:00:00 2001 From: Mohamed El-Kalioby Date: Fri, 25 Jan 2019 23:38:54 +0300 Subject: [PATCH 07/14] change the mkdocs pat --- mkdocs.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 mkdocs.yml diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..b1eead6 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,4 @@ +site_name: MkLorum +nav: + - Home: index.md +theme: readthedocs From 8c413083d58969e09954b4c83774da2bfa43d5da Mon Sep 17 00:00:00 2001 From: Mohamed El-Kalioby Date: Fri, 25 Jan 2019 23:58:38 +0300 Subject: [PATCH 08/14] Trying block code --- docs/installation.md | 4 ++-- docs/mkdocs.yml | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) delete mode 100644 docs/mkdocs.yml diff --git a/docs/installation.md b/docs/installation.md index 7f1cb81..5c9c8f2 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -37,7 +37,7 @@ **Note**: Starting version 1.1, ~~FIDO_LOGIN_URL~~ isn't required for FIDO2 anymore. 1. Add mfa to urls.py - ```python + `python import mfa import mfa.TrustedDevice urls_patterns= [ @@ -46,7 +46,7 @@ url(r'devices/add$', mfa.TrustedDevice.add,name="mfa_add_new_trusted_device"), # This short link to add new trusted device '....', ] - ``` + ` 1. Provide `mfa_auth_base.html` in your templaes with block called 'head' and 'content' The template will be included during the user login. If you will use Email Token method, then you have to provide template named `mfa_email_token_template.html` that will content the format of the email with parameter named `user` and `otp`. diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml deleted file mode 100644 index b1eead6..0000000 --- a/docs/mkdocs.yml +++ /dev/null @@ -1,4 +0,0 @@ -site_name: MkLorum -nav: - - Home: index.md -theme: readthedocs From 6ccaec59bd2acb5586901ffa8656a7fb74fc8605 Mon Sep 17 00:00:00 2001 From: Mohamed El-Kalioby Date: Sat, 26 Jan 2019 00:06:00 +0300 Subject: [PATCH 09/14] Trying Code blick --- docs/installation.md | 48 ++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index 5c9c8f2..4011387 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -12,21 +12,21 @@ ``` 1. Add the following settings to your file - ```python - MFA_UNALLOWED_METHODS=() # Methods that shouldn't be allowed for the user - MFA_LOGIN_CALLBACK="" # A function that should be called by username to login the user in session - MFA_RECHECK=True # Allow random rechecking of the user - MFA_RECHECK_MIN=10 # Minimum interval in seconds - MFA_RECHECK_MAX=30 # Maximum in seconds - MFA_QUICKLOGIN=True # Allow quick login for returning users by provide only their 2FA - - TOKEN_ISSUER_NAME="PROJECT_NAME" #TOTP Issuer name - - U2F_APPID="https://localhost" #URL For U2F - FIDO_SERVER_ID=u"localehost" # Server rp id for FIDO2, it the full domain of your project - FIDO_SERVER_NAME=u"PROJECT_NAME" - FIDO_LOGIN_URL=BASE_URL - ``` + MFA_UNALLOWED_METHODS=() # Methods that shouldn't be allowed for the user + MFA_LOGIN_CALLBACK="" # A function that should be called by username to login the user in session + MFA_RECHECK=True # Allow random rechecking of the user + MFA_RECHECK_MIN=10 # Minimum interval in seconds + MFA_RECHECK_MAX=30 # Maximum in seconds + MFA_QUICKLOGIN=True # Allow quick login for returning users by provide only their 2FA + + TOKEN_ISSUER_NAME="PROJECT_NAME" #TOTP Issuer name + + U2F_APPID="https://localhost" #URL For U2 + FIDO_SERVER_ID=u"localehost" # Server rp id for FIDO2, it the full domain of your project + FIDO_SERVER_NAME=u"PROJECT_NAME" + FIDO_LOGIN_URL=BASE_URL + + **Method Names** * U2F * FIDO2 @@ -37,16 +37,16 @@ **Note**: Starting version 1.1, ~~FIDO_LOGIN_URL~~ isn't required for FIDO2 anymore. 1. Add mfa to urls.py - `python - import mfa - import mfa.TrustedDevice - urls_patterns= [ - '...', - url(r'^mfa/', include('mfa.urls')), - url(r'devices/add$', mfa.TrustedDevice.add,name="mfa_add_new_trusted_device"), # This short link to add new trusted device - '....', + + import mfa + import mfa.TrustedDevice + urls_patterns= [ + '...', + url(r'^mfa/', include('mfa.urls')), + url(r'devices/add$', mfa.TrustedDevice.add,name="mfa_add_new_trusted_device"), # This short link to add new trusted device + '....', ] - ` + 1. Provide `mfa_auth_base.html` in your templaes with block called 'head' and 'content' The template will be included during the user login. If you will use Email Token method, then you have to provide template named `mfa_email_token_template.html` that will content the format of the email with parameter named `user` and `otp`. From 0fa8520e66c985af95a5720fdfc82c41795344e3 Mon Sep 17 00:00:00 2001 From: Mohamed El-Kalioby Date: Sat, 26 Jan 2019 00:12:20 +0300 Subject: [PATCH 10/14] Trying Code Block --- docs/installation.md | 11 ++++++----- mkdocs.yml | 2 ++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index 4011387..0859b72 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -1,6 +1,6 @@ -# Installation +# Installation & Configuration 1. Install the package -```sh + ```sh pip install django-mfa2 ``` 1. in your settings.py add the application to your installed apps @@ -11,7 +11,7 @@ '......') ``` 1. Add the following settings to your file - + ```python MFA_UNALLOWED_METHODS=() # Methods that shouldn't be allowed for the user MFA_LOGIN_CALLBACK="" # A function that should be called by username to login the user in session MFA_RECHECK=True # Allow random rechecking of the user @@ -25,7 +25,7 @@ FIDO_SERVER_ID=u"localehost" # Server rp id for FIDO2, it the full domain of your project FIDO_SERVER_NAME=u"PROJECT_NAME" FIDO_LOGIN_URL=BASE_URL - + ``` **Method Names** * U2F @@ -38,6 +38,7 @@ 1. Add mfa to urls.py + ```python import mfa import mfa.TrustedDevice urls_patterns= [ @@ -46,7 +47,7 @@ url(r'devices/add$', mfa.TrustedDevice.add,name="mfa_add_new_trusted_device"), # This short link to add new trusted device '....', ] - + ``` 1. Provide `mfa_auth_base.html` in your templaes with block called 'head' and 'content' The template will be included during the user login. If you will use Email Token method, then you have to provide template named `mfa_email_token_template.html` that will content the format of the email with parameter named `user` and `otp`. diff --git a/mkdocs.yml b/mkdocs.yml index b1eead6..6746094 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -2,3 +2,5 @@ site_name: MkLorum nav: - Home: index.md theme: readthedocs +markdown_extensions: + - fenced_code From 171270adfb62eebbe0944b25fe3a214e92a2fad2 Mon Sep 17 00:00:00 2001 From: Mohamed El-Kalioby Date: Mon, 28 Jan 2019 09:46:37 +0300 Subject: [PATCH 11/14] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d24e282..3848f9f 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,9 @@ Web Authencation API (WebAuthn) is state-of-the art techology that is expected t ![Andriod Fingerprint](https://cdn-images-1.medium.com/max/800/1*1FWkRE8D7NTA2Kn1DrPjPA.png) -For FIDO2, both security keys and android-safetynet are supported. +For FIDO2, both security keys, Apple's Touch ID and android-safetynet are supported. -In English :), It allows you to verify the user by security keys on PC, Laptops and Fingerprint/PIN on Andriod Phones. +In English :), It allows you to verify the user by security keys on PC, Laptops, Touch ID on Macboks and Fingerprint/PIN on Andriod Phones. Trusted device is a mode for the user to add a device that doesn't support security keys like iOS and andriod without fingerprints or NFC. From 166afeab361b7064651af1b79c35c3fb95f1bace Mon Sep 17 00:00:00 2001 From: Mohamed El-Kalioby Date: Mon, 28 Jan 2019 09:47:15 +0300 Subject: [PATCH 12/14] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3848f9f..c32cfa2 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Web Authencation API (WebAuthn) is state-of-the art techology that is expected t ![Andriod Fingerprint](https://cdn-images-1.medium.com/max/800/1*1FWkRE8D7NTA2Kn1DrPjPA.png) -For FIDO2, both security keys, Apple's Touch ID and android-safetynet are supported. +For FIDO2, security keys, Apple's Touch ID and android-safetynet are supported. In English :), It allows you to verify the user by security keys on PC, Laptops, Touch ID on Macboks and Fingerprint/PIN on Andriod Phones. From 5ff14d29d481003715a98f219b70a17668adfbc6 Mon Sep 17 00:00:00 2001 From: Mohamed El-Kalioby Date: Mon, 28 Jan 2019 10:19:58 +0300 Subject: [PATCH 13/14] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c32cfa2..42c3980 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,9 @@ Web Authencation API (WebAuthn) is state-of-the art techology that is expected t ![Andriod Fingerprint](https://cdn-images-1.medium.com/max/800/1*1FWkRE8D7NTA2Kn1DrPjPA.png) -For FIDO2, security keys, Apple's Touch ID and android-safetynet are supported. +For FIDO2, security keys, Apple's Touch ID (Chrome) and android-safetynet are supported. -In English :), It allows you to verify the user by security keys on PC, Laptops, Touch ID on Macboks and Fingerprint/PIN on Andriod Phones. +In English :), It allows you to verify the user by security keys on PC, Laptops, Touch ID on Macboks (Chrome) and Fingerprint/PIN on Andriod Phones. Trusted device is a mode for the user to add a device that doesn't support security keys like iOS and andriod without fingerprints or NFC. From e73bdef40a9e163fd7f6194cfc87d91f6b652c36 Mon Sep 17 00:00:00 2001 From: Mohamed El-Kalioby Date: Mon, 11 Feb 2019 11:59:07 +0300 Subject: [PATCH 14/14] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 42c3980..86ad326 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Web Authencation API (WebAuthn) is state-of-the art techology that is expected t ![Andriod Fingerprint](https://cdn-images-1.medium.com/max/800/1*1FWkRE8D7NTA2Kn1DrPjPA.png) -For FIDO2, security keys, Apple's Touch ID (Chrome) and android-safetynet are supported. +For FIDO2, **security keys**, **Apple's Touch ID (Chrome)** and **android-safetynet** are supported. In English :), It allows you to verify the user by security keys on PC, Laptops, Touch ID on Macboks (Chrome) and Fingerprint/PIN on Andriod Phones.