Я посмотрел на GitHub OAuth API и увидел, что одно требование для отправки в конечную точку — state.
Отправка его тривиальна, но как вы проверяете, что отправленный вами state — это тот же самый, который вы получаете?
Я думал об использовании кеширование браузера, но похоже, что это для просмотра Django и повышения производительности.
Я думал о отправка токена CSRF как о state, но, похоже, он предназначен для форм, которые вы создаете.
Короче говоря, как вы проверяете state в Django? Есть ли в Django питонический способ сделать это?





сеанс пользователя — это лучшее место для хранения переменных, связанных с сеансом, как в данном случае.
Итак, сгенерируйте свой state и сохраните его в сеансе пользователя:
request.session['github_state'] = state
return render(<template with github link>, context = {'state': state})
Затем, когда вы получаете авторизованный GET-запрос пользователя:
if request.session.get('github_state') and not request.GET.get('state') == request.session['github_state']:
# abort here
else:
code = request.GET.get('code')
# POST request with code to GitHub to fetch the access token
Я проверяю, что переменная сеанса не пуста/Нет, иначе обе могут быть пустыми, и проверка пройдет.
Когда вы создаете его, вы можете сохранить его в пользовательском сеанс. Когда вы получите ответ, просто сравните
stateсо значением, которое вы сохранили в сеансе. Обратите внимание, что существуют уже написанные пакеты Django, поэтому вам не нужно разбираться со всеми сложностями самостоятельно. Не так просто написать полностью безопасный клиент OAuth2 (django-allauth, python-social-auth, django-oauth-toolkit).