oauth2.0 stlock
Project description
Библиотека для сервиса авторизации STLock (powered by SmartTechnoLab)
Статус: В разработке
Библиотека Python STLock
Быстрый старт
Пример с библиотекой FastAPI
pip install stlock
pip install fastapi
pip install uvicorn
main.py:
from fastapi import FastAPI, HTTPException, Body, Query
from stlock import AuthClient
# создание экземпляра класса
AC = AuthClient(
client_id="client", # id клиента
client_secret="secret", # secret клиента
code_redirect_uri="http://localhost:8000/code", # ссылка перенаправления запроса с кодом
service_endpoint="https://bbac70hrtmfdqn5drnga.containers.yandexcloud.net", # ссылка на сервис авторизации
)
# service_endpoint="https://bbac70hrtmfdqn5drnga.containers.yandexcloud.net"
# dev версия проекта, очищается каждые 24 часа
app = FastAPI()
# Регистрация пользователя
@app.post("/register", status_code=201)
def register_user(username=Body(...), password=Body(...)):
data, status_code = AC.register(username, password)
if status_code >= 400:
raise HTTPException(status_code, data["detail"])
return data
# Авторизация пользователя, редирект на http://localhost:8000/code
@app.post('/login')
def login(username: str = Body(...), password: str = Body(...)):
data, status_code = AC.authorize_user(username, password)
if status_code >= 400:
raise HTTPException(status_code, data["detail"])
return data
# Получение кода после редиректа, заполняется в code_redirect_uri
@app.get('/code')
def getcode(code=Query(None)):
data, status_code = AC.get_tokens(code)
if status_code >= 400:
raise HTTPException(status_code, data["detail"])
return data
# Обмен refresh токена но новые refresh и access токены
@app.post("/refresh")
def do_refresh_token(refresh_token=Body(...)):
data, status_code = AC.do_refresh(refresh_token['refresh_token'])
print(data, status_code)
if status_code >= 400:
raise HTTPException(status_code, data["detail"])
return data
# Получение информации из токена
@app.get("/user")
def get_user_info(token: str = Query(...)):
user_data = AC.decode(token)
return user_data
Для запуска сервера:
uvicorn main:app
Описание методов:
def register(username: str, password: str) -> (dict, int):
Создаёт нового пользователя в базе данных
Пример использования:
@app.post("/register", status_code=201)
def register_user(username=Body(...), password=Body(...)):
data, status_code = AC.register(username, password)
if status_code >= 400:
raise HTTPException(status_code, data["detail"])
return data
Создание пользователя:
Input:
POST http://localhost:8000/register
Body {
"username": "user1",
"password": "Password123!"
}
Output:
{
"detail": "User registred"
}
def authorize_user(username: str, password: str) -> (dict, int):
Авторизирует запрос на логин пользователя, перенаправляет на страницу с кодом в query запросе
Пример использования:
@app.post('/login')
def login(username: str = Body(...), password: str = Body(...)):
data, status_code = AC.authorize_user(username, password)
if status_code >= 400:
raise HTTPException(status_code, data["detail"])
return data
Авторизация пользователя:
Input:
POST http://localhost:8000/login
Body {
"username": "user1",
"password": "Password123!"
}
Output:
{
"access_token": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJjbGllbnQiLCJleHAiOjE2ODQ4NTgzNzgsInN1YiI6ImQ5YjBmYjE1LWJjYmQtNDNkNy1hMDdlLTAxNTIwMjBlZWI2ZiIsInJvbGUiOiJUZXN0In0.5_CHG7IR0DDulJcaPF8owduWsVsI2a5Vvbx-gyG_Xi2JIs9tpaPfJircy8WZXkeZ_3Mk8tAuvaxhTn7ytWXtdA",
"expires_in": 60,
"refresh_token": "MJFMYZGWNWQTNDA5MI01NTU0LTHIMMYTYTI4MJM0MTZKMJHM",
"token_type": "Bearer"
}
def get_tokens(code: str) -> (dict, int):
Выдаёт токены пользователя (access, refresh)
Пример использования:
@app.get('/code')
def getcode(code=Query(None)):
data, status_code = AC.get_tokens(code)
if status_code >= 400:
raise HTTPException(status_code, data["detail"])
return data
def decode(token) -> dict:
Декодирует токен, возвращает словарь с данными о пользователе
Пример использования:
@app.get("/user")
def get_user_info(token: str = Query(...)):
user_data = AC.decode(token)
return user_data
Получение информации о пользователе:
Input:
GET http://localhost:8000/user?token=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJjbGllbnQiLCJleHAiOjE2ODQ4NTgzNzgsInN1YiI6ImQ5YjBmYjE1LWJjYmQtNDNkNy1hMDdlLTAxNTIwMjBlZWI2ZiIsInJvbGUiOiJUZXN0In0.5_CHG7IR0DDulJcaPF8owduWsVsI2a5Vvbx-gyG_Xi2JIs9tpaPfJircy8WZXkeZ_3Mk8tAuvaxhTn7ytWXtdA
Output:
{
"aud": "client",
"exp": 1684858378,
"sub": "d9b0fb15-bcbd-43d7-a07e-0152020eeb6f",
"role": "Test"
}
def do_refresh(token: str) -> (dict, int):
Обменивает refresh token на новый access и refresh токены
Пример использования:
@app.post("/refresh")
def do_refresh_token(refresh_token=Body(...)):
data, status_code = AC.do_refresh(refresh_token['refresh_token'])
print(data, status_code)
if status_code >= 400:
raise HTTPException(status_code, data["detail"])
return data
Обновление токена:
Input:
POST http://localhost:8000/refresh
Body {
"refresh_token": "MJFMYZGWNWQTNDA5MI01NTU0LTHIMMYTYTI4MJM0MTZKMJHM"
}
Output:
{
"access_token": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJjbGllbnQiLCJleHAiOjE2ODQ4NTg0MzgsInN1YiI6ImQ5YjBmYjE1LWJjYmQtNDNkNy1hMDdlLTAxNTIwMjBlZWI2ZiIsInJvbGUiOiJUZXN0In0.5hFJg-U6i9E9GFp0Gxsn9ME3Dy-JtqKEyZotHT7WmnAsdZeLrDBjDU20ttb5f5HMLep8SWruTOoWjlfiZuGBKg",
"expires_in": 60,
"refresh_token": "NTC1ZDY5YJYTZTC0MC01ZJRMLTHJZTUTY2E1MMFJMTAZNZI0",
"token_type": "Bearer"
}
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
stlock-0.0.8.tar.gz
(4.3 kB
view details)
File details
Details for the file stlock-0.0.8.tar.gz.
File metadata
- Download URL: stlock-0.0.8.tar.gz
- Upload date:
- Size: 4.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.9.16
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
19c36f5401632e98b4a15503d1458e35919f64d2b9682cd9b95815d52f462644
|
|
| MD5 |
a6413ff5eb36faf146afbbf1f6ca5d0d
|
|
| BLAKE2b-256 |
0ef5465796285e297a23b66045532acd521dbe7acf6584931738ccf6e938cbf7
|