当前位置: 首页 > 知识库问答 >
问题:

通过Cloudformation声明的API网关Cognito授权程序需要从管理控制台部署才能正常工作

武向文
2023-03-14

我不理解我的API网关和Cognito用户池授权器的以下行为。使用AWS SAM模板,我部署了以下Cognito用户池:

  CognitoUserPoolClient:
    Type: AWS::Cognito::UserPoolClient
    Properties:
      UserPoolId: !Ref CognitoUserPool
      ClientName: !Sub CognitoUserPoolClient-${StageName}
      GenerateSecret: false
      SupportedIdentityProviders:
        - COGNITO
      ExplicitAuthFlows:
        - ALLOW_USER_PASSWORD_AUTH
        - ALLOW_CUSTOM_AUTH
        - ALLOW_REFRESH_TOKEN_AUTH
        - ALLOW_USER_SRP_AUTH
  OptalXCognitoUserPool:
    Type: AWS::Cognito::UserPool
    Properties:
      AutoVerifiedAttributes:
        - email
      EmailVerificationSubject: Verify your email.
      EmailVerificationMessage: Please click the link below to verify your email address. {####}
      EmailConfiguration:
        EmailSendingAccount: DEVELOPER
        From: Widgets Co <admin@widgets.com>
        ReplyToEmailAddress: admin@widgets.com
        SourceArn: !FindInMap [ StageMap, !Ref StageName, EmailSESArn ]
      UserPoolName: !Sub CognitoUserPool-${StageName}
      VerificationMessageTemplate:
        DefaultEmailOption: CONFIRM_WITH_LINK
      AdminCreateUserConfig:
        AllowAdminCreateUserOnly: true
        UnusedAccountValidityDays: 90
        InviteMessageTemplate:
          EmailMessage: ...
          EmailSubject: Welcome to Widgets Co!
          SMSMessage: Your username is {username} and temporary password is {####}.
      Policies:
        PasswordPolicy:
          MinimumLength: 8
      UsernameAttributes:
        - email
      Schema:
        - AttributeDataType: String
          Name: user_id
          Mutable: false
          DeveloperOnlyAttribute: false
        - Name: email
          Mutable: false
          Required: true

然后,我定义了一个API网关,它使用Cognito用户池作为其授权者:

  WidgetsAPI:
    Type: 'AWS::Serverless::Api'
    Name: WidgetsAPI
    Properties:
      GatewayResponses:
        EXPIRED_TOKEN:
          ResponseParameters:
            Headers:
              Fail-Reason: "'Expired token'"
              Access-Control-Allow-Origin: "'*'"
        DEFAULT_4xx:
          ResponseParameters:
            Headers:
              Access-Control-Expose-Headers: "'WWW-Authenticate'"
              Access-Control-Allow-Origin: "'*'"
        DEFAULT_5XX:
          ResponseParameters:
            Headers:
              Fail-Reason: "'Internal server error. Check logs.'"
              Access-Control-Allow-Origin: "'*'"
      Auth:
        DefaultAuthorizer: CognitoAuthorizer
        Authorizers:
          CognitoAuthorizer:
            UserPoolArn: !FindInMap [ StageMap, !Ref StageName, UserPoolArn ]
        AddDefaultAuthorizerToCorsPreflight: false

这里,我的userpoolarn在一个映射中,该映射根据我们所处的环境(stageprod)而有所不同。我定义了一堆endpoint,但为了演示起见,这里有一个叫做/users的endpoint。

注意-关于这个主题有几篇文章(这里、这里和这里),但没有一篇文章描述我的问题,这就是为什么我的API网关在第一次应用Cloudformation堆栈时返回401 unauthorized错误,并且只有在我从控制台手动部署整个API网关阶段之后才能正常工作。

共有1个答案

丌官炎彬
2023-03-14

向模板中添加AWS::Apigateway::Deployment资源。

ApiGatewayDeployment:
  DependsOn:
    - Function1Name
    - Thing2Name
  Type: AWS::ApiGateway::Deployment
  Properties:
    RestApiId: !Ref WidgetsAPI
    StageName: !Sub ApiGateway-${ApiGatewayStageName}

现在,SAM deploy将使api部署到“apigateway-loremipsum”

 类似资料:
  • 我正在尝试使用aws api网关授权器和cognito用户池。当我使用aws api网关控制台进行测试时,它工作得很好。 但当我尝试在api中启用授权时,它显示请查看下面的屏幕截图 有人能帮忙吗。

  • 我使用的是WebLogic10.3.5。当我在eclipse中本地部署Struts2应用程序时,它运行良好。当我试图通过管理控制台部署我的应用程序时,我得到了一个Struts 2错误,name not found for action。 当我看着这张照片的时候。war文件,它有所有的库和类。我按照以下说明通过管理控制台进行部署。我可以通过管理控制台成功地部署,但是当我尝试使用应用程序的测试链接时,

  • 我正在尝试运行以下网络应用程序 http://www.metaboanalyst.ca/faces/home.xhtml 它说将.war文件复制并粘贴到webapps/localhost(Tomcat)或通过GUI管理控制台(Glassfish)部署war文件。 但是我不知道我必须做什么,有人能帮我运行吗?我已经安装了其他需要的东西。

  • 我遵循的方法是,我为每组用户创建一个单独的Cognito用户池。 当用户登录时,他将通过适当的用户池进行身份验证。 为了调用后续的API,我计划使用Lambda Authorizer。 我遇到了下面的链接,以验证ID令牌。 https://github.com/awslabs/aws-support-tools/blob/master/cognito/decode-verify-jwt/decod

  • 我创建了一些Lambda函数,并使用SAM进行了部署。部署是成功的,但当试图到达endpoint时,我总是获得 即使我使用头发送正确的承载令牌。然后,如果我去Authorizer并运行测试,它会很好地通过并在CloudWatch中生成日志,但是当我从前端应用程序或REST客户端应用程序运行到endpoint的请求时,我会得到未经授权的消息,并且检查CloudWatch,就不会执行Authorize

  • 我是API网关的新手。我尝试使用“自定义授权程序”。我遵循了下面的文档,并使用了网站提供的示例代码。https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html “令牌类型的lambda授权者”是工作的。 但是... 我对“请求类型”感到困惑,不知道如何将quer