具有无服务器本地环境的 AWS Cognito

Eri*_*oto 6 local amazon-web-services amazon-cognito aws-lambda serverless

这是我们在Github上发现的一个问题,并且也有同样的问题:

我们使用 serverless 和 serverless-offline 在本地运行 lambda。我们有一个本地 DynamoDB 实施。然而,对于 Cognito,无服务器离线模拟经过身份验证的用户和 cognitoIdentityId。模拟用户有权调用 lambda,但无权传入 cognitoIdentityId 来匹配我们在 DynamoDB 中为用户保存的内容。

  1. 这可能是一个无服务器离线问题,并且可能还有其他更好的解决方案。
  2. 或者可能有一种在本地运行 Cognito 的方法。
  3. 或者我们可以从本地点击 Cognito。但我们不知道该怎么做。

太棒了;我不确定在授权者使用 Cognito 时在本地开发 labmda 的最佳实践是什么:aws_iam

cyb*_*bat 2

尽管这可能对您的问题有帮助,也可能没有帮助,但这里介绍了如何在本地运行时模拟 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捕获响应。然后,您可以提取响应正文并在模拟服务器中使用它。