繁体   English   中英

尝试提取用户电子邮件时出现Outlook REST API 403错误

[英]Outlook REST API 403 error while trying to fetch user emails

我正在尝试使用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);
        }
    });
}

我究竟做错了什么??

最可能的答案是您的令牌没有适当的范围。 https://jwt.io解析令牌,然后查看scp声明中的内容。

看来您缺少对AcquireToken的呼叫。 login方法仅用于login用户并获取其身份,它不提供访问令牌。 您需要这样的东西:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM