FastAPI-Login tries to provide similar functionality as Flask-Login does.

Overview

FastAPI-Login

FastAPI-Login tries to provide similar functionality as Flask-Login does.

Installation

$ pip install fastapi-login

Usage

To begin we have to setup our FastAPI app:

from fastapi import FastAPI

SECRET = "your-secret-key"

app = FastAPI()

To obtain a suitable secret key you can run import os; print(os.urandom(24).hex()).

Now we can import and setup the LoginManager, which will handle the process of encoding and decoding our Json Web Tokens.

from fastapi_login import LoginManager
manager = LoginManager(SECRET, tokenUrl='/auth/token')

For the example we will use a dictionary to represent our user database. In your application this could also be a real database like sqlite or Postgres. It does not matter as you have to provide the function which retrieves the user.

fake_db = {'[email protected]': {'password': 'hunter2'}}

Now we have to provide the LoginManager with a way to load our user. The user_loader callback should either return your user object or None

@manager.user_loader
def load_user(email: str):  # could also be an asynchronous function
    user = fake_db.get(email)
    return user

Now we have to define a way to let the user login in our app. Therefore we will create a new route:

from fastapi import Depends
from fastapi.security import OAuth2PasswordRequestForm
from fastapi_login.exceptions import InvalidCredentialsException

@app.post('/auth/token')
def login(data: OAuth2PasswordRequestForm = Depends()):
    email = data.username
    password = data.password

    user = load_user(email)  # we are using the same function to retrieve the user
    if not user:
        raise InvalidCredentialsException  # you can also use your own HTTPException
    elif password != user['password']:
        raise InvalidCredentialsException
    
    access_token = manager.create_access_token(
        data=dict(sub=email)
    )
    return {'access_token': access_token, 'token_type': 'bearer'}

Now whenever you want your user to be logged in to use a route, you can simply use your LoginManager instance as a dependency.

@app.get('/protected')
def protected_route(user=Depends(manager)):
    ...

If you also want to handle a not authenticated error, you can add your own subclass of Exception to the LoginManager.

from starlette.responses import RedirectResponse

class NotAuthenticatedException(Exception):
    pass

# these two argument are mandatory
def exc_handler(request, exc):
    return RedirectResponse(url='/login')

manager.not_authenticated_exception = NotAuthenticatedException
# You also have to add an exception handler to your app instance
app.add_exception_handler(NotAuthenticatedException, exc_handler)

To change the expiration date of the token use the expires_delta argument of the create_access_token method with a timedelta. The default is set 15 min. Please be aware that setting a long expiry date is not considered a good practice as it would allow an attacker with the token to use your application as long as he wants.

from datetime import timedelta

data=dict(sub=user.email)

# expires after 15 min
token = manager.create_access_token(
    data=data
)
#expires after 12 hours
long_token = manager.create_access_token(
    data=data, expires_delta=timedelta(hours=12)
)

Usage with cookies

Instead of checking the header for the token. fastapi-login also support access using cookies.

from fastapi_login import LoginManager
manager = LoginManager(SECRET, tokenUrl='/auth/token', use_cookie=True)

Now the manager will check the requests cookies the headers for the access token. The name of the cookie can be set using manager.cookie_name. If you only want to check the requests cookies you can turn the headers off using the use_header argument

For convenience the LoginManager also includes the set_cookie method which sets the cookie to your response, with the recommended HTTPOnly flag and the manager.cookie_name as the key.

from fastapi import Depends
from starlette.responses import Response


@app.get('/auth')
def auth(response: Response, user=Depends(manager)):
    token = manager.create_access_token(
        data=dict(sub=user.email)
    )
    manager.set_cookie(response, token)
    return response
    
Comments
  • Using with sqlachemy.orm.session

    Using with sqlachemy.orm.session

    Hey thank you for the package, I'm still trying it out the login works fine, this is maybe related heavily to the package but I have some errors raising due to the use of sqlalchemy session, any help is welcome.

    I'm trying to pass extra parameters to def load_user(email: str) like this

    @auth_manager.user_loader def load_user(email: str, db: Session): user = actions.user.get_by_email(db=db, email=email) return user

    i'm passing an sqlalchemy db session to the load_user function which like as said before, works fine on /auth/token, the token is generated. the error raise when trying to access routes protected by the manager:

    fastapi_login/fastapi_login.py", line 140 load_user() missing 1 required positional argument: 'db'

    is there a way to make the second parameter optional ?

    opened by sid3r 11
  • TypeError: the first argument must be callable

    TypeError: the first argument must be callable

    My program was developed based on fastapi_login==1.6.2

    Today, I upgrade fastapi_login to the latest version: 1.7.0. When I login, it raises error.

    some of the error code:

    2021-09-23 14:58:04 | TypeError: the first argument must be callable
    -- | --
      |   | 2021-09-23 14:58:04 | self._user_callback = ordered_partial(callback, *args, **kwargs)
      |   | 2021-09-23 14:58:04 | File "/usr/local/lib/python3.8/site-packages/fastapi_login/fastapi_login.py", line 147, in decorator
      |   | 2021-09-23 14:58:04 | user = load_user(name)
    

    The function user_loader in fastapi_login.py of version 1.6.2 is:

        def user_loader(self, callback: Union[Callable, Awaitable]) -> Union[Callable, Awaitable]:
            self._user_callback = callback
            return callback
    

    However, In the latest version, it becomes to:

    def user_loader(self, *args, **kwargs) -> Union[Callable, Awaitable]:
            def decorator(callback: Union[Callable, Awaitable]):
                """
                The actual setter of the load_user callback
                Args:
                    callback (Callable or Awaitable): The callback which returns the user
                Returns:
                    Partial of the callback with given args and keyword arguments already set
                """
                self._user_callback = ordered_partial(callback, *args, **kwargs)
            return decorator
    

    You add the function ordered_partial here cause my problem. But When I refer to the release note, I did not find any notice for this change, only find a pull request note in #56 . It seems that your code is not backwards compatible. @MushroomMaula

    opened by qiankunxienb 10
  • 401 ERROR - Cookie has wrong format

    401 ERROR - Cookie has wrong format

    Hi!

    I think I have found a bug in the login with cookies. I always got 401 error, so I started to dig down in the script. Finally I have found the problem and the "hotfix" solution. Well: The byte array somewhere will be converted into string so in the cookie the b' * ' identifiers are remamining in the cookie and the jwt parser can not parse the data. For example: Token (cookie):

    b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJtbWFyayIsImV4cCI6MTYzMzUzMzU2OH0.NQzZOhaA0hyQBd8gLuLbs7zRaJfbgYLADwLJtPDEUWw'
    

    If I cuted down the first two byte and the last byte the decode works like a charm. Cutted token:

    eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJtbWFyayIsImV4cCI6MTYzMzUzMzU2OH0.NQzZOhaA0hyQBd8gLuLbs7zRaJfbgYLADwLJtPDEUWw
    

    Have you experienced this error?

    opened by mihalikmark 8
  • Error on 1.7.2 for fastapi_login import LoginManager

    Error on 1.7.2 for fastapi_login import LoginManager

    Hey there,

    I am getting an error on 1.7.2 when importing from fastapi_login import LoginManager, the result I get is:

      File "/usr/local/lib/python3.7/dist-packages/fastapi_login/utils.py", line 11
        def __call__(self, /, *args, **keywords):
                           ^
    SyntaxError: invalid syntax
    

    Not sure if the /, is just a placeholder and has not been updated?

    Also, how do I pass on args for the user_loader? In the docs it says:

    >>> @manager.user_loader(...)  # Arguments and keyword arguments declared here are passed on
    >>> def get_user(user_identifier, ...):
    ...     # get user logic here
    

    Can you give an example? I am not sure if the below would be correct?

    @manager.user_loader(session: Session = Depends(get_session))
    def get_user_by_email(email: str, db: session):
        user = db.query(Hero).filter(Hero.email == email).first()
        return user
    

    Regards

    opened by muke888 8
  • Enforcing authorization

    Enforcing authorization

    Hello, how would I go about enforcing authorization? For example specific roles and permissions. I currently do this by not showing menus but that still leaves the endpoints open if the user knows the URL to enter to access a given page. I would like to enforce this when the request is be sent just like Authentication but this time for specific Authorization. I am not sure where is the best to handle this? I was thinking in the user_loader function and raise an exception if the user is not authorized even though authenticated for a given route/request.

    Thanks in advanced!

    opened by mattduffield 7
  • Feature: Accept Asymmetric Algorithm

    Feature: Accept Asymmetric Algorithm

    I implemented SymmetricSecret and AsymmetricSecret, and drop replace it.

    New tests all passed, and fully covered.

    I am poor in English, so docs remain old.

    opened by filwaline 6
  • Cookie support

    Cookie support

    I was wondering if you had any plans to add refresh token support?

    I would like to have a short time which the access token is valid and have the ability to refresh the access token once it expires.

    I was also wondering if you've thought about adding cookie support so that cookies would be set by FastAPI in a similar way to how flask-jwt-extended does things: https://flask-jwt-extended.readthedocs.io/en/stable/tokens_in_cookies/

    opened by SelfhostedPro 5
  • Encoding & Decoding Tokens with RS256 (RSA)

    Encoding & Decoding Tokens with RS256 (RSA)

    LoginManager only accept single secret parameter in str type, how can it use private key to sign and public key to verify?

    It seems only possible solution is using two different instances?

    sign_manager = LoginManager(secret=private_key, ...)
    verify_manager = LoginManager(secret=public_key, ...)
    
    token = sign_manager.create_access_token(...)
    payload = verify_manager._get_payload(token)
    

    Or i am misunderstanding?

    enhancement 
    opened by filwaline 4
  • Can't use user=Depends(manager)

    Can't use user=Depends(manager)

    As stated, I can login fine, but when I try to protect a route:

    TypeError: get_by_email() missing 1 required positional argument: 'email'
    

    My function to retrieve the user:

    @classmethod
    @manager.user_loader()
    async def get_by_email(cls, email) -> 'UserModel':
        return await engine.find_one(cls, cls.email == email)
    

    Login:

    @router.post('/login')
    async def login(data: OAuth2PasswordRequestForm = Depends()):
        from app.models.user import UserModel
    
        email = data.username
        password = data.password
    
        user = await UserModel.get_by_email(email)
        if not user:
            raise InvalidCredentialsException
        elif verify_password(password, user.password):
            raise InvalidCredentialsException
    
        access_token = manager.create_access_token(
            data={'sub': email}, expires=timedelta(days=365)
        )
        return {'token': access_token}
    

    Protected Route:

    @router.post('/user/watcher')
    async def create_watcher(watcher: Watcher, user=Depends(manager)):
        await user.add_watcher(**watcher.dict())
    

    What am I missing here?

    opened by AndreMPCosta 4
  • I'm trying to create a login page using jinja2.

    I'm trying to create a login page using jinja2.

    I'm trying to create a login page using jinja2.

    File "./main.py", line 37, in login
      manager.set_cookie(resp,access_token)
    

    AttributeError: 'LoginManager' object has no attribute 'set_cookie'

    What should I do?

    from fastapi import FastAPI,Depends
    from fastapi.responses import RedirectResponse,HTMLResponse
    from fastapi.security import OAuth2PasswordRequestForm
    from fastapi_login.exceptions import InvalidCredentialsException
    from fastapi.templating import Jinja2Templates
    from fastapi_login import LoginManager
    import os
    
    SECRET = "your-secret-key"
    fake_db = {'[email protected]': {'password': 'hunter2'}}
    manager = LoginManager(SECRET, tokenUrl='/auth/token')
    
    app = FastAPI()
    
    pth = os.path.dirname(__file__)
    templates = Jinja2Templates(directory=os.path.join(pth, "templates"))
    
    @manager.user_loader
    def load_user(email: str):  # could also be an asynchronous function
        user = fake_db.get(email)
        return user
    
    @app.post('/auth/token')
    def login(data: OAuth2PasswordRequestForm = Depends()):
        email = data.username
        password = data.password
    
      user = load_user(email)  # we are using the same function to retrieve the user
      if not user:
          raise InvalidCredentialsException  # you can also use your own HTTPException
      elif password != user['password']:
          raise InvalidCredentialsException
      
      access_token = manager.create_access_token(
          data=dict(sub=email)
      )
      
      resp = RedirectResponse(url="/protected")
      manager.set_cookie(resp,access_token)
      return resp
      # return {'access_token': access_token, 'token_type': 'bearer'}
    
    @app.get('/protected')
    def protected_route(user=Depends(manager)):
        with open(os.path.join(pth, "templates/protectedpage.html")) as f:
            return HTMLResponse(content=f.read())
    
    
    @app.get("/",response_class=HTMLResponse)
    def loginwithCreds():
        with open(os.path.join(pth, "templates/login.html")) as f:
            return HTMLResponse(content=f.read())
    
    opened by mturu1976 4
  • The library doesn't work at all

    The library doesn't work at all

    I tried multiple times using this library, but it doesn't seem to work. When I generate the access token, I also do response.set_cookie to save it for the current session. The library correctly retrieves the cookie at the next request, but (I tested it) fastapi.security.utils.get_authorization_scheme_param returns '' as the second parameter of its tuple, which I guess means the provided jwt is invalid, but the access token comes directly from create_access_token! Also, the __call__ method checks if token is not None, but it should actually be if not token, because otherwise weird stuff happens (the custom not authenticated exception is ignored). That's because token equals an empty string, not None

    opened by nocturn9x 4
  • Get current user without throwing an error

    Get current user without throwing an error

    Hi, great package. Is there a way to get the current user without throwing the NotAuthenticatedException. Just get the user or None in my case

    Writing a custom auth_exception_handler doesn't cut it for me because it expects a callable to be returned so I can't return None. This might look trivial but in the case where I'm building a web app and my responses class are templates not jsonresponses so returning a jsonresponse also doesn't help because internally fastapi_login just returns that to the browser instead of passing that as a return value from calling get_current_user. What I'm saying in essence is when I call

       ` user = await manager.get_current_user(token=request.cookies.get('token'))`
    

    I should get a value for user from the above, whether that be a user object, None, Jsonresponse. Not currently where I only get a user or nothing else(an exception that I can't control or customize)

    opened by mtkgeek 1
  • Bump certifi from 2022.9.24 to 2022.12.7

    Bump certifi from 2022.9.24 to 2022.12.7

    Bumps certifi from 2022.9.24 to 2022.12.7.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Make def user callback run in worker thread

    Make def user callback run in worker thread

    Hi, if user loader is using sync db connection and the def function, it will run in the main thread and block the main thread from receiving any request. So it the def function should be run in worker thread instead.

    opened by rafelpermata 2
  • Middleware seems less reliable than Depends

    Middleware seems less reliable than Depends

    Hi,

    Thanks for the fastapi_login package.

    I have noticed what I think is some odd behavior. I set up the middleware as suggested to populate the request.state.user object. But I noticed that I was not getting the user information even though there was a valid cookie with the token...

    So I switched to using user=Depends(auth_manager) on my endpoints that require a login and I have not seen a problem since...

    Is this a known problem? Is there anything that I could have messed up in my code that would cause this kind of behavior? Is there some logging debugging I can turn on to provide additional data?

    opened by bnmnetp 6
  • Added new docs going in-depth about JWT and how to incorporate bcrypt with fastapi-login.

    Added new docs going in-depth about JWT and how to incorporate bcrypt with fastapi-login.

    I also go in depth about some things I've found out about JWT's and your fastapi-login module whilst using it, these are some things I wish I knew whilst developping, so I'm putting it here for future reference. 👍

    opened by jasonmzx 0
Releases(v1.8.3)
  • v1.8.3(Oct 18, 2022)

    1.8.3

    • Pin pyjwt dependency (Fixes #94)
    • Switched from setup.py based publishing to using pyproject.toml together with poetry
    • Switched publishing to poetry
    • Update requirements in the examples projects
    • Added correct header in /examples/simples/templates/index.html (Fixes #93 and #95)
    Source code(tar.gz)
    Source code(zip)
  • v1.8.2(May 27, 2022)

  • v1.8.1(May 13, 2022)

  • v1.8.0(Mar 16, 2022)

    1.8.0

    • Adds support for asymmetric key algorithms thanks to filwaline. Documentation for this feature can be found here.

    • Fixes syntax of __all__ inside fastapi_login/__init__.py. (Thanks to kigawas)

    • Fixes multiple issues in the documentation. (Thanks to alwye)

    • Bumps version of mkdocs to fix a security issue. As this is a dev dependency it shouldn't have affected any user.

    Source code(tar.gz)
    Source code(zip)
  • v1.7.3(Oct 23, 2021)

    Fixes not being able to import LoginManager in Python versions < 3.8. (#61)

    Fixes bug not authenticating user when more than the required scopes are present (#63)

    Adds a new example project (work still in progress).

    Source code(tar.gz)
    Source code(zip)
  • v1.7.2(Sep 23, 2021)

    Fixes not being able to call your decorated function on its own anymore. This was caused because the decorator did not return the function.

    Source code(tar.gz)
    Source code(zip)
  • v1.7.1(Sep 23, 2021)

    1.7.1

    Fixes backwards compatibility (#58) of the LoginManager.user_loader decorator. In version 1.7.0 it was not possible to do the following anymore:

    @manager.user_loader
    def load_user(email):
        ...
    

    This has been fixed now.

    It is however recommended to just add empty parentheses after the decorator if you don't wish to pass extra arguments to your callback.

    @manager.user_loader()
    def load_user(email):
        ...
    

    Because of the backwards compatibility it is not possible to pass a callable object as the first argument to the decorator. If this is needed it has to be passed as a keyword argument. This is detailed more in depth in the documentation.

    Source code(tar.gz)
    Source code(zip)
  • v1.7.0(Sep 16, 2021)

    Configuration is now more pythonic using arguments on initialization instead of class attributes

    • The recommended way of setting custom exceptions is now using the custom_exception argument on initialization. Thanks to kigawas for the idea.
    • The default token expiry can now be changed on initialization using the default_expiry argument
    • The cookie name can now be changed on initialization using the cookie_name argument.

    Added py.typed file for better mypy support.

    The user_loader decorator now takes (keyword) arguments, which will then be used, when the declared callback is called. Have a look at the documentation.

    Source code(tar.gz)
    Source code(zip)
  • v1.6.3(Jul 21, 2021)

  • v1.6.2(Jun 20, 2021)

  • v1.6.1(Jun 10, 2021)

  • 1.6.0(Apr 20, 2021)

    • Renamed the tokenUrl argument to token_url
    • User set `LoginManager.not_authenticated_exception`` will now also be raised when a token expires, or the token has an invalid format. (Fixes #28)
    • Examples have been added showing how to use fastapi-login
    • Rewrote most of the tests
    • Update packages to fix security vulnerability
    • Update README to reflect package changes
    Source code(tar.gz)
    Source code(zip)
  • v1.5.3(Feb 18, 2021)

  • v1.5.2(Dec 23, 2020)

    • Update packages to its latest stable version
    • Fix error trying to decode the token, which is a string in newer versions of pyjwt #21
    • Fixed a typo in the changelog
    Source code(tar.gz)
    Source code(zip)
  • v1.5.1(Sep 12, 2020)

    • Improve cookie support, now allows headers and cookies to be used at the same time.
    • Stops assuming every cookie is prefixed with Bearer
    • Improved testing coverage and docs
    • Added set_cookie method
    Source code(tar.gz)
    Source code(zip)
A JOSE implementation in Python

python-jose A JOSE implementation in Python Docs are available on ReadTheDocs. The JavaScript Object Signing and Encryption (JOSE) technologies - JSON

Michael Davis 1.2k Dec 28, 2022
Toolkit for Pyramid, a Pylons Project, to add Authentication and Authorization using Velruse (OAuth) and/or a local database, CSRF, ReCaptcha, Sessions, Flash messages and I18N

Apex Authentication, Form Library, I18N/L10N, Flash Message Template (not associated with Pyramid, a Pylons project) Uses alchemy Authentication Authe

95 Nov 28, 2022
Creation & manipulation of PyPI tokens

PyPIToken: Manipulate PyPI API tokens PyPIToken is an open-source Python 3.6+ library for generating and manipulating PyPI tokens. PyPI tokens are ver

Joachim Jablon 8 Nov 01, 2022
An extension of django rest framework, providing a configurable password reset strategy

Django Rest Password Reset This python package provides a simple password reset strategy for django rest framework, where users can request password r

Anexia 363 Dec 24, 2022
FastAPI-Login tries to provide similar functionality as Flask-Login does.

FastAPI-Login FastAPI-Login tries to provide similar functionality as Flask-Login does. Installation $ pip install fastapi-login Usage To begin we hav

417 Jan 07, 2023
A Python package, that allows you to acquire your RecNet authorization bearer token with your account credentials!

RecNet-Login This is a Python package, that allows you to acquire your RecNet bearer token with your account credentials! Installation Done via git: p

Jesse 6 Aug 18, 2022
A host-guest based app in which host can CREATE the room. and guest can join room with room code and vote for song to skip. User is authenticated using Spotify API

A host-guest based app in which host can CREATE the room. and guest can join room with room code and vote for song to skip. User is authenticated using Spotify API

Aman Raj 5 May 10, 2022
Minimal authorization through OO design and pure Ruby classes

Pundit Pundit provides a set of helpers which guide you in leveraging regular Ruby classes and object oriented design patterns to build a simple, robu

Varvet 7.8k Jan 02, 2023
🔐 Login & Register System

🔐 Login & Register System This is a developable login and register system. Enter your username and password to register or login to account. Automati

Firdevs Akbayır 10 Dec 12, 2022
A simple model based API maker written in Python and based on Django and Django REST Framework

Fast DRF Fast DRF is a small library for making API faster with Django and Django REST Framework. It's easy and configurable. Full Documentation here

Mohammad Ashraful Islam 18 Oct 05, 2022
Authentication testing framework

What is this This is a framework designed to test authentication for web applications. While web proxies like ZAProxy and Burpsuite allow authenticate

DigeeX 140 Jul 06, 2022
This app makes it extremely easy to build Django powered SPA's (Single Page App) or Mobile apps exposing all registration and authentication related functionality as CBV's (Class Base View) and REST (JSON)

Welcome to django-rest-auth Repository is unmaintained at the moment (on pause). More info can be found on this issue page: https://github.com/Tivix/d

Tivix 2.4k Jan 03, 2023
Django-react-firebase-auth - A web app showcasing OAuth2.0 + OpenID Connect using Firebase, Django-Rest-Framework and React

Demo app to show Django Rest Framework working with Firebase for authentication

Teshank Raut 6 Oct 13, 2022
A JSON Web Token authentication plugin for the Django REST Framework.

Simple JWT Abstract Simple JWT is a JSON Web Token authentication plugin for the Django REST Framework. For full documentation, visit django-rest-fram

Simple JWT 3.3k Jan 01, 2023
Foundation Auth Proxy is an abstraction on Foundations' authentication layer and is used to authenticate requests to Atlas's REST API.

foundations-auth-proxy Setup By default the server runs on http://0.0.0.0:5558. This can be changed via the arguments. Arguments: '-H' or '--host': ho

Dessa - Open Source 2 Jul 03, 2020
Skit-auth - Authorization for skit.ai's platform

skit-auth This is a simple authentication library for Skit's platform. Provides

Skit 3 Jan 08, 2022
Authware API wrapper for Python 3.5+

AuthwarePy Asynchronous wrapper for Authware in Python 3.5+ View our documentation 📲 Installation Run this to install the library via pip: pip instal

Authware 3 Feb 09, 2022
A secure authentication module to validate user credentials in a Streamlit application.

Streamlit-Authenticator A secure authentication module to validate user credentials in a Streamlit application. Installation Streamlit-Authenticator i

M Khorasani 336 Dec 31, 2022
Ready-to-use and customizable users management for FastAPI

FastAPI Users Ready-to-use and customizable users management for FastAPI Documentation: https://frankie567.github.io/fastapi-users/ Source Code: https

François Voron 2.4k Jan 04, 2023
Django CAS 1.0/2.0/3.0 client authentication library, support Django 2.0, 2.1, 2.2, 3.0 and Python 3.5+

django-cas-ng django-cas-ng is Django CAS (Central Authentication Service) 1.0/2.0/3.0 client library to support SSO (Single Sign On) and Single Logou

django-cas-ng 347 Dec 18, 2022