0

我正嘗試使用Outlook REST API從用戶的Outlook郵件中獲取電子郵件。我已經能夠成功地驗證用戶,並得到用戶的訪問令牌,但是,當我試圖讓一個AJAX調用到Outlook REST API,我得到以下錯誤:嘗試獲取用戶電子郵件時出現Outlook REST API 403錯誤

GET https://outlook.office.com/api/v2.0/me/messages?callback=jQuery31008093694845457056_1490285639120 403 (Forbidden) 

而且,我獲得以下從error錯誤的AJAX回調函數:

Object {readyState: 4, status: 404, statusText: "error"} 

這裏是我的代碼:

var ADAL = new AuthenticationContext({ 
    instance: 'https://login.microsoftonline.com/', 
    tenant: 'common', 
    clientId: '',  //Intentionally left blank here 

    redirectUri: 'http://localhost:8383/',  
    callback: userSignedIn, 
    popUp: true 
}); 

function signIn() { 
    ADAL.login(); 
} 

function userSignedIn(err, token) { 
    console.log('userSignedIn called'); 
    if (!err) { 
     console.log(token);   //This works! 
     fetchUserSentMails(token); 
    } else { 
     console.error("error: " + err); 
    } 
} 

function fetchUserSentMails(token) { 
    var user = ADAL.getCachedUser(); 
    console.log(user.profile.name);  //This works! 

    $.ajax({     //This doesn't work 
     type: 'GET', 
     crossDomain: true, 
     url: 'https://outlook.office.com/api/v2.0/me/messages', 
     dataType: 'jsonp', 
     headers: {'Authorization': 'Bearer ' + token}, 
     success: function (res) { 
      console.log(res); 
     }, 
     error: function (x, t, m) { 
      console.log(x); 
      console.log(t); 
      console.log(m); 
     } 
    }); 
} 

我在做什麼錯?

回答

0

最有可能的答案是您的令牌沒有適當的範圍。在https://jwt.io解析您的令牌並查看scp聲明中的內容。

看起來你錯過了對AcquireToken的呼叫。 login方法只是簽署用戶並獲得他們的身份,它不提供訪問令牌。你需要這樣的事情:

ADAL.acquireToken("https://outlook.office.com", function(error, accessToken){ 
    if (error) { 
    console.log('ERROR: ' + JSON.stringify(error)); 
    } else { 
    fetchUserSentMails(accessToken); 
    } 
} 
+0

我猜我得到的令牌是'id_token'而不是'access_token'來訪問Outlook郵件API..am我正確?? –

+0

是的。我將用我認爲你錯過的一些代碼更新我的答案。 –

+0

我添加了該代碼。但是,我收到'錯誤:「由於超時導致令牌更新操作失敗」錯誤。我搜索了這個錯誤,並在上面的代碼之前添加了'ADALContext.handleWindowCallback()',但是,這會啓動一個無限循環。我甚至嘗試從chrome開發工具的「本地存儲」中清除過期的'id_tokens',但仍然出現同樣的錯誤。我究竟做錯了什麼?? –

0

我看到你正在收到超時錯誤。我有與超時完全相同的問題,我只能通過操作adal.js庫來解決這個問題。在這個庫中有一個6秒的超時時間,對於一些本地加載的應用程序來說它似乎非常緊張。要進行快速測試,您可以在adal.js中找到LOADFRAME_TIMEOUT:'6000',並將其替換爲LOADFRAME_TIMEOUT:'30000',這會讓您有30秒的時間來加載應用程序。我希望這個對你有用!

相關問題