typescript - 为什么未收到我的 x-functions-key Azure Function header ?

标签 typescript azure authentication azure-functions

我有一个用 Typescript 编写的 Azure 函数 ( "version": "[4.0.0, 5.0.0)" ),我正在尝试让 EasyAuth 正常工作。

我有 2 个函数: exec()login()exec()function级别的认证集,login()anonymous级别的认证集。

两者都按预期工作,exec() 返回 401 错误,login() 返回 200 成功响应。

在 Postman 中进行测试时,如果我使用 default 在 Url 中添加主机级别 ?code=<key> 功能键,exec() 方法将正确进行身份验证,并且我会收到 200 成功响应(如预期)。

但是,我想使用 header 选项进行身份验证,并添加了 x-functions-key header 标记,使用 URL 参数测试中使用的相同主机级功能键。我还想在 header 中传递一个附加的名称/值对,并在函数中访问它。我遵循的步骤与本教程一致:

http://dontcodetired.com/blog/post/Azure-HTTP-Function-Authorization-with-Function-Keys

https://damienbod.com/2020/08/17/securing-azure-functions-using-api-keys/

我什至创建了一个新的自定义 key ,其结果与上面相同(URL 参数测试成功, header x-functions-key 测试失败)。

我怀疑 header 在到达 Azure 函数之前已被过滤掉。为了测试这一点,我对 login() 进行相同的基于 header 的调用,并将上下文和请求对象写入 context.log :

2023-08-22T20:06:47Z   [Information]   Request!!!! HttpRequest { query: URLSearchParams {}, params: {} }
2023-08-22T20:06:47Z   [Information]   context!!!! InvocationContext {
  invocationId: 'f05f6245-b681-4aad-bff6-60fcbe3b68de',
  functionName: 'login',
  extraInputs: InvocationContextExtraInputs {},
  extraOutputs: InvocationContextExtraOutputs {},
  retryContext: undefined,
  traceContext: {
    traceParent: '00-c92a4b542b0bb1a0e4635361dfc636ff-703d73ec197fc2e1-00',
    traceState: '',
    attributes: {}
  },
  triggerMetadata: undefined,
  options: {
    trigger: {
      authLevel: 'anonymous',
      methods: [Array],
      route: undefined,
      type: 'httpTrigger',
      name: 'httpTrigger3',
      direction: 'in'
    },
    return: { type: 'http', name: '$return', direction: 'out' },
    extraInputs: [],
    extraOutputs: []
  }
}
2023-08-22T20:06:47Z   [Information]   Executed 'Functions.login' (Succeeded, Id=f05f6245-b681-4aad-bff6-60fcbe3b68de, Duration=66ms)

在此输出中,我希望在上面的输出中看到 x-functions-key 和我的其他 hello/world header 值。

我确实找到了一篇文章描述了可能的解决方案:

Why is my header data missing from my Azure Function Http Trigger in .Net 5 when calling from HttpClient.GetAsync

我已将 Access-Control-Expose-Headers 添加到我的 host.json 并重新部署,但没有什么区别。例如:

  "extensions": {
    "http": {
      "customHeaders": {
        "Access-Control-Expose-Headers": "*"
      }
    }
  }

为什么 Azure Function EasyAuth 不与 x-functions-key 一起使用(它与 URL 参数选项一起使用)?

...为什么 header 值根本没有传入 login() 函数?

------更新------

好的,我的非 x-functions-key header 现在已经通过了。我发现(使用 VS Code 中的 Typescripts 自动完成功能)您可以从请求中查询其他成员):

context.log('Request.headers', request.headers);

产生以下输出:

2023-08-22T22:48:07Z   [Information]   Request.headers HeadersList {
  cookies: null,
  [Symbol(headers map)]: Map(24) {
    'accept' => { name: 'accept', value: '*/*' },
    'host' => { name: 'host', value: 'fxa-sitemap40-dev-eas.azurewebsites.net' },
    'max-forwards' => { name: 'max-forwards', value: '8' },
    'user-agent' => { name: 'user-agent', value: 'PostmanRuntime/7.32.3' },
    'traceparent' => {
      name: 'traceparent',
      value: '00-4ef804db4293ee5ddc9810ed3b690143-b390f556c4d90053-00'
    },
    'aiden-test' => { name: 'aiden-test', value: 'hoihoi' },
    'postman-token' => {
      name: 'postman-token',
      value: '23456f99-8979-4ee4-860e-f1a4cba067cf'
    },
    'x-arr-log-id' => {
      name: 'x-arr-log-id',
      value: '87e6b362-02d7-4b9b-87bb-a91e57601d52'
    },
    'client-ip' => { name: 'client-ip', value: '10.0.32.9:61024' },
    'x-site-deployment-id' => { name: 'x-site-deployment-id', value: 'fxa-sitemap40-dev-eas' },
    'was-default-hostname' => {
      name: 'was-default-hostname',
      value: 'fxa-xxxxxxxx-dev-eas.azurewebsites.net'
    },
    'x-forwarded-proto' => { name: 'x-forwarded-proto', value: 'https' },
    'x-appservice-proto' => { name: 'x-appservice-proto', value: 'https' },
    'x-arr-ssl' => {
      name: 'x-arr-ssl',
      value: '2048|256|CN=Microsoft Azure TLS Issuing CA 01, O=Microsoft Corporation, C=US|CN=*.azurewebsites.net, O=Microsoft Corporation, L=Redmond, S=WA, C=US'
    },
    'x-forwarded-tlsversion' => { name: 'x-forwarded-tlsversion', value: '1.2' },
    'x-forwarded-for' => {
      name: 'x-forwarded-for',
      value: '1.145.212.27:2907, 13.75.34.193:29415'
    },
    'x-original-url' => { name: 'x-original-url', value: '/api/login' },
    'x-waws-unencoded-url' => { name: 'x-waws-unencoded-url', value: '/api/login' },
    'x-ms-original-url' => {
      name: 'x-ms-original-url',
      value: 'https://xxx.yyyy.app/api/login'
    },
    'x-ms-request-id' => {
      name: 'x-ms-request-id',
      value: '87e6b362-02d7-4b9b-87bb-a91e57601d52'
    },
    'x-ms-auth-token' => {
      name: 'x-ms-auth-token',
      value: 'Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IasdfasdfasdfggfhasdfasdfEREMkQxNzg2RTIwNTVBMkY5NjYxMUEiLCJ0eXAiOiJKV1QifQ.eyJwcm4iOksrebjzYkE9PSIsInN1YiI6ImFub255bW91cyIsImlzcyI6Imh0dHBzOi8vYmx1ZS13YXZlLTA3MjBkM2UwMC4zLmF6dXJlc3RhdGljYXBwcy5uZXQvLmF1dGgiLCJhdWQiOiJodHRwczovL2Z4YS1zaXRlbWFwNDAtZGV2LWVhcy5henVyZXdlYnNpdGVzLm5ldCIsIm5iZiI6MTY5Mjc0NDQ4NiwiZXhwIjoxNjkyNzQ0Nzg2LCJpYXQiOjE2OTI3NDQ0ODZ9.KYE8fpMxws_ZqEdTL1l459yjy8RQ0LlhKQJI9SdUJhaB2HnW9NLsBWJKkLzA2f66k0uMQ7YEabekFaoDAfyKDwvDkF2vSnTj7wGKaMM6BiOFTAs1tgTfrgz8IlwEfhzl9fcMA208oefNkDpvRyNufLeVGr_NKtlfEKRm1w7gIm24pD5fiuLkQIBvtDJov2ow7RPAXDkQa7V2Xf5CAcOlE27qz2WQVtEL76HEIFb6z07O2HZg8Q99SuLdna0QLpnn1pk85W2eVkJVTbGjjkf5k_t3K8Fy6e5uu9knDKNud5_prr4zJ3hLmUW7Gsxhruz8OY_DjiPfN02VV4a14NX5yQ'
    },
    'disguised-host' => {
      name: 'disguised-host',
      value: 'fxa-xxxxxx-dev-eas.azurewebsites.net'
    },
    'x-ms-client-principal-id' => { name: 'x-ms-client-principal-id', value: 'anonymous' },
    'x-ms-client-principal-idp' => { name: 'x-ms-client-principal-idp', value: 'azureStaticWebApps' }
  },
  [Symbol(headers map sorted)]: null
}

我认为它是一个 x-ms-auth-token,我怀疑它以某种方式取代了 x-functions-key。我将开始对此进行调查。

最佳答案

好吧,我认为没有必要提及(但确实如此)。我将函数附加到 Azure 静态 Web 应用程序 (SWA)。如本页帖子所示:

https://learn.microsoft.com/en-au/azure/static-web-apps/functions-bring-your-own

参见:

enter image description here

SWA 的身份验证配置在函数应用之上提供了一个重定向层。这是修改 header 并将其与 x-ms-auth-token 值中的托管身份 token 进行交换。

函数应用程序的身份验证边栏选项卡中的信息给出了进一步调查内容的提示:

enter image description here

正如说明所解释的,您需要通过 API 的 SWA 来调用函数。

关于typescript - 为什么未收到我的 x-functions-key Azure Function header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76956684/

相关文章:

azure - 连接到 Azure 缓存服务大约需要 3.3 秒

c# - 从 Azure FTP 传输到另一个 FTP 站点时出现问题

API 身份验证设计和可破解性

angular - 使用 Moment Js 在 Angular 中显示日历 View

javascript - 如何在 Typescript 的 Angular 指令类中添加 Controller

Azure 云服务和 Web 作业

ruby-on-rails - 在 Rails 中使用 devise 时,如何添加将以两种不同方式使用该网站的两种不同类型的用户?

angular - new Worker() 只有在传递一个字符串时才会被捆绑

angular - @Input未从父组件接收数据

authentication - Grails spring security LDAP 从 LDAP 基础获取 ROLE