我尝试在没有 ADAL.JS
的帮助下进行纯JavaScript身份验证过程为确保问题不是来自JQuery
,我使用了xhr
请求。
我可以轻松地从https://login.windows.net/common/oauth2/authorize
获取请求中获取代码字符串。该回复包含我的代码字符串,我可以在/token
请求中使用
然后,我尝试使用https://login.windows.net/common/oauth2/token
方法调用POST
网址。
小提琴响应是正确的,向我发送 JSON 结构(包含我的 bearer 令牌),但xhr
对象正在返回我猜readyState == 4
和status == 0
(而不是status==200
)
以下是我用来发送POST
数据的代码(顺便说一句,这是一个Typescript脚本):
var data = 'grant_type=authorization_code'
+ '&code=' + code
+ '&client_id=' + clientId
+ '&client_secret=' + encodeURIComponent('passwordDEEDADAEDEADADADADA=')
+ '&redirect_uri=' + encodeURIComponent(redirectUri);
var xhr = new XMLHttpRequest()
xhr.open('POST', 'https://login.windows.net/common/oauth2/token', true);
xhr.setRequestHeader('Content-type',
'application/x-www-form-urlencoded; charset=UTF-8');
xhr.setRequestHeader('Accept', '*/*');
xhr.onerror = (ev: ErrorEvent) => {
console.log(ev.message);
}
xhr.onreadystatechange = (e) => {
var state = e;
if (xhr.readyState == 4) {
if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) {
var jsonResult = JSON.parse(xhr.responseText);
var access_token = {
token: jsonResult.access_token,
expires_in: new Date((new Date()).getTime() +
(jsonResult.expires_in - 300) * 1000)
};
} else {
//reject(xhr);
}
}
};
xhr.send(data);
嗯......它按预期工作,至少在小提琴手中:)
但我的xhr请求会返回xhr.readyState == 4
和xhr.status == 0
...
处理没有消息的错误。
我在StackOverflow上搜索了一些奇怪的status == 0
行为,但没有找到任何真正的结论......
希望我能理解(你知道,法国人......不会说英语:))
塞巴斯蒂安
答案 0 :(得分:2)
AAD OAuth端点目前尚未正确支持CORS。正如Dan所描述的那样,我们已经启用了javascript应用来使用隐式流来获取令牌。
另外,请注意,您不应在基于浏览器的应用程序中使用client_secret。 Client_secrets适用于运行服务器端的机密客户端,可以保护机密的完整性。如果上述内容在浏览器中运行,那么您的客户端密钥将暴露给全世界,这具有严重的安全隐患。
答案 1 :(得分:1)
我会请其他人在这里仔细检查我的答案,但ADAL.JS仅支持OAuth2.0隐式流程。这将使您返回访问令牌(来自授权端点)。我不相信您会获得一个代码,或者您需要在此方案中使用令牌端点。
我们有一些示例和博客文章描述了ADAL.JS的使用,它们可以为您提供更多帮助。
高级信息:https://msdn.microsoft.com/en-us/library/azure/dn499820.aspx#BKMK_Spa 示例(github):https://github.com/AzureADSamples/SinglePageApp-DotNet 博客(来自Vittorio):http://www.cloudidentity.com/blog/2015/02/19/introducing-adal-js-v1/
希望这有帮助,