azure活动目录图通过SharePoint Online上的SP.WebRequestInfo调用REST api

时间:2014-07-10 11:03:23

标签: api rest azure active-directory sharepoint-online

尝试通过SharePoint的SP.WebRequestInfo进行REST调用。

我收到错误“远程服务器在建立连接时返回了以下错误 - '未经授权'。”试图致电https://graph.windows.net/[Client]/users?api-version=2013-11-0

我已成功检索到访问令牌。

你能帮我解决为什么我会收到这个错误吗?

以下是我正在使用的代码:

        var url = "https://graph.windows.net/xxx/users/?api-version=2013-11-08";

        var context = SP.ClientContext.get_current();
        var request = new SP.WebRequestInfo();
        request.set_url(url);
        request.set_method("GET");
        request.set_headers({
            "Authorization": token.token_type + " " + token.access_token,
            "Content-Type": "application/json"
        });

        var response = SP.WebProxy.invoke(context, request);

        context.executeQueryAsync(successHandler, errorHandler);

        function successHandler() {
            if (response.get_statusCode() == 200) {
                var responseBody = JSON.parse(response.get_body());
                deferred.resolve(responseBody);
            } else {

                var httpCode = response.get_statusCode();
                var httpText = response.get_body();
                deferred.reject(httpCode + ": " + httpText);
            }
        }  

检索令牌的代码是:

    this.getToken = function (clientId, clientSecret) {
        var deferred = $q.defer();
        var resource = "https://graph.windows.net";
        var formData = "grant_type=client_credentials&resource=" + encodeURIComponent(resource)      + "&client_id=" + encodeURIComponent(clientId) + "&client_secret=" + encodeURIComponent(clientSecret);

        var url = "https://login.windows.net/xxxxxx.onmicrosoft.com/oauth2/token?api-version=1.0";

        var context = SP.ClientContext.get_current();
        var request = new SP.WebRequestInfo();
        request.set_url(url);
        request.set_method("POST");
        request.set_body(formData);

        var response = SP.WebProxy.invoke(context, request);

        context.executeQueryAsync(successHandler, errorHandler);

        function successHandler() {
            if (response.get_statusCode() == 200) {
            var token = JSON.parse(response.get_body());
            deferred.resolve(token);
        } else {
            var httpCode = response.get_statusCode();
            var httpText = response.get_body();
            deferred.reject(httpCode + ": " + httpText);
        }
    }

    function errorHandler() {
        deferred.reject(response.get_body());
    }

    return deferred.promise;
  };

1 个答案:

答案 0 :(得分:0)

Erik,这里有些奇怪 - 你正在使用来自JavaScript客户端的客户端凭证流 - 这揭示了发给客户端应用程序的秘密给JS应用程序的用户。

客户端凭证流还要求目录管理员向客户端应用程序授予目录读取权限 - 不确定是否已配置 - 但它必须仅用于机密客户端,而不是像JS应用程序那样的公共客户端。

Azure AD尚未实现implicit_grant oauth流,JS客户端应用程序可以通过重定向绑定(在片段中)代表用户获取访问令牌。这是我们正在努力的一项专业要求 - 请继续关注。