我正在尝试使用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正确地做到这一点。
答案 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 :(得分:0)
对于GraphAPI,资源是&#34; https://graph.windows.net/&#34;
如果您不想使用ADAL,您可以查看&#34;资源&#34;的使用代码。涵盖了此方案,因此请将ADAL视为一个重要示例:)
此外,msrestazure还有一个也适用于GraphAPI的UserPassCredentials实例。