- Пользователь интерфейса переходит на BACKEND_URL/api/v1/oauth/github со страницы FRONTEND_URL/login< /li>
Бэкэнд возвращает перенаправление на https://github.com/login/oauth/authoriz ... user:email - Frontend перенаправляет на Github и получает код в FRONTEND_URL/login?app=github&code=CODE
- Затем useEffect извлекает BACKEND_URL/api/v1/oauth/github/access?code=CODE и получает токен доступа
Код интерфейса:
useEffect(() => {
const code = searchParams.get("code");
const app = searchParams.get("app");
if (!code || !app) {
return;
}
axios.get(`${BACKEND_URL}/api/v1/oauth/${app}/access?code=${code}`);
}, []);
Login with GitHub
Верхний код:
@app.get('/api/v1/oauth/github')
def github():
return RedirectResponse("https://github.com/login/oauth/authoriz ... user:email", status_code=307)
@app.get('/api/v1/oauth/github/access')
def github_access(code: str):
r = requests.post(f"https://github.com/login/oauth/access_t ... code={code}")
...
return "token"
Пытался узнать ответ в чате gpt. Но он предложил использовать вариант ниже. Но это выглядит странно. Это хорошая практика?
state_storage = {}
@app.get('/api/v1/oauth/github')
def github():
state = str(uuid.uuid4())
state_storage[state] = True
return RedirectResponse("https://github.com/login/oauth/authoriz ... user:email", status_code=307)
@app.get('/api/v1/oauth/github/access')
def github_access(code: str):
if state not in state_storage:
raise HTTPException(status_code=400)
del state_storage[state]
r = requests.post(f"https://github.com/login/oauth/access_t ... code={code}")
...
return "token"
Подробнее здесь: https://stackoverflow.com/questions/793 ... with-state
Мобильная версия