Browse Source

added `pwdlib` support with argon2, instead of `passlib`

pull/13917/head
Neizvestnyj 1 week ago
parent
commit
b7ccf4dcb4
  1. 20
      docs/en/docs/tutorial/security/oauth2-jwt.md
  2. 20
      docs/ru/docs/tutorial/security/oauth2-jwt.md
  3. 8
      docs_src/security/tutorial004_an_py310.py

20
docs/en/docs/tutorial/security/oauth2-jwt.md

@ -64,20 +64,20 @@ If your database is stolen, the thief won't have your users' plaintext passwords
So, the thief won't be able to try to use that password in another system (as many users use the same password everywhere, this would be dangerous).
## Install `passlib`
## Install `pwdlib`
PassLib is a great Python package to handle password hashes.
pwdlib is a great Python package to handle password hashes.
It supports many secure hashing algorithms and utilities to work with them.
The recommended algorithm is "Bcrypt".
The recommended algorithm is "Argon2".
Make sure you create a [virtual environment](../../virtual-environments.md){.internal-link target=_blank}, activate it, and then install PassLib with Bcrypt:
Make sure you create a [virtual environment](../../virtual-environments.md){.internal-link target=_blank}, activate it, and then install pwdlib with Argon2:
<div class="termy">
```console
$ pip install "passlib[bcrypt]"
$ pip install "pwdlib[argon2]"
---> 100%
```
@ -86,7 +86,7 @@ $ pip install "passlib[bcrypt]"
/// tip
With `passlib`, you could even configure it to be able to read passwords created by **Django**, a **Flask** security plug-in or many others.
With `pwdlib`, you could even configure it to be able to read passwords created by **Django**, a **Flask** security plug-in or many others.
So, you would be able to, for example, share the same data from a Django application in a database with a FastAPI application. Or gradually migrate a Django application using the same database.
@ -96,15 +96,15 @@ And your users would be able to login from your Django app or from your **FastAP
## Hash and verify the passwords
Import the tools we need from `passlib`.
Import the tools we need from `pwdlib`.
Create a PassLib "context". This is what will be used to hash and verify passwords.
Create a PasswordHash instance with recommended settings — it will be used for hashing and verifying passwords.
/// tip
The PassLib context also has functionality to use different hashing algorithms, including deprecated old ones only to allow verifying them, etc.
pwdlib also supports the bcrypt hashing algorithm but does not include legacy algorithms — for working with outdated hashes, it is recommended to use the passlib library.
For example, you could use it to read and verify passwords generated by another system (like Django) but hash any new passwords with a different algorithm like Bcrypt.
For example, you could use it to read and verify passwords generated by another system (like Django) but hash any new passwords with a different algorithm like Argon2 or Bcrypt.
And be compatible with all of them at the same time.

20
docs/ru/docs/tutorial/security/oauth2-jwt.md

@ -62,20 +62,20 @@ $ pip install pyjwt
Таким образом, вор не сможет использовать этот пароль в другой системе (поскольку многие пользователи везде используют один и тот же пароль, это было бы опасно).
## Установка `passlib`
## Установка `pwdlib`
PassLib - это отличный пакет Python для работы с хэшами паролей.
pwdlib - это отличный пакет Python для работы с хэшами паролей, пришедший на замену passlib.
Он поддерживает множество безопасных алгоритмов хеширования и утилит для работы с ними.
Рекомендуемый алгоритм - "Bcrypt".
Рекомендуемый алгоритм - "Argon2".
Убедитесь, что вы создали и активировали виртуальное окружение, и затем установите PassLib вместе с Bcrypt:
Убедитесь, что вы создали и активировали виртуальное окружение, и затем установите pwdlib вместе с Argon2:
<div class="termy">
```console
$ pip install "passlib[bcrypt]"
$ pip install "pwdlib[argon2]"
---> 100%
```
@ -83,7 +83,7 @@ $ pip install "passlib[bcrypt]"
</div>
/// tip | Подсказка
С помощью `passlib` можно даже настроить его на чтение паролей, созданных **Django**, плагином безопасности **Flask** или многими другими библиотеками.
С помощью `pwdlib` можно даже настроить его на чтение паролей, созданных **Django**, плагином безопасности **Flask** или многими другими библиотеками.
Таким образом, вы сможете, например, совместно использовать одни и те же данные из приложения Django в базе данных с приложением FastAPI. Или постепенно мигрировать Django-приложение, используя ту же базу данных.
@ -92,14 +92,14 @@ $ pip install "passlib[bcrypt]"
## Хеширование и проверка паролей
Импортируйте необходимые инструменты из `passlib`.
Импортируйте необходимые инструменты из `pwdlib`.
Создайте "контекст" PassLib. Именно он будет использоваться для хэширования и проверки паролей.
Создайте экземпляр `PasswordHash` с рекомендованными настройками — он будет использоваться для хэширования и проверки паролей.
/// tip | Подсказка
Контекст PassLib также имеет функциональность для использования различных алгоритмов хеширования, в том числе и устаревших, только для возможности их проверки и т.д.
pwdlib также имеет функциональность для использования алгоритма хэширования bcrypt, но не поддерживает старые алгоритмы — для работы с устаревшими хэшами рекомендуется использовать библиотеку passlib.
Например, вы можете использовать его для чтения и проверки паролей, сгенерированных другой системой (например, Django), но хэшировать все новые пароли другим алгоритмом, например Bcrypt.
Например, вы можете использовать его для чтения и проверки паролей, сгенерированных другой системой (например, Django), но хэшировать все новые пароли другим алгоритмом, например Argon2 или Bcrypt.
И при этом быть совместимым со всеми этими системами.
///

8
docs_src/security/tutorial004_an_py310.py

@ -5,7 +5,7 @@ import jwt
from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from jwt.exceptions import InvalidTokenError
from passlib.context import CryptContext
from pwdlib import PasswordHash
from pydantic import BaseModel
# to get a string like this run:
@ -46,7 +46,7 @@ class UserInDB(User):
hashed_password: str
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
password_hash = PasswordHash.recommended()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@ -54,11 +54,11 @@ app = FastAPI()
def verify_password(plain_password, hashed_password):
return pwd_context.verify(plain_password, hashed_password)
return password_hash.verify(plain_password, hashed_password)
def get_password_hash(password):
return pwd_context.hash(password)
return password_hash.hash(password)
def get_user(db, username: str):

Loading…
Cancel
Save