Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用adal节点授予对公共数据服务的访问权限_Node.js_Oauth_Azure Active Directory_Adal_Common Data Service - Fatal编程技术网

Node.js 使用adal节点授予对公共数据服务的访问权限

Node.js 使用adal节点授予对公共数据服务的访问权限,node.js,oauth,azure-active-directory,adal,common-data-service,Node.js,Oauth,Azure Active Directory,Adal,Common Data Service,无法授予使用NodeJS访问公共数据服务的权限 我正在实现一个简单的节点函数,它将从公共数据服务中获取一些数据。我已经可以获取accessToken,但是当我使用此accessToken访问公共数据服务时,响应为“未经授权” 我按照这里的说明()操作,并且能够使用简单的页面应用程序进行操作 我只想将其移植到节点,让应用程序授予对公共数据服务的访问权限,而无需用户登录 const fetch = require('node-fetch'); const AuthenticationContext

无法授予使用NodeJS访问公共数据服务的权限

我正在实现一个简单的节点函数,它将从公共数据服务中获取一些数据。我已经可以获取accessToken,但是当我使用此accessToken访问公共数据服务时,响应为“未经授权”

我按照这里的说明()操作,并且能够使用简单的页面应用程序进行操作

我只想将其移植到节点,让应用程序授予对公共数据服务的访问权限,而无需用户登录

const fetch = require('node-fetch');
const AuthenticationContext = require('adal-node').AuthenticationContext;

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    const resource = "https://my-org.crm5.dynamics.com";
    const clientId = 'my client id';
    const clientSecret = 'my client secret';
    const authorityHostUrl = 'https://login.microsoftonline.com';
    const tenant = 'my-tenant-name.onmicrosoft.com'; // AAD Tenant name.
    const authorityUrl = authorityHostUrl + '/' + tenant;

    const authContext = new AuthenticationContext(authorityUrl);

    const tokenResp = await new Promise((resolve, reject) => {
        authContext.acquireTokenWithClientCredentials(resource, clientId, clientSecret, function (err, tokenResponse) {
            if (err) {
                context.error("cannot get token: " + err.stack);
                return reject(err.stack);
            } else {
                return resolve(tokenResponse);
            }
        });
    });

    context.log("tokenResp: ", tokenResp); // The tokenResp contains accessToken

    const cdsHeaders = {};
    cdsHeaders["Authorization"] = "Bearer " + tokenResp.accessToken;
    cdsHeaders["Accept"] = "application/json";
    cdsHeaders["Content-Type"] = "application/json; charset=utf-8";
    cdsHeaders["OData-MaxVersion"] = "4.0";
    cdsHeaders["OData-Version"] = "4.0";

    const endpointUrl = encodeURI(resource + "/api/data/v9.0/accounts?$select=name,address1_city&$top=10");
    const dataResponse = await fetch(endpointUrl, { method: 'GET', headers: cdsHeaders });

    console.log("response: ", dataResponse); // The dataResponse is 401 Unauthorized

    context.res = { body: "Done" };
};

我得到了解决方案:我必须“手动为应用程序用户创建一张CD”,以使其工作,关于此文档:

尽管示例代码是用C#编写的,但C#和Node.js客户端之间没有太多差异