我正在开发一个Angular + Flask应用程序,它使用微软的OAuth2(代表用户流)。我试图从后端调用API,但我得到了一个异常。
以下是app.module.ts
中的配置:
export function MSALInstanceFactory(): IPublicClientApplication {
return new PublicClientApplication({
auth: {
clientId: '<application_id_of_spa>',
authority: 'https://login.microsoftonline.com/organizations',
redirectUri: 'http://localhost:4200/'
},
cache: {
cacheLocation: BrowserCacheLocation.LocalStorage,
storeAuthStateInCookie: isIE,
},
system: {
loggerOptions: {
loggerCallback,
logLevel: LogLevel.Info,
piiLoggingEnabled: false
}
}
});
}
export function MSALInterceptorConfigFactory(): MsalInterceptorConfiguration {
const protectedResourceMap = new Map<string, Array<string>>();
protectedResourceMap.set('https://graph.microsoft.com/v1.0/me', ['user.read']);
protectedResourceMap.set('https://api.powerbi.com/v1.0/myorg/', ['https://analysis.windows.net/powerbi/api/.default']);
protectedResourceMap.set('http://localhost:5000/api/v1.0/get_workspaces',['api://<application_id_of_webapi>/.default'])
return {
interactionType: InteractionType.Popup,
protectedResourceMap
};
}
export function MSALGuardConfigFactory(): MsalGuardConfiguration {
return {
interactionType: InteractionType.Popup,
authRequest: {
scopes: ['api://<application_id_of_webapi>/.default'],
},
};
}
然后我使用acquireTokenPopup
msal函数来获取访问令牌。
然后我调用后端API如下:
this.http.get('http://localhost:5000/api/v1.0/get_workspaces')
My Flask Web API:
@app.route('/api/v1.0/get_workspaces', methods=['GET'])
def get():
current_access_token = request.headers.get("Authorization", None)
msal_client = msal.ConfidentialClientApplication(
client_id=app.config['CLIENT_ID'],
authority=app.config['AUTHORITY'],
client_credential=app.config['CLIENT_SECRET'])
# acquire token on behalf of the user that called this API
arm_resource_access_token = msal_client.acquire_token_on_behalf_of(
user_assertion=current_access_token.split(' ')[1],
scopes=app.config['SCOPE']
)
print( arm_resource_access_token) /////////////////// ******* I'm getting the error here
headers = {
'Authorization': arm_resource_access_token['token_type'] + ' ' + arm_resource_access_token['access_token']}
workspaces= requests.get(app.config['ENDPOINT'] + 'workspaces', headers = headers).json()
print(workspaces)
return jsonify(workspaces)
在我的Angular 控制台里,我得到了这个:
在我的Flask终端中,我得到了这个:
AADSTS65001: The user or administrator has not consented to use the application with ID <webapi_ app_id>.
在Azure门户中,我注册了spa和Web API:
我在后端公开了API,并将其添加到前端注册中。
我在Authorized客户端应用程序中添加spa app_id。
2条答案
按热度按时间f1tvaqid1#
AADSTS65001:用户或管理员未同意使用该应用程序
此错误通常发生在您在检索访问令牌时错过了对添加的范围进行授予管理员同意。
如需解决,请检查您是否暴露了如下API:
转到Azure门户-> Azure Active Directory ->应用注册->您的应用->公开API
API暴露后,请确保为它授权**
API permissions
**,如下所示:转到Azure门户-> Azure Active Directory ->应用注册->您的应用-> API权限->添加权限->我的API->您的API
转到Azure门户-> Azure Active Directory ->应用注册->您的应用->身份验证
如果错误仍然存在,请检查以下链接:
azure active directory - InteractionRequiredAuthError: AADSTS65001: The user or administrator has not consented to use the application with ID - Stack Overflow
.net - "AADSTS65001: The user or administrator has not consented to use the application" occurs when token is acquired on behalf of a user - Stack Overflow
更新:
正如您在评论中提到的,请确保将您的客户端应用程序添加到已知客户端应用程序列表
xwmevbvl2#
除了Azure Portal之外,还有一个潜在的问题:范围。
在设置我的身份验证方案时,用户将首先登录到Microsoft,然后返回到我的应用程序,我发现Graph API确实喜欢将范围部分
初始URL如下所示(为清晰起见,请换行)
我使用了
https://graph.microsoft.com/user.read
和类似的特定选项作为作用域。如果你这样做了,而Sridevi概述的控制台更改没有修复它,请尝试更改它。