Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.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
在javascript Azure函数内调用图形API_Javascript_Azure Functions_Microsoft Graph Api - Fatal编程技术网

在javascript Azure函数内调用图形API

在javascript Azure函数内调用图形API,javascript,azure-functions,microsoft-graph-api,Javascript,Azure Functions,Microsoft Graph Api,我对Azure功能非常陌生。我试图在javascript中使用HTTP触发的Azure函数中的图形API。 我发现很少有文件与这个论点相关。这里还有几个关于堆栈溢出的问题,但是所有的材料都非常陈旧,从那时起Graph和Azure函数都有所改进。 当我刚刚创建函数时,它工作得非常好。如果我简单地将一个绑定添加到Auth Token(),而不涉及index.js,那么函数将停止工作并返回404错误(找不到文件)。连接尝试甚至未登录到monitor或Applications Insights。我直接从

我对Azure功能非常陌生。我试图在javascript中使用HTTP触发的Azure函数中的图形API。 我发现很少有文件与这个论点相关。这里还有几个关于堆栈溢出的问题,但是所有的材料都非常陈旧,从那时起Graph和Azure函数都有所改进。 当我刚刚创建函数时,它工作得非常好。如果我简单地将一个绑定添加到Auth Token(),而不涉及index.js,那么函数将停止工作并返回404错误(找不到文件)。连接尝试甚至未登录到monitor或Applications Insights。我直接从Azure门户构建该功能(无本地部署)。我已经在AAD上创建了一个应用程序,并将我的功能应用程序上的身份验证更改为连接到此应用程序。还授权Microsoft Graph上的Azure用户(通过Graph Explorer),但仍会收到此404错误。我应该检查什么

根据Tony Ju的答案进行编辑:

我关闭了应用程序服务身份验证,并按照建议的步骤操作。我只是做了一些改动,让它在Azure函数中工作(这篇文章是针对纯Node.js的)。实际上,这是我的index.js:

const APP_ID = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX';
const APP_SECERET = 'XXXX~-XXX~XXXXXXXXXXXXX~XXXXXXXXX~';
const TOKEN_ENDPOINT ='https://login.microsoftonline.com/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/oauth2/v2.0/token';
const MS_GRAPH_SCOPE = 'https://graph.microsoft.com/.default';

const axios = require('axios');
const qs = require('qs');

const postData = {
  client_id: APP_ID,
  scope: MS_GRAPH_SCOPE,
  client_secret: APP_SECERET,
  grant_type: 'client_credentials'
};


module.exports = function (context, req) {
    axios.defaults.headers.post['Content-Type'] =
  'application/x-www-form-urlencoded';

    let token = '';

    axios
    .post(TOKEN_ENDPOINT, qs.stringify(postData))
    .then(response => {
        context.log(response.data);
    })
    .catch(error => {
        context.log(error);
    });
};
XXXX分别取自AAD应用程序:应用程序(客户端)ID、应用程序客户端机密和目录(租户)ID

My function.json如下所示:

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    },
    {
      "name": "graphToken",
      "direction": "in",
      "type": "token",
      "resource": "https://graph.microsoft.com",
      "identity": "userFromRequest"
    }
  ]
}
仍然得到404错误。似乎与代码无关,但与函数绑定有关

在Tony Ju的新评论和进一步实验后编辑:

感谢Tony:授权绑定是不必要的

还需要转到功能应用程序服务,然后转到控制台(在开发工具下)并发布

npm install axios
npm install qs
另外,在我前面的index.js清单中,函数需要是异步的:

module.exports = async function (context, req) {
这样,它就工作了。谢谢你,托尼

我已经在AAD上创建了一个应用程序,并更改了我的应用程序的身份验证 功能应用程序以连接到此应用程序

根据您的描述,您已启用对功能的身份验证。在这种情况下,您可以参考答案


如果不想向函数添加身份验证,而只想在函数中调用Microsoft API。你可以用。请参考我的答案。

谢谢托尼。我已经试过你的第一个解决方案了,但是我错过了第二个。我现在试着跟着第二个,但没有运气。请参阅问题中的我的编辑。@Massimo
{“名称”:“graphToken”,“方向”:“in”,“键入”:“令牌”,“资源”:https://graph.microsoft.com“,”标识“:”userFromRequest“}
不需要。你需要删除它,你是对的。删除它,并通过控制台(npm安装)安装axios和qs模块。现在这个函数几乎可以工作了。它将令牌输出到控制台,但在5分钟后超时(Azure函数限制)。还添加了context.res={body:“OK”};以满足输出绑定,但结果仍然相同。我想我在函数设置中缺少了一些内容。我发现了问题:函数需要异步。