Azure B2C : Ошибка в обратном вызове после редактирования профиля при попытке получить новый токен
Я пытаюсь реализовать аутентификацию Azure B2C в Django.
К сожалению, в Django не так много документации на эту тему. Однако мне удалось написать функции и представления для получения id_token и хранения информации о пользователе в сессии.
Я хотел интегрировать редактирование профиля с определенными полномочиями, после чего пользователь проходит аутентификацию. Страница прекрасно перенаправляется для обновления информации о пользователе. Однако после проверки новых данных я получаю сообщение об ошибке в обратном вызове, когда пытаюсь получить новый токен (функция _get_token_from_code
).
{'error': 'invalid_grant', 'error_description': 'AADB2C90088: The provided grant has not been issued for this endpoint. Actual Value : B2C_1_signupsignin_20220810 and Expected Value : B2C_1_profileediting\r\nCorrelation ID: xxxxxxxxxxx nTimestamp: 2022-08-31 14:58:54Z\r\n'}
Это означает следующую ошибку в выполнении python :
_store_user(request, result['id_token_claims'])
KeyError: 'id_token_claims'
Однако новая информация пользователя корректно сохраняется в azure.
Поскольку я новичок в этом процессе аутентификации? Нужно ли нам генерировать новый токен для потока редактирования профиля пользователя? Откуда берется эта ошибка ?
Вот код в djnago :
Это решение с использованием https://django-allauth.readthedocs.io/en/latest/. Мы используем эту библиотеку в нескольких проектах для аутентификации с MS Azure/Graph и другими провайдерами. Она предоставляет адаптеры для множества платформ поставщиков идентификационных данных.
- добавить в INSTALLED_APPS:
'allauth',
'allauth.account',
'allauth.socialaccount',
'allauth.socialaccount.providers.microsoft',
- ваши настройки django-allauth должны включать:
SOCIALACCOUNT_PROVIDERS = {
'microsoft': {
'tenant': 'XXX', # replace this with your tenant name, see Azure
'SCOPE': ['User.Read', 'openid', 'email', 'profile'],
}
}
- Поскольку у вас, вероятно, есть пользовательские формы входа, вам нужно добавить к ним функциональность входа из django-allauth. Это пример, для объяснения смотрите документацию django-allauth. .
{% load i18n static socialaccount %}
{% for provider in socialaccount_providers %}
<p>
<a href="{% provider_login_url provider.id process='login' scope=scope auth_params=auth_params %}">
{% trans "Log in with" %}
<strong>{{ provider.name}}</strong>
</a>
</p>
{% endfor %}
django-allauth будет хранить токены в своих собственных моделях. Вы можете получить доступ к токенам для пользователя следующим образом:
from allauth.socialaccount.models import SocialToken
social_token = SocialToken.objects.filter(
account__user=request.user, account__provider='microsoft'
).order_by('-expires_at').first()
if social_token and social_token.token:
# social_token.token is the OAuth2 access_token