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 и другими провайдерами. Она предоставляет адаптеры для множества платформ поставщиков идентификационных данных.

  1. добавить в INSTALLED_APPS:
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    'allauth.socialaccount.providers.microsoft',
  1. ваши настройки django-allauth должны включать:
SOCIALACCOUNT_PROVIDERS = {
    'microsoft': {
        'tenant': 'XXX',  # replace this with your tenant name, see Azure
        'SCOPE': ['User.Read', 'openid', 'email', 'profile'],
    }
}
  1. Поскольку у вас, вероятно, есть пользовательские формы входа, вам нужно добавить к ним функциональность входа из django-allauth. Это пример, для объяснения смотрите документацию django-allauth.
  2. .
{% 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
Вернуться на верх