我正在为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脚本查找基于身份令牌的更多用户详细信息?
答案 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;
}
})
}