2014-07-10 37 views
0

試圖通過SharePoint的SP.WebRequestInfo進行REST調用。Azure Active Directory圖通過SharePoint Online上的SP.WebRequestInfo調用REST api調用

我收到錯誤「遠程服務器在建立連接時返回了以下錯誤 - '未經授權'。」試圖撥打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; 
    }; 
+0

Azure AD Graph API接受訪問權標記爲'https://graph.windows.net/'的令牌。請告訴我獲取令牌的代碼。 –

+0

@DushyantGill我已經更新了獲取令牌的代碼的問題。 –

回答

0

埃裏克,一些奇怪的是在這裏 - 你正在使用從客戶端憑證流一個JavaScript客戶端 - 這揭示了發給客戶端應用程序的祕密給JS應用程序的用戶。

客戶端憑證流還需要目錄管理員將目錄讀取權限授予客戶端應用程序 - 不知道這是否已配置 - 但它只能用於機密客戶端,而不是公共客戶端,如JS應用程序。

Azure AD尚未實現implicit_grant oauth流,通過它,JS客戶端應用程序可以代表用戶通過重定向綁定(在片段中)獲取訪問令牌。這是我們正在努力的一項休耕要求 - 敬請期待。

+0

謝謝Dushyant,期待新功能。有沒有計劃在API中支持JSONP? –

+0

嗨Dushyant,我們正在研究一個基於AngularJS的客戶端應用程序,並且還在尋找一種獲取訪問令牌來查詢Azure圖形API的方法。希望這會很快提供!謝謝! – qmo

相關問題