我有一个用 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 值。
我确实找到了一篇文章描述了可能的解决方案:
我已将 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
参见:
SWA 的身份验证配置在函数应用之上提供了一个重定向层。这是修改 header 并将其与 x-ms-auth-token
值中的托管身份 token 进行交换。
函数应用程序的身份验证边栏选项卡中的信息给出了进一步调查内容的提示:
正如说明所解释的,您需要通过 API 的 SWA 来调用函数。
关于typescript - 为什么未收到我的 x-functions-key Azure Function header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76956684/