Eri*_*oto 6 local amazon-web-services amazon-cognito aws-lambda serverless
这是我们在Github上发现的一个问题,并且也有同样的问题:
我们使用 serverless 和 serverless-offline 在本地运行 lambda。我们有一个本地 DynamoDB 实施。然而,对于 Cognito,无服务器离线模拟经过身份验证的用户和 cognitoIdentityId。模拟用户有权调用 lambda,但无权传入 cognitoIdentityId 来匹配我们在 DynamoDB 中为用户保存的内容。
- 这可能是一个无服务器离线问题,并且可能还有其他更好的解决方案。
- 或者可能有一种在本地运行 Cognito 的方法。
- 或者我们可以从本地点击 Cognito。但我们不知道该怎么做。
太棒了;我不确定在授权者使用 Cognito 时在本地开发 labmda 的最佳实践是什么:aws_iam
尽管这可能对您的问题有帮助,也可能没有帮助,但这里介绍了如何在本地运行时模拟 Cognito。
每个 AWS 服务都接受配置。在此配置中您可以传递一个endpoint参数。您可以将本地服务器传递给此配置,并模拟每个 AWS 服务所需的响应。
export const getIdentityProvider = () => new CognitoIdentityServiceProvider({
region: process.env.AWS_REGION,
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
endpoint: process.env.IS_TEST ? 'http://localhost:5001' : null
})
Run Code Online (Sandbox Code Playgroud)
AWS 服务执行 POST 调用,其中您发送的日期作为正文,函数名称作为标x=amz-target头的一部分。例如,AdminGetUserCognito 调用具有标头:'x-amz-target': 'AWSCognitoIdentityProviderService.AdminGetUser'
您可以创建一个基本服务器来处理此问题,如下所示:
import http from 'http'
const getBody = async request => {
return new Promise((resolve, reject) => {
let body = ''
request.on('data', (data) => {
body += data
})
request.on('end', () => {
resolve(JSON.parse(body))
})
})
}
const server = http.createServer(async (req, res) => {
const body = await getBody(req)
const route = req.headers['x-amz-target']
let response
const status = 200
switch (route) {
case 'AWSCognitoIdentityProviderService.AdminGetUser':
response = { foo: 'bar' }
break
}
res.writeHead(response ? status : 404, { 'Content-Type': 'text/plain' })
res.write(response || 'No route found')
res.end()
})
server.listen(process.env.PORT || 5001, 'localhost', () => {
console.log(`Proxy server listening on port http://${server.address().address}:${server.address().port}`)
})
Run Code Online (Sandbox Code Playgroud)
为了知道返回什么,我建议进行一些单元测试并使用nock捕获响应。然后,您可以提取响应正文并在模拟服务器中使用它。
| 归档时间: |
|
| 查看次数: |
2801 次 |
| 最近记录: |