如何从Exchange身份令牌获取用户名?

时间:2016-06-17 11:56:04

标签: outlook-addin office365api

我正在为Office365 / Outlook编写一个加载项。加载项在Web服务器上运行,该服务器提供来自第三方系统的信息。我需要确保它只显示与登录的用户名(或电子邮件地址)相关的信息。我已经使用Microsoft提供的PHP示例代码成功发送并验证了我的服务器上的Exchange身份令牌: https://dev.office.com/docs/add-ins/outlook/use-php-to-validate-an-identity-token

我的问题是身份令牌不包含任何用户名或电子邮件地址,我最接近的是" msexchuid",但我无法理解该数字用户标识符第三方系统。

在客户端,加载项javascript可以通过" Office.context.mailbox.userProfile"获取用户名和电子邮件,但我不想将其转发到我的Web服务器因为它可能是伪造的。

有没有办法让身份令牌包含用户名/电子邮件(这会很棒!),或者是否可以从我的Web服务器的服务器端PHP脚本查找基于身份令牌的更多用户详细信息?

1 个答案:

答案 0 :(得分:0)

id令牌用于与第三方应用程序集成以进行SSO。正如您所提到的,它只包含一个唯一的Exchange ID。

作为一种解决方法,我们可以通过getCallbackTokenAsync方法直接从回调令牌中获取包含SMTP地址的方法。为了验证回调令牌,我们可以验证是否可以使用EWS获取项目信息。

例如,回调令牌中有'parentItemId'。由于存在JWT令牌,因此将回调令牌中的声明检索为id令牌是相同的。您可以参考here了解更多详情。

然后我们可以使用以下代码从EWS获取项目信息:

   public bool Post([FromBody]EWSRequest request)
   {
        ExchangeService service = new ExchangeService();
        service.Credentials = new OAuthCredentials(request.token);
        service.Url = new Uri(request.ewsURL);

        //get item id from callback token
        var itemId = "";
        Item item = Item.Bind(service, itemId);

        var subject = item.Subject;
        return subject.Length>0;
   }

   public class EWSRequest
   {
        public string token;
        public string ewsURL;
   }

JavarScript:

Office.context.mailbox.getCallbackTokenAsync(getCallbackTokenCallback)

function getCallbackTokenCallback(asyncResult) {
    var _token = asyncResult.value;
    var _ewsURL = Office.context.mailbox.ewsUrl;

    var serviceEndpoint = "https://localhost:44300/API/token/"

    var postData={ token: _token, ewsURL: _ewsURL }
    $.ajax({
        url: serviceEndpoint,
        type: "post",
        contentType: "application/json",
        data: JSON.stringify(postData),
        success: function (result) {
            var ret = result;
        }
    })
}