service - Outlook JS 插件:来自令牌的凭据(本地交换,不是 OAuth)
问题描述
由于 Office API 中消息大小的限制,我正在尝试构建一个服务:
- Office 客户端获取身份令牌 (getCallbackTokenAsync)
- 将包含身份令牌的消息发布到服务
- 服务使用新的令牌凭证创建新的新交换服务
限制:
- EWS 服务器在本地,目前无法使用 OAuth
- 我目前将其用作 RESTful 服务
我已经尝试过 getUserIdentityToken,但这对凭据没有用。
Office JS 调用
var _appName;
var _mailbox;
var _emailAddress;
var _itemId;
var _identityToken;
var _ewsUrl;
app.initialize();
_mailbox = Office.context.mailbox;
var item = _mailbox.item;
_itemId = item.itemId;
_ewsUrl = _mailbox.ewsUrl;
_emailAddress = _mailbox.userProfile.emailAddress;
function MakeRequest(serviceUrl, callType, format) {
_mailbox.getCallbackTokenAsync(function (asyncResult) {
if (asyncResult.error) {
app.showNotification(_appName, "Error getting Use Identity Token: " + asyncResult.error.message);
}
else {
_identityToken = asyncResult.value;
var correctedItemId = _itemId.replace("+", "_");
var request = { ItemId: correctedItemId, UserEmailAddress: _emailAddress, UserIdentityToken: _identityToken, EwsUrl: _ewsUrl, AudienceUrl: _audUrl, ReturndNewId: false };
$.ajax({
crossDomain: true,
url: serviceUrl,
type: callType,
data: JSON.stringify(request),
contentType: 'application/json; charset=utf-8',
dataType: format,
success: function (asyncResultSuccess) {
LogResult(asyncResultSuccess.statusText);
//app.showNotification(_appName, asyncResultSuccess.statusText);
},
error: function (asyncResultError) {
LogResult(asyncResultError.statusText);
//app.showNotification(_appName, asyncResultError.statusText);
}
});
}
});
}
服务器端凭据:
void LoadSimple()
{
try
{
service = new ExchangeService(ExchangeVersion.Exchange2013_SP1)
{
Credentials = new TokenCredentials(RequestProperties.UserIdentityToekn),
Url = new Uri(RequestProperties.EwsUrl)
};
ReturnProps = new EwsReturnItem();
}
catch (Exception ex)
{
log.Error(string.Format("{0}: {1}", MethodBase.GetCurrentMethod().Name, ex.Message));
}
}
服务器端转发消息:
public EwsReturnItem Forward(string toRecipient, string ccRecipient, string subjectPrepend, string bodyText)
{
try
{
var correctedId = CorrectItemId(RequestProperties.ItemId);
EmailMessage email = EmailMessage.Bind(service, correctedId, new PropertySet(ItemSchema.MimeContent, ItemSchema.Subject));
ResponseMessage forwardMessage = email.CreateForward();
forwardMessage.Subject = String.Format("{0}{1}", subjectPrepend, email.Subject);
forwardMessage.ToRecipients.Add(toRecipient);
forwardMessage.CcRecipients.Add(ccRecipient);
forwardMessage.BodyPrefix = bodyText;
...snip
}
catch (Exception ex)
{
log.Error(string.Format("{0}: {1}", MethodBase.GetCurrentMethod().Name, ex.Message));
return new EwsReturnItem() { StatusText = ex.Message };
}
}
它在这条线上因未经授权而失败:
EmailMessage email = EmailMessage.Bind(service, correctedId, new PropertySet(ItemSchema.MimeContent, ItemSchema.Subject));
解决方案
推荐阅读
- python - 如何使用 python 更改 csv 文件的分隔符,同时剥离新分隔符的字段?
- r - 求解 R 中的线性方程组
- ios - 从 firebase 获取的图像在将它们添加到 tableViewCells 的过程中重复?
- php - PHP:通过 CLI 运行 cronjob 时,MySQLi 查询返回 false 和 null 错误,但如果通过 Web 服务器调用脚本则有效
- javascript - 当这是不同的范围时,如何从对撞机方法调用类中的函数?
- bash - 识别进程是否被 bash 中的信号杀死
- android - 如何永久禁用汽车模式?
- python - 相当于 SQL 的 Pandas 不存在子查询
- ruby-on-rails - Rails active_storage 与 rails api
- ruby-on-rails - JSON 负载中嵌套资源的不允许参数