0

我正在尝试使用Python 的 Azure Active Directory 库创建一个新用户,使用 UserPassCredentials 类对用户进行身份验证会引发位置参数错误。UserPassCredentials类。定义了所有参数:

 credentials = UserPassCredentials(username, password, client_id, secret, resource)

这是错误:

TypeError: __init__() takes from 3 to 5 positional arguments but 6 were given

正好有 5 个参数。为什么我不断收到此错误?

我了解 Azure AD Graph API将弃用某些功能,建议使用 Microsoft Graph API。我只需要一些帮助来理解它为什么返回这个错误。

4

3 回答 3

0

我决定使用MS Graph API。使用请求和 adal 库让这对我有用

于 2019-03-19T16:13:42.220 回答
0

首先,回答您的 Python 问题:

TypeError: __init__() takes from 3 to 5 positional arguments but 6 were given

这个类的文档,签名是:

UserPassCredentials(username, password, client_id=None, secret=None, **kwargs)

使用位置语法,您至少需要 2 个,最多需要 4 个(+ self 始终计为 1),因此消息是正确的“从 3 到 5”。当您在示例中传递“资源”时,您传递的是第 6 个位置参数,它不尊重 Python 签名(同样,self 算作一个!)。这与 Azure 或 SDK 无关,这是纯 Python :)

现在,为了解决您的特定问题,GraphRBAC API 要求资源参数始终https://graph.windows.net. 你不能改变它。所以最小的构造将是:

credentials = UserPassCredentials(
        'user@domain.com',      # Your user
        'my_password',          # Your password
        resource="https://graph.windows.net"
)

该文档可能会有所帮助:https ://docs.microsoft.com/python/api/overview/azure/activedirectory

这通常足以创建客户端。如果您有更多问题,请随时在 Github 上提出问题: https ://github.com/Azure/azure-sdk-for-python/issues

(我在 Azure SDK for Python 团队的 MS 工作,实际上拥有这段代码 :))

于 2019-03-13T06:42:03.857 回答
0

首先,在之前的 SDK 版本中,ADAL 还不可用,我们提供了一个 UserPassCredentials 类。这被认为已弃用,不应再使用。这不支持 2FA。但是根据我之前对此类的经验,我们要么在创建凭证对象时通过以下组合

1) 用户名​​、密码、2) 用户名​​、密码、资源 3) 客户端 ID、密码 4) 客户端 ID、密码和资源

资源默认为(' https://management.core.windows.net/ '。)

像这样的东西:

return UserPassCredentials(

        config_data["username"],

        config_data["password"],

    ) 

UserPassCredentials(username, password, client_id=None, secret=None, **kwargs)

最后一个参数是可以具有以下值的选项

可选的 kwargs 可能包括:

cloud_environment (msrestazure.azure_cloud.Cloud):有针对性的云环境

china (bool):为基于中国的服务配置身份验证,默认为 'False'。

租户(str):替代租户,默认为“普通”。

resource (str): 替代认证资源,默认为' https://management.core.windows.net/ '。

verify (bool):验证安全连接,默认为 'True'。

timeout (int):请求的超时时间,以秒为单位。

proxies (dict):字典映射协议或协议和主机名到代理的 URL。

缓存(adal.TokenCache):一个adal.TokenCache,见ADAL配置

我假设,您在参数中传递了正确的值,另外请尝试传递我上面提到的组合,看看它是否有效。

希望能帮助到你。

于 2019-03-13T03:22:29.280 回答