1

我一直在尝试通过 Python 在我的 Azure Blockchain Workbench 上执行一些合同。我一直无法弄清楚如何使用这种方法。adal.acquire_token_with_username_password()

我需要首先执行身份验证以获取承载以进行进一步的 API 调用。使用它可以完美地工作context.acquire_token_with_client_credentials(client_id,client_id,client_secret) 但是,上述不记名令牌与任何注册用户都不相关。

但是,要执行添加新用户等管理任务,必须获取管理员帐户的承载。所以我想到了使用acquire_token_with_username_password(),以便我获得管理员帐户的持有人。

import adal
import swagger_client
from swagger_client.api_client import ApiClient
context = adal.AuthenticationContext("https://login.microsoftonline.com/kumarshobhit98outlook.onmicrosoft.com/",api_version=None)
client_id="c62087b9-cfed-4105-a9c2-4fd3953ceed5"
token = context.acquire_token_with_username_password(resource='https://graph.windows.net',username="shobhit@kumarshobhit98outlook.onmicrosoft.com",password="password",client_id=client_id)
print(token['accessToken'])

我想也许 Resource 参数不正确。我不知道参数是什么意思。这也是我得到的错误,

Traceback (most recent call last):
  File "f:/codefundo2019/voting-system-blockchain/contractsShobhit/python/regVoter.py", line 8, in <module>
    token = context.acquire_token_with_username_password(resource='https://graph.windows.net',username="shobhit@kumarshobhit98outlook.onmicrosoft.com",password="Alonso123",client_id=client_id)
  File "C:\Users\SHOBHIT KUMAR.SHOBHIT-PC.000\.conda\envs\test\lib\site-packages\adal\authentication_context.py", line 164, in acquire_token_with_username_password
    return self._acquire_token(token_func)
  File "C:\Users\SHOBHIT KUMAR.SHOBHIT-PC.000\.conda\envs\test\lib\site-packages\adal\authentication_context.py", line 128, in _acquire_token
    return token_func(self)
  File "C:\Users\SHOBHIT KUMAR.SHOBHIT-PC.000\.conda\envs\test\lib\site-packages\adal\authentication_context.py", line 162, in token_func
    return token_request.get_token_with_username_password(username, password)
  File "C:\Users\SHOBHIT KUMAR.SHOBHIT-PC.000\.conda\envs\test\lib\site-packages\adal\token_request.py", line 281, in get_token_with_username_password
    token = self._get_token_username_password_managed(username, password)
  File "C:\Users\SHOBHIT KUMAR.SHOBHIT-PC.000\.conda\envs\test\lib\site-packages\adal\token_request.py", line 177, in _get_token_username_password_managed
    return self._oauth_get_token(oauth_parameters)
  File "C:\Users\SHOBHIT KUMAR.SHOBHIT-PC.000\.conda\envs\test\lib\site-packages\adal\token_request.py", line 112, in _oauth_get_token
    return client.get_token(oauth_parameters)
  File "C:\Users\SHOBHIT KUMAR.SHOBHIT-PC.000\.conda\envs\test\lib\site-packages\adal\oauth2_client.py", line 289, in get_token
    raise AdalError(return_error_string, error_response)
adal.adal_error.AdalError: Get Token request returned http error: 401 and server response: {"error":"invalid_client","error_description":"AADSTS7000218: The request body must contain the following parameter: 'client_assertion' or 'client_secret'.\r\nTrace ID: 2492ffdd-46e6-4edb-a412-47eefd200a00\r\nCorrelation ID: 2bbb1de3-b0b8-4510-b723-237e2faa7163\r\nTimestamp: 2019-08-09 06:50:11Z","error_codes":[7000218],"timestamp":"2019-08-09 06:50:11Z","trace_id":"2492ffdd-46e6-4edb-a412-47eefd200a00","correlation_id":"2bbb1de3-b0b8-4510-b723-237e2faa7163"}

我不明白为什么它要求用户名密码方法的 client_secret

4

1 回答 1

2

但是,要执行添加新用户等管理任务,必须获取管理员帐户的承载。

这是不正确的。令牌权限与帐户无关,而是您授予应用程序的权限。例如,如果你想调用add new user api。您将获得User.ReadWrite.All许可。

在此处输入图像描述

转到 Azure 门户->Azure Active Directory->应用注册->查找您的应用->Api 权限->添加权限->Microsoft Graph->应用程序权限->选择User.ReadWrite.All权限->授予管理员同意。

我想也许 Resource 参数不正确。不知道参数是什么意思

这是目标 Web API(安全资源)的 App ID URI。它也可能是像https://graph.microsoft.com这样的外部资源。你用https://graph.windows.net. 然后,您将只能调用Azure AD graph api

我不明白为什么它要求用户名密码方法的 client_secret 。

您需要将应用程序视为公共客户端。

在此处输入图像描述

于 2019-08-09T09:21:37.610 回答