В документации он использует 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