【问题标题】:Outlook REST API 403 error while trying to fetch user emails尝试获取用户电子邮件时出现 Outlook REST API 403 错误
【发布时间】:2017-03-30 22:47:27
【问题描述】:

我正在尝试使用 Outlook REST API 从用户的 Outlook 邮件中获取电子邮件。我已经能够成功地对用户进行身份验证并获得用户访问令牌,但是,当我尝试对 Outlook REST API 进行AJAX 调用时,我收到以下错误:

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

此外,我从AJAX 的error 函数回调中收到以下错误:

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);
        }
    });
}

我做错了什么??

【问题讨论】:

    标签: azure-active-directory adal office365api outlook-restapi office365-restapi


    【解决方案1】:

    最可能的答案是您的令牌没有适当的范围。在 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);
      }
    }
    

    【讨论】:

    • 我猜我得到的令牌是id_token 而不是access_token 用于访问 Outlook 邮件 API..我正确吗??
    • 是的,正确。我将使用一些我认为您缺少的代码来更新我的答案。
    • 我添加了该代码。但是,我收到ERROR: "Token renewal operation failed due to timeout" 错误。我搜索了这个错误并在上面的代码之前添加了ADALContext.handleWindowCallback(),但是,这会启动一个无限循环。我什至尝试从 chrome 开发工具中的local storage 中清除过期的id_tokens,仍然是同样的错误。我做错了什么??
    • 我会将handleWindowCallback 放在DOMContentLoaded 或$(document).ready 处理程序中。该方法的目的是将令牌保存在来自 Azure 的重定向中(如果它们存在),否则它不应该执行任何操作。不确定您的错误,您可能应该发布一个新问题并发布完整代码。
    【解决方案2】:

    我看到您遇到超时错误。我在超时方面遇到了完全相同的问题,我只能通过操作 adal.js 库来解决这个问题。在这个库中,有 6 秒的超时,对于在本地加载的某些应用程序来说似乎非常紧张。为了进行快速测试,您可以在 adal.js 中找到 LOADFRAME_TIMEOUT: '6000' 并将其替换为 LOADFRAME_TIMEOUT: '30000',这将为您提供 30 秒的时间来加载您的应用程序。我希望它对你有用!

    【讨论】:

      猜你喜欢
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 2016-05-02
      • 2017-01-04
      • 2023-03-08
      • 2012-08-23
      • 1970-01-01
      相关资源
      最近更新 更多