- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试在 Django 中实现 azure B2C 身份验证。
不幸的是,Django 中关于这个主题的文档并不多。不过,我设法编写了函数和 View 来获取 id_token 并将用户信息存储在 session 中。
我想在用户经过身份验证后将编辑配置文件与特定权限集成。页面完美重定向以更新用户信息。但是,在验证新数据后,当我尝试获取新 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中。
由于我是此身份验证过程中的新手?我们是否需要为编辑个人资料用户流程生成新 token ?这个错误从何而来?
这是 djnago 中的代码:
load_dotenv()
def initialize_context(request):
context = {}
# Check for any errors in the session
error = request.session.pop('flash_error', None)
if error != None:
context['errors'] = []
context['errors'].append(error)
# Check for user in the session
context['user'] = request.session.get('user', {'is_authenticated': False})
return context
def index(request) :
context = initialize_context(request)
return render(request, 'index.html', context)
def sign_in(request) :
flow = _build_auth_code_flow()
try:
request.session['auth_flow'] = flow
except Exception as e:
print(e)
return HttpResponseRedirect(flow['auth_uri'])
def callback(request) :
result = _get_token_from_code(request)
print(result)
# Store user from auth_helper.py script
_store_user(request, result['id_token_claims'])
return redirect('home')
def home(request) :
context = initialize_context(request)
context['edit'] = os.getenv("B2C_PROFILE_AUTHORITY")
context['user'] = request.session['user'].get('emails')[0]
return render(request, 'home.html', context)
def editprofile(request) :
authority = os.getenv("B2C_PROFILE_AUTHORITY")
flow = _build_auth_code_flow(authority=authority)
try:
request.session['auth_flow'] = flow
except Exception as e:
print(e)
return HttpResponseRedirect(flow['auth_uri'])
#----- Library -----------------------
def _build_msal_app(cache=None, authority=None):
auth_app = msal.ConfidentialClientApplication(
os.getenv("CLIENT_ID"),
authority=authority or os.getenv("AUTHORITY"),
client_credential=os.getenv("CLIENT_SECRET"),
token_cache=cache)
return auth_app
def _build_auth_code_flow(authority=None, scopes=None):
return _build_msal_app(authority=authority).initiate_auth_code_flow(
scopes or [],
redirect_uri="http://localhost:8000/getAToken")
def _get_token_from_code(request):
cache = _load_cache(request)
auth_app = _build_msal_app(cache)
# Get the flow saved in session
flow = request.session.pop('auth_flow', {})
result = auth_app.acquire_token_by_auth_code_flow(flow, request.GET)
_save_cache(request, cache)
return result
def _load_cache(request):
# Check for a token cache in the session
cache = msal.SerializableTokenCache()
if request.session.get('token_cache'):
cache.deserialize(request.session['token_cache'])
return cache
def _save_cache(request, cache):
# If cache has changed, persist back to session
if cache.has_state_changed:
request.session['token_cache'] = cache.serialize()
def _store_user(request, user):
try:
request.session['user'] = {
'is_authenticated': True,
'name': user['given_name'],
'emails': user['emails'] if (user['emails'] != None) else user['userPrincipalName'],
# 'timeZone': user['mailboxSettings']['timeZone'] if (user['mailboxSettings']['timeZone'] != None) else 'UTC'
}
except Exception as e:
print(e)
最佳答案
这是一个使用 https://django-allauth.readthedocs.io/en/latest/ 的解决方案我们在多个项目中使用这个库来通过 MS Azure/Graph 和其他提供商进行身份验证。它为很多身份提供商平台提供适配器。
'allauth',
'allauth.account',
'allauth.socialaccount',
'allauth.socialaccount.providers.microsoft',
SOCIALACCOUNT_PROVIDERS = {
'microsoft': {
'tenant': 'XXX', # replace this with your tenant name, see Azure
'SCOPE': ['User.Read', 'openid', 'email', 'profile'],
}
}
{% 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 将在自己的模型中存储 token 。您可以像这样访问用户的 token :
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
关于python - Azure B2C : Error in the callback after the edit profile when it tries to get a new token,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73558031/
reqwest v0.9 将 serde v1.0 作为依赖项,因此实现 converting serde_json errors into reqwest error . 在我的代码中,我使用 se
我有这个代码: let file = FileStorage { // ... }; file.write("Test", bytes.as_ref()) .map_err(|e| Mu
我只是尝试用angular-cli创建一个新项目,然后运行服务器,但是它停止并显示一条有趣的消息:Error: No errors。 我以这种方式更新了(希望有帮助):npm uninstall -g
我从我的 javascript 发送交易 Metamask 打开传输对话框 我确定 i get an error message in metamask (inpage.js:1 MetaMask -
这个问题在这里已经有了答案: How do you define custom `Error` types in Rust? (3 个答案) How to get a reference to a
我想知道两者之间有什么大的区别 if let error = error{} vs if error != nil?或者只是人们的不同之处,比如他们如何用代码表达自己? 例如,如果我使用这段代码: u
当我尝试发送超过 50KB 的图像时,我在 Blazor 服务器应用程序上收到以下错误消息 Error: Connection disconnected with error 'Error: Serv
我有一个error-page指令,它将所有异常重定向到错误显示页面 我的web.xml: [...] java.lang.Exception /vi
我有这样的对象: address: { "phone" : 888, "value" : 12 } 在 WHERE 中我需要通过 address.value 查找对象,但是在 SQL 中有函数
每次我尝试编译我的代码时,我都会遇到大量错误。这不是我的代码的问题,因为它在另一台计算机上工作得很好。我尝试重新安装和修复,但这没有帮助。这是整个错误消息: 1>------ Build starte
在我的代码的类部分,如果我写一个错误,则在不应该的情况下,将有几行报告为错误。我将'| error'放在可以从错误中恢复的良好/安全位置,但是我认为它没有使用它。也许它试图在某个地方恢复中间表情? 有
我遇到了 csv 输入文件整体读取故障的问题,我可以通过在 read_csv 函数中添加 "error_bad_lines=False" 来删除这些问题来解决这个问题。 但是我需要报告这些造成问题的文
在 Spring 中,验证后我们在 controller 中得到一个 BindingResult 对象。 很简单,如果我收到验证错误,我想重新显示我的表单,并在每个受影响的字段上方显示错误消息。 因此
我不知道出了什么问题,因为我用 Java 编程了大约一年,从来没有遇到过这个错误。在一分钟前在 Eclipse 中编译和运行工作,现在我得到这个错误: #A fatal error has been
SELECT to_char(messages. TIME, 'YYYY/MM/DD') AS FullDate, to_char(messages. TIME, 'MM/DD
我收到这些错误: AnonymousPath\Anonymized.vb : error BC30037: Character is not valid. AnonymousPath\Anonymiz
我刚刚安装了 gridengine 并在执行 qstat 时出现错误: error: commlib error: got select error (Connection refused) erro
嗨,我正在学习 PHP,我从 CRUD 系统开始,我在 Windows 上安装了 WAMP 服务器,当我运行它时,我收到以下错误消息。 SCREAM: Error suppression ignore
我刚刚开始一个新项目,我正在学习核心数据教程,可以找到:https://www.youtube.com/watch?v=zZJpsszfTHM 我似乎无法弄清楚为什么会抛出此错误。我有一个名为“Exp
当我使用 Jenkins 运行新构建时,出现以下错误: "FilePathY\XXX.cpp : fatal error C1853: 'FilePathZ\XXX.pch' precompiled
我是一名优秀的程序员,十分优秀!