我正在尝试使用node-outlook库创建一个NodeJS守护程序/服务应用程序来访问Office 365邮件/联系人。 我能够创建Office 365试用版订阅并注册我的应用程序。所以现在我可以访问我的应用程序的端点URL,客户端ID和客户端密钥。 这是我的代码:
var outlook = require("node-outlook");
var token;
process.env.DEBUG = true;
var fs = require('fs');
var credentials = {
clientID: "<id>",
clientSecret: "<secret>",
site: "https://login.microsoftonline.com/<my-tenant-id>",
authorizationPath: "/oauth2/authorize",
tokenPath: "/oauth2/token",
useBasicAuthorizationHeader: false,
rejectUnauthorized: false,
ca: fs.readFileSync('pki/some.pem', { encoding: 'ascii' }),
};
var oauth2 = require('simple-oauth2')(credentials);
oauth2.client.getToken({}, saveToken);
function saveToken(error, result) {
if (error) {
console.log('Access Token Error: ', error);
return;
}
token = oauth2.accessToken.create(result);
var outlookClient = new outlook.Microsoft.OutlookServices.Client(
'https://outlook.office365.com/api/v1.0',
getAccessToken);
outlookClient.me.folders.getFolder('Inbox').messages.getMessages().fetchAll(10).then(
function (result) {
console.log('Success: ', result);
},
function (error) {
console.log('Error: ', error);
console.log('Headers: ', error.getAllResponseHeaders());
});
}
function getAccessToken() {
var deferred = new outlook.Microsoft.Utility.Deferred();
if (token.expired()) {
token.refresh(function (error, result) {
if (error) {
console.log("Refresh token error: ", error.message);
}
token = result;
deferred.resolve(token.token.access_token);
});
}
else {
deferred.resolve(token.token.access_token);
}
return deferred;
}
这就是结果:
Error: { UNSENT: 0,
OPENED: 1,
HEADERS_RECEIVED: 2,
LOADING: 3,
DONE: 4,
readyState: 4,
onreadystatechange: [Function],
responseText: '',
responseXML: '',
status: 401,
statusText: null,
open: [Function],
setDisableHeaderCheck: [Function],
setRequestHeader: [Function],
getResponseHeader: [Function],
getAllResponseHeaders: [Function],
getRequestHeader: [Function],
send: [Function],
handleError: [Function],
abort: [Function],
addEventListener: [Function],
removeEventListener: [Function],
dispatchEvent: [Function] }
Headers: content-length: 0
server: Microsoft-IIS/8.0
request-id: 07931460-4fbf-4028-bc7b-fe350c240a1b
x-calculatedbetarget: BLUPR10MB0594.namprd10.prod.outlook.com
x-backendhttpstatus: 401
x-ms-diagnostics: 2000010;reason="The access token is acquired using an authenti
cation method that is too weak to allow access for this application. Presented a
uth strength was 1, required is 2.";error_category="insufficient_auth_strength"
x-diaginfo: BLUPR10MB0594
x-beserver: BLUPR10MB0594
x-powered-by: ASP.NET
x-feserver: CY1PR01CA0008
www-authenticate: Bearer client_id="00000002-0000-0ff1-ce00-000000000000", trust
ed_issuers="00000001-0000-0000-c000-000000000000@*", token_types="app_asserted_u
ser_v1", authorization_uri="https://login.windows.net/common/oauth2/authorize",
error="invalid_token",Basic Realm="",Basic Realm=""
date: Mon, 29 Jun 2015 18:34:32 GMT
connection: close
我已尝试使用“凭据”的“ca”属性的PEM格式的不同证书。错误是一样的。
首先,我可以使用自行发布的PKI证书吗? PKI证书有哪些要求,以便它们可以与Azure AD一起使用?我使用SHA1算法和2048位加密。这些就够了吗?
我还查看了simple-oauth2库的源代码,发现“ca”是唯一可以用于PKI设置的选项。它被明确检查。所有其他PKI相关的nodejs https选项(cert,key,passphrase,...)都被忽略,永远不会到达实际的请求代码。
我是唯一一个遇到这个问题的人吗?
答案 0 :(得分:4)
错误是因为在auth请求中使用了秘密而不是cert。在您的情况下,您根本不想使用秘密。这听起来像是真正的问题,如果simple-oauth2
库将处理将auth请求转换为Azure期望的格式。格式的血腥细节如下:Office 365 Rest API - Daemon week authentication。
我查看了README for simple-oauth2
,他们的客户端凭据流示例使用了秘密而不是基于证书的断言。查看配置代码我没有看到在那里执行任何基于证书的身份验证的能力,因此这个库可能不适用于这种情况(除非我错过了它)。
更新:好消息是adal-node library确实支持使用证书,而且使用起来相当容易。棘手的部分是让证书得到解决。
我已经开始了一个示例Node.js脚本,您可以在此处找到它:https://github.com/jasonjoh/node-service。到目前为止,它只使用Azure中的证书检索令牌。 README具有我完成的所有步骤,以便整理出证书。