此问题基于How to get Microsoft Graph API Access token from Node Script?,但是,作为第一次使用该软件的人,我对在该线程中接受的答案进行评论没有必要的声誉。
问题是,我试图实现已接受答案所建议的方法,但是在某些地方出错了。以下代码是异步函数的一部分,我已经可以告诉您ONEDRIVE_TENANT_URI is
的格式为XXX.onmicrosoft.com
。
const endpoint = `https://login.microsoftonline.com/${process.env.ONEDRIVE_TENTANT_URI}/oauth2/token`;
const requestParams = {
grant_type: "client_credentials",
client_id: process.env.ONEDRIVE_APP_ID,
client_secret: process.env.ONEDRIVE_CLIENT_SECRET,
resource: "https://graph.windows.net"
};
const authResponse = await request.post({
url: endpoint,
form: requestParams
});
authResponse
作为其主体,只是一个字符串,上面已填写了requestParams。
如果我通过邮递员提交发帖请求,并使用与x-www-form-urlencoded
相同的参数,则会在响应正文中收到access_token
。
那么...我该怎么办?也许-但我不这么认为-这是因为此功能是由(出于测试目的)具有JSON格式主体的POSTMAN GET请求调用的?
答案 0 :(得分:1)
您可以下载示例here。并在config.js
中填写凭据。您可以从Azure门户中找到它们。
这是获取访问令牌的代码。
auth.getAccessToken = function () {
var deferred = Q.defer();
// These are the parameters necessary for the OAuth 2.0 Client Credentials Grant Flow.
// For more information, see Service to Service Calls Using Client Credentials (https://msdn.microsoft.com/library/azure/dn645543.aspx).
var requestParams = {
grant_type: 'client_credentials',
client_id: config.clientId,
client_secret: config.clientSecret,
resource: 'https://graph.microsoft.com'
};
// Make a request to the token issuing endpoint.
request.post({ url: config.tokenEndpoint, form: requestParams }, function (err, response, body) {
var parsedBody = JSON.parse(body);
console.log(parsedBody);
if (err) {
deferred.reject(err);
} else if (parsedBody.error) {
deferred.reject(parsedBody.error_description);
} else {
// If successful, return the access token.
deferred.resolve(parsedBody.access_token);
}
});
return deferred.promise;
};
答案 1 :(得分:0)
您遇到了两个问题。
第一个不是还的问题,但是一旦您尝试调用Microsoft Graph,它就会成为问题。 resource
应该是graph.microsoft.net
,不是 graph.windows.net
。 graph.windows.net
指的是旧版Azure AD Graph API,而不是Microsoft Graph。
另一个导致此错误的根本原因是await request.post
。请求本身不支持诺言。从请求documentation:
request
本机支持流接口和回调接口。如果您希望request
返回一个Promise,则可以为request
使用备用接口包装器。如果您更喜欢使用Promises,或者您想在ES2017中使用async
/await
,这些包装器将非常有用。请求团队提供了多个备用接口,包括:
request-promise
(使用Bluebird承诺)request-promise-native
(使用本地Promises)request-promise-any
(使用any-promise承诺)