使用纯Javascript获取令牌。 Xhr状态== 0

时间:2015-03-16 15:11:14

标签: office365 azure-active-directory

我尝试在没有 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 == 4status == 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 == 4xhr.status == 0 ... 处理没有消息的错误。

我在StackOverflow上搜索了一些奇怪的status == 0行为,但没有找到任何真正的结论......

希望我能理解(你知道,法国人......不会说英语:))

塞巴斯蒂安

2 个答案:

答案 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/

希望这有帮助,