与spa和服务帐户msal一起使用的授权流程



微软文档中有这么多不同的流程,我不知道我需要哪一个。我正在使用React和Python。(我懂node,所以如果有人用node/express解释它就好了)

用户应该看到的:一个页面有一个按钮登录,导航是有,但不会工作,直到登录。登录时会创建一个弹出窗口,以使用Microsoft帐户登录。一旦登录,用户将能够使用导航查看动态信息。

我要做的是:此应用程序需要登录用户并通过'https://graph.microsoft.com/v1.0/me'.(no客户端秘密需要'获取用户的电子邮件,然后我需要在此请求中发送该电子邮件;

(租户= ={公司}.crm.dynamics.com。)

allInfo = requests.get(
f'https://{TENANT}api/data/v9.0/company_partneruserses?$filter=company_email eq '{email}'', headers=headers).json()

这个后端请求需要有一个客户端秘密来获取信息。所以我相信我的后端也需要登录到一个服务帐户。我认为我需要为我的后端获取一个令牌,以便代表服务帐户发出请求。

我有的:我有一个React前端,是签署的用户在和调用'https://graph.microsoft.com/v1.0/me'正确,并获得该电子邮件。一旦我收到邮件,我就把它发送到我的后台。

现在我不知道如何继续,我已经尝试了很多东西。

我所尝试的后端:尝试1:我得到一个令牌,但错误:{'error': {'code': '0x80072560', 'message': '用户不是组织的成员。'}}。问题是,这个id是Azure AD id。它应该工作

@app.route('/dynToken', methods=['POST'])
def get_dyn_token():
req = request.get_json()
partnerEmail = req['partnerEmail']
token = req['accessToken']
body = {
"client_id": microsoft_client_id,
"client_secret": client_secret,
"grant_type": "client_credentials",
"scope": SCOPE_DYN,
}
TENANTID = '{hash here}'
res = requests.post(
f'https://login.microsoftonline.com/{TENANTID}/oauth2/v2.0/token', data=body).json()
dyn_token = res['access_token']
headers = {
"Prefer": "odata.include-annotations="*"",
"content-type": "application/json; odata.metadata=full",
"Authorization": f"Bearer {dyn_token}"
}
try:
allInfo = requests.get(
f'https://{TENANT}api/data/v9.0/company_partneruserses?$filter=company_email eq '{email}'', headers=headers).json()
print(allInfo)

尝试2:相同的代码,但不是f'https://login.microsoftonline.com/{TENANTID}/oauth2/v2.0/token' itsf 'https://login.microsoftonline.com/common/oauth2/v2.0/token’。Error: An exception occurred: [Errno expected value]: 0。因为它返回一个空字符串

现在我甚至不知道我是否走在正确的道路上,也不知道该去哪里。我知道如果令牌是正确的,路由就会自己工作。我只用了SSR,没有反应,这些路线有效。但我需要React也在那里。我只是不知道该用什么流程来得到我需要的东西。文档使我的工作路线变得容易。但是{company}crm.dynamics.com文档并没有真正提供我想要做的事情。

注释后的附加信息:

' f 'https://{租户}api/数据/v9.0/company_partneruserses吗?$filter=company_email eq '{email} ", headers=header "正在尝试获取API密钥。完整代码:

try:
allInfo = requests.get(
f'https://{TENANT}api/data/v9.0/company_partneruserses?$filter=company_email eq '{email}'', headers=headers).json()
partner_value = allInfo['value'][0]['_company_partner_value']
response = requests.get(
f'https://{TENANT}api/data/v9.0/company_partnerses({partner_value})', headers=headers).json()
return {'key': response['company_apikey'], 'secret': response['company_apisecret']}

一旦它有了键:

def api_authentication(apikey, apisecret):
headers = get_headers() #<-- same headers as above with using dyn_token 
response = requests.get(
f'https://{TENANT}api/data/v9.0/company_partnerses?$filter=company_apikey eq '{apikey}' and company_apisecret eq '{apisecret}'&$select=company_apikey,company_apisecret,_company_account_value,_company_primarycontact_value,blahblah_unassignedhours,company_reporturl', headers=headers).json()
return response

之后,我能够获得我正在寻找的所有信息,并将其发送回我的前端以供客户查看。(通过使用这些键向crm发出多个请求)

如果CRM信任颁发给客户端的令牌(您的python后端),则您正在使用的client_credentials授权应该有效。请使用MSAL库而不是手工制作令牌请求。这将节省你的时间和消除错误。

最新更新