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)
This script will pull and analyze syscalls in given application(s) allowing for easier security research purposes

SyscallExtractorAnalyzer This script will pull and analyze syscalls in given application(s) allowing for easier security research purposes Goals Teach

Truvis Thornton 18 Jul 09, 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
Implementation of Supervised Contrastive Learning with AMP, EMA, SWA, and many other tricks

SupCon-Framework The repo is an implementation of Supervised Contrastive Learning. It's based on another implementation, but with several differencies

Ivan Panshin 132 Dec 14, 2022
PetitPotam - Coerce NTLM authentication from Windows hosts

Python implementation for PetitPotam

ollypwn 137 Dec 28, 2022
Simple extension that provides Basic, Digest and Token HTTP authentication for Flask routes

Flask-HTTPAuth Simple extension that provides Basic and Digest HTTP authentication for Flask routes. Installation The easiest way to install this is t

Miguel Grinberg 1.1k Jan 05, 2023
Easy and secure implementation of Azure AD for your FastAPI APIs 🔒 Single- and multi-tenant support.

Easy and secure implementation of Azure AD for your FastAPI APIs 🔒 Single- and multi-tenant support.

Intility 220 Jan 05, 2023
Generate payloads that force authentication against an attacker machine

Hashgrab Generates scf, url & lnk payloads to put onto a smb share. These force authentication to an attacker machine in order to grab hashes (for exa

xct 35 Dec 20, 2022
Web 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

OWASP 88 Jan 01, 2023
:couple: Multi-user accounts for Django projects

django-organizations Summary Groups and multi-user account management Author Ben Lopatin (http://benlopatin.com) Status Separate individual user ident

Ben Lopatin 1.1k Jan 09, 2023
Auth for use with FastAPI

FastAPI Auth Pluggable auth for use with FastAPI Supports OAuth2 Password Flow Uses JWT access and refresh tokens 100% mypy and test coverage Supports

David Montague 95 Jan 02, 2023
API with high performance to create a simple blog and Auth using OAuth2 ⛏

DogeAPI API with high performance built with FastAPI & SQLAlchemy, help to improve connection with your Backend Side to create a simple blog and Cruds

Yasser Tahiri 111 Jan 05, 2023
Automatic login utility of free Wi-Fi captive portals

wicafe Automatic login utility of free Wi-Fi captive portals Disclaimer: read and grant the Terms of Service of Wi-Fi services before using it! This u

Takumi Sueda 8 May 31, 2022
Python library for generating a Mastercard API compliant OAuth signature.

oauth1-signer-python Table of Contents Overview Compatibility References Usage Prerequisites Adding the Library to Your Project Importing the Code Loa

23 Aug 01, 2022
Plotly Dash plugin to allow authentication through 3rd party OAuth providers.

dash-auth-external Integrate your dashboards with 3rd parties and external OAuth providers. Overview Do you want to build a Plotly Dash app which pull

James Holcombe 15 Dec 11, 2022
Library - Recent and favorite documents

Thingy Thingy is used to quickly access recent and favorite documents. It's an XApp so it can work in any distribution and many desktop environments (

Linux Mint 23 Sep 11, 2022
Simple implementation of authentication in projects using FastAPI

Fast Auth Facilita implementação de um sistema de autenticação básico e uso de uma sessão de banco de dados em projetos com tFastAPi. Instalação e con

3 Jan 08, 2022
JSON Web Token Authentication support for Django REST Framework

REST framework JWT Auth JSON Web Token Authentication support for Django REST Framework Overview This package provides JSON Web Token Authentication s

Styria Digital Development 178 Jan 02, 2023
Object Moderation Layer

django-oml Welcome to the documentation for django-oml! OML means Object Moderation Layer, the idea is to have a mixin model that allows you to modera

Angel Velásquez 12 Aug 22, 2019
API-key based security utilities for FastAPI, focused on simplicity of use

FastAPI simple security API key based security package for FastAPI, focused on simplicity of use: Full functionality out of the box, no configuration

Tolki 154 Jan 03, 2023
Login System Using Django

Login System Django

Nandini Chhajed 6 Dec 12, 2021