Instagram автоматически обновляет URI перенаправления, отправляющий код oauth2
Я разместил свой проект django на pythonanywhere, сайте бесплатного хостинга. Код отлично работает в локальной сети и в Интернете, но почему-то возникла проблема с аутентификацией в instagram.
Instagram использует систему аутентификации oauth2, в которой, когда пользователь разрешает ваше приложение, оно перенаправляет пользователя на указанный URI и добавляет код внутри URL, который в дальнейшем может быть использован для аутентификации пользователя.
Instagram не позволяет использовать localhosts в качестве допустимого URL перенаправления, поэтому для тестирования я использовал что-то вроде этого
InstaAuth.html
<script>
history.pushState(null, null, '?code=AQD_4...q6#_');
function reloadThePage() {
window.location.reload();
}
</script>
<button type="submit" class="btn btn-primary" onclick="reloadThePage()">Continue</button>
, который изменяет состояние url, но не обновляет его. Затем у меня есть кнопка, которая обновляет текущую страницу, которая непосредственно вызывает нижеприведенный код в моем views.py
и получает код через request.GET['code']
.
Views.py
def instaAuth(request):
if 'code' in dict(request.GET).keys():
code = request.GET['code']
print('the given code is', code)
core = instaCore()
user_id, short_lived_access_token = core.code_to_short_access_with_userid(code_string=code)
print(user_id)
obj = InstaModel.objects.get(username=request.user)
obj.instagram_userid = user_id
obj.short_lived_access_token = short_lived_access_token
obj.is_active = True
obj.save()
print('all data saved!')
messages.success(request, "Your instagram is connected!")
return render(request, 'authentication/success.html')
return render(request, 'authentication/instaAuth.html')
Вышеприведенный код работает отлично, когда я добавляю код с помощью метода pushState
и обновляю страницу с помощью кнопки. но когда я делаю то же самое в моем webapp, авторизую приложение и затем нажимаю кнопку продолжить, он проходит через KeyError at /instaAuth 'access_token'
.
Эта ошибка обычно возникает, когда кто-то пытается использовать один и тот же oauth code
более одного раза. Когда я заглянул в журналы, я обнаружил ошибку в той же строке, где я обменивался кодом oauth с маркером доступа. Я попытался заглянуть в сетевую вкладку запросов, но не уверен, что именно пропало. Я делал подобное, используя streamlit
, и все работало нормально, вы можете проверить приложение streamlit здесь https://instalogintest.herokuapp.com/
Я застрял на этом месте, я хочу иметь некоторую логику, которая либо не обновляет страницу, либо способ, которым django знает, что этот запрос приходит из Instagram и проверяет пользователя с помощью кода.
Проблема решена после того, как я целый день все просматривал. Не могу поверить, что это была такая маленькая ошибка.
Я не менял redirect uri
при обмене code
на access_token
.
Проблема была в том, что я не выводил ошибку, она всегда проходила через блок попыток и ошибок, больше никогда не буду делать то же самое.
Всегда используйте этот синтаксис
try
do_something()
except Exception as e:
print(e)
do_something_else()