2015-08-10 3 views
-2

Я пытался понять пример, приведенный в this ссылке:Тестирование Javascript Веб-приложение - 401 (Несанкционированное) ошибка

Я создал офис приложение для кругозора по той же схеме, чтобы получить доступ к Office 365 Outlook, APIs The link ,

Я создал приложение, используя инструменты Napa Dev.

Ошибки я получаю являются

  1. XMLHttpRequest не может загрузить https://outlook.office365.com/api/v1.0/me/messages. В запрошенном ресурсе нет заголовка «Access-Control-Allow-Origin». Происхождение 'https://localhost:8080', следовательно, не допускается. В ответе был код статуса HTTP 401. - Я получаю эту ошибку, когда CORS не разрешено.

  2. GET https://outlook.office365.com/api/v1.0/me/messages 401 (Несанкционированный) - Я получаю эту ошибку при включении CORS.

Как бы я сделать использование Перспективы REST API вызовов и тестирования приложения на местном уровне?

Любая помощь относительно этого очень ценится! Благодаря!

Edit: код с комментарием «// изменился» был изменен, чтобы сделать пример работы-

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> 
<title>O365 CORS Sample</title> 
<style> 
body { 
    font-family:'Segoe UI'; 
} 

.paddedElement { 
    margin-top: 5px; 
} 

.hidden { 
visibility: hidden; 
} 
</style> 
</head> 
<body> 
<h2>O365 CORS Sample</h2> 
<label for="TxtOauthToken">OAuth Token:</label> 
<input type="text" id="TxtOauthToken" size="80" /> 
<br /> 
<label for="endpointUrl">Endpoint URL:</label> 
<input type="text" id="endpoint" size="80" /> 
<br /> 
<input type="button" class="paddedElement" id="getToken" value="Get Token"> 
<input type="button" class="paddedElement" id="doCors" value="Make CORS Request" visibility="hidden" /> 
<br /> 
<br /> 
<label for="results" class="hidden paddedElement" id="resultHeading">Results:</label> 
<br /> 
<label id="debugMessage"></label> 
<pre id="results"></pre> 
<script type="text/javascript"> 
(function (window) { 
var isCorsCompatible = function() { 
try 
{ 
var xhr = new XMLHttpRequest(); 
xhr.open("GET", getEndpointUrl()); 
xhr.setRequestHeader("authorization", "Bearer " + token); 
xhr.setRequestHeader("accept", "application/json"); 
xhr.onload = function() { 
// CORS is working. 
console.log("Browser is CORS compatible."); 
} 
xhr.send(); 
} 
catch (e) 
{ 
if (e.number == -2147024891) 
{ 
console.log("Internet Explorer users must use Internet Explorer 11 with MS15-032: Cumulative security update for Internet Explorer (KB3038314) installed for this sample to work."); 
} 
else 
{ 
    console.log("An unexpected error occurred. Please refresh the page."); 
} 

} 
}; 

var urlParameterExtraction = new (function() { 
     function splitQueryString(queryStringFormattedString) { 
     console.log("Query: " + queryStringFormattedString); 
     var split = queryStringFormattedString.split('&'); 

     // If there are no parameters in URL, do nothing. 
     if (split == "") { 
     return {}; 
     } 

     var results = {}; 

     // If there are parameters in URL, extract key/value pairs. 
     for (var i = 0; i < split.length; ++i) { 
     var p = split[i].split('=', 2); 
     if (p.length == 1) 
     results[p[0]] = ""; 
     else 
     results[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " ")); 
     } 

     return results; 
     } 

     // Split the query string (after removing preceding '#'). 
     this.queryStringParameters = splitQueryString(window.location.hash.substr(1)); 
})(); 

var token = urlParameterExtraction.queryStringParameters['access_token']; 

if (token == undefined) { 
    document.getElementById("TxtOauthToken").value = "Click \"Get Token\" to trigger sign-in after entering the endpoint you want to use."; 

    document.getElementById("doCors").style.visibility = "hidden"; 
} 
else { 
    document.getElementById("TxtOauthToken").value = token; 
    document.getElementById("doCors").style.visibility = "visible"; 
    document.getElementById("getToken").style.display = "none"; 
} 

// Constructs the authentication URL and directs the user to it. 
function requestToken() { 
    // Change clientId and replyUrl to reflect your app's values 
    // found on the Configure tab in the Azure Management Portal. 
    var clientId = 'd18f9842-eec8-4d81-93e4-24ced3d59199'; //Changed 
    var replyUrl = 'https://localhost:8080/echo'; //Changed 
     var resource = "https://graph.windows.net/"; //Changed 

    var authServer = 'https://login.windows.net/common/oauth2/authorize?'; 
     //var endpointUrl = getEndpointUrl(); 
     var endpointUrl = 'http://outlook.office365.com/api/v1.0/me/messages'; //Changed 

    var responseType = 'token'; 

    var url = authServer + 
     "response_type=" + encodeURI(responseType) + "&" + 
     "client_id=" + encodeURI(clientId) + "&" + 
     "resource=" + encodeURI(resource) + "&" + 
     "redirect_uri=" + encodeURI(replyUrl); 

    window.location = url; 
} 

document.getElementById("getToken").onclick = requestToken; 

function getEndpointUrl() { 
    return document.getElementById("endpoint").value; 
} 

function getFilesFromO365() { 
    document.getElementById("results").textContent = ""; 

    // Check browser compatbility. Check console output for details. 
    isCorsCompatible(); 

    try 
    { 
     var xhr = new XMLHttpRequest(); 
     xhr.open("GET", getEndpointUrl()); 

     // The APIs require an OAuth access token in the Authorization header, formatted like this: 'Authorization: Bearer <token>'. 
     xhr.setRequestHeader("Authorization", "Bearer " + token); 

     // Process the response from the API. 
     xhr.onload = function() { 
      document.getElementById("resultHeading").style.visibility = "visible"; 

      if (xhr.status == 200) { 
       var formattedResponse = JSON.stringify(JSON.parse(xhr.response), undefined, 2); 
       document.getElementById("results").textContent = formattedResponse; 
      } else { 
       document.getElementById("results").textContent = "HTTP " + xhr.status + "<br>" + xhr.response; 
      } 
     } 

     // Make request. 
     xhr.send(); 
    } 
    catch (err) 
    { 
     document.getElementById("resultHeading").style.visibility = "visible"; 
     document.getElementById("results").textContent = "Exception: " + err.message; 
    } 
} 

document.getElementById("doCors").onclick = getFilesFromO365; 

})(window); 
</script> 
</body> 

</html> 
+0

Итак, у вас возникла проблема с CORS ..., которую вы исправили (так зачем же это заголовок вопроса?) ... и теперь у вас другая проблема, когда сервер говорит вам, что вы не авторизованы, но вы не использовали ваш код с нами. – Quentin

+0

Я обновлю сообщение. – Spartan

+0

Я добавил код и в основном внес изменения в метод requestToken. Я добавил clientId, replyUrl, resource и endpointUrl. – Spartan

ответ

0

Пример вы пытаетесь следовать не за надстройкой, но для Веб-приложение JavaScript, использующее API Office 365. Я считаю, что возможно иметь надстройку, которая использует API Office 365, но это не тот пример, который вы используете.

В любом случае, 401, который вы получаете, можно устранить, установив права доступа для вашего приложения в Azure AD. Пример, который вы следуете, использует API файлов, поэтому он устанавливает . Прочитайте файлы пользователя разрешение на шаге 10 в Зарегистрируйте ваше приложение с помощью Azure AD. Для вашего случая вам нужно будет добавить приложение Office 365 Exchange Online и затем выбрать правильные разрешения.

Кроме того, я заметил, что вы изменили ресурс переменную https://graph.windows.net/, что неправильно для почты API в любом случае. Вам необходимо установить его на https://outlook.office365.com.

+0

Спасибо, Джо! Вы знаете пример/текст, где я могу использовать API-интерфейсы REST Outlook в надстройке Office? – Spartan

+0

В настоящее время я не верю, что такой пример работает. Я не могу сказать точно, когда он будет доступен, но следите за учетной записью [OfficeDev GitHub] (https://github.com/OfficeDev)! –

+0

Привет, Джо, возможно ли получить контакт с разработчиком, который работает над этим примером?Я работаю над проектом, который имеет строгий срок, и я довольно новичок в технологии API Office 365. Было бы здорово, если бы вы могли помочь мне в этом. – Spartan