Как реализовать OAuth в FastAPI с идентификатором клиента и секретом - PullRequest
0 голосов
/ 04 августа 2020

Я следил за документами о Oauth2, но в нем не описывается процесс добавления идентификатора клиента и секрета

https://fastapi.tiangolo.com/advanced/security/oauth2-scopes/

и что это делает

class UserInDB(User):
    hashed_password: str

из исходного примера

1 Ответ

1 голос
/ 05 августа 2020

В документации он использует OAuth2PasswordRequestForm для аутентификации пользователя, этот класс имеет в основном 6 разных полей,

grant_type: str = Form(None, regex="password"),
username: str = Form(...),
password: str = Form(...),
scope: str = Form(""),
client_id: Optional[str] = Form(None),
client_secret: Optional[str] = Form(None),

Таким образом, вы можете добавить client_id и client_secret, если вам интересно Репозиторий здесь.

Но я обычно предпочитаю authlib, это экономит так много времени и упрощает работу. Вот полный пример того, как вы можете создать OAuth с authlib

Сначала создайте клиент OAuth

from authlib.integrations.starlette_client import OAuth
from starlette.config import Config

config = Config('.env')  # read config from .env file
oauth = OAuth(config)
oauth.register(
    name='google',
    server_metadata_url='https://accounts.google.com/.well-known/openid-configuration',
    client_kwargs={
        'scope': 'openid email profile'
    }
)

Нам не нужно добавлять здесь client_id и client_secret, потому что они находятся в .env файл. Вы не должны жестко закодировать их в коде в реальных продуктах. Google имеет конечную точку обнаружения OpenID, мы можем использовать этот URL для server_metadata_url. Authlib автоматически загрузит этот server_metadata_url для настройки клиента OAuth.

Теперь мы создадим приложение FastAPI для определения маршрута входа.

from fastapi import FastAPI, Request
from starlette.middleware.sessions import SessionMiddleware

app = FastAPI()
app.add_middleware(SessionMiddleware, secret_key="secret-string")

Нам нужно это SessionMiddleware, потому что Authlib будет использовать request.session для хранения временных кодов и состояний. Приведенный ниже код, который является конечной точкой /login, перенаправит вас на веб-сайт учетной записи Google.

@app.route('/login')
async def login(request: Request):
    redirect_uri = request.url_for('auth')
    return await oauth.google.authorize_redirect(request, redirect_uri

Когда вы предоставляете доступ с веб-сайта Google, Google будет перенаправлять обратно на ваш redirect_uri, то есть request.url_for('auth'):

@app.route('/auth')
async def auth(request: Request):
    token = await oauth.google.authorize_access_token(request)
    user = await oauth.google.parse_id_token(request, token)
    return user

Приведенный выше код получит токен, который содержит access_token и id_token. Id_token содержит информацию о пользователе, нам просто нужно проанализировать его, чтобы получить информацию о логине пользователя.

Источники: Authlib-FastAPI-Google-Login

Также, если вы все еще хотите использовать Pure FastAPI, проверьте эту ссылку FastAPI OAuth2PasswordRequestForm

...