图表API以编程方式用户身份验证

时间:2016-12-14 18:29:01

标签: python powershell azure oauth-2.0

我正在尝试使用HTTP POST请求获取特定用户OAuth2承载令牌,似乎没有任何效果。

login_url = 'https://login.microsoftonline.com/'
authorize_endpoint = '{0}{1}{2}'.format(login_url,config.tenant_id,'/oauth2/authorize')

bodyvals = {'client_id': config.client_id,
            'client_secret': config.client_secret,
            'grant_type': 'client_credentials',
            'resource':config.resource_endpoint}

return requests.post(authorize_endpoint, data=bodyvals)

上述代码有效,但代表应用程序生成令牌 我似乎无法找到传递用户凭据的方法,也没有关于此的任何文档。

一般来说,我不在乎答案是在Python或Powershell中,还是只是一般性的解释,我似乎并不了解如何用AAD正确地做到这一点。

2 个答案:

答案 0 :(得分:1)

您可以手动执行此操作,请在此处查看我的其他答案:https://stackoverflow.com/a/40844983/1658906

您必须使用grant_type=password并调用oauth2/token端点。以下是用于身份验证的C#版本:

private async Task<string> GetAccessToken()
{
    string tokenEndpointUri = Authority + "oauth2/token";

    var content = new FormUrlEncodedContent(new []
        {
            new KeyValuePair<string, string>("grant_type", "password"),
            new KeyValuePair<string, string>("username", Username),
            new KeyValuePair<string, string>("password", Password),
            new KeyValuePair<string, string>("client_id", ClientId),
            new KeyValuePair<string, string>("client_secret", ClientSecret),
            new KeyValuePair<string, string>("resource", PowerBiResourceUri)
        }
    );

    using (var client = new HttpClient())
    {
        HttpResponseMessage res = await client.PostAsync(tokenEndpointUri, content);

        string json = await res.Content.ReadAsStringAsync();

        AzureAdTokenResponse tokenRes = JsonConvert.DeserializeObject<AzureAdTokenResponse>(json);

        return tokenRes.AccessToken;
    }
}

在请求中,您必须指定:

  1. 用户名
  2. 密码
  3. 客户ID
  4. 客户端密钥
  5. 资源URI

答案 1 :(得分:0)

对于GraphAPI,资源是&#34; https://graph.windows.net/&#34;

如果您不想使用ADAL,您可以查看&#34;资源&#34;的使用代码。涵盖了此方案,因此请将ADAL视为一个重要示例:)

此外,msrestazure还有一个也适用于GraphAPI的UserPassCredentials实例。