在部署的 AWS 环境中使用 cookie 时出现 CORS 问题

Posted

技术标签:

【中文标题】在部署的 AWS 环境中使用 cookie 时出现 CORS 问题【英文标题】:CORS issue when using cookie in deployed AWS environment 【发布时间】:2021-02-14 06:08:00 【问题描述】:

拥有一个使用 Nestjs、Express 和 GraphQL 的 nodejs 服务器,我使用以下配置服务器。

GraphqlOptions.ts

@Injectable()
export class GraphqlOptions implements GqlOptionsFactory 
  createGqlOptions(): Promise<GqlModuleOptions> | GqlModuleOptions 

  return 
        context: ( req, res ) => ( req, res ),
        autoSchemaFile: '/tmp/schema.graphql',
        playground: 
          endpoint: '/graphql',
        ,
        introspection: true,
        cors: 
          // Read that we should do this so GraphQL will not override the Express CORS configuration
        ,
      
    
  

main.ts

async function bootstrap() 
  const app = await NestFactory.create(AppModule)
  await app.listen(3000)

bootstrap()

index.ts

let cachedServer: Server

const bootstrapServer = async (): Promise<Server> => 
  const expressApp = express()
  expressApp.use(eventContext())
  const app = await NestFactory.create(
    AppModule,
    new ExpressAdapter(expressApp)
  )
  app.useGlobalPipes(new ValidationPipe())
  const corsOptions = 
    credentials: true,
    origin:  [`$process.env.WEB_APP_URL`],
    methods: 'GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS'
  
  app.enableCors(corsOptions)
  app.use(cookieParser())
  app.use(helmet())

  await app.init()
  return createServer(expressApp)


export const handler: APIGatewayProxyHandler = async (event, context) => 
  if (!cachedServer) 
    cachedServer = await bootstrapServer()
  
  return proxy(cachedServer, event, context, 'PROMISE').promise

并在 Reactjs 应用程序中使用以下内容配置 Apollo 客户端。

private readonly httpLink = createHttpLink(
    uri: 'https://theserver.yyy',
    credentials: 'include',
    fetch,
    fetchOptions: 
      credentials: 'include'
    
)

private readonly authLink = setContext((_,  headers ) => 
    return 
      headers: 
        ...headers,
        authorization: this.accessToken ? `Bearer $this.accessToken` : '',
      ,
    
)

this.apolloClient = new ApolloClient(
  cache: this.cache,
  link: this.authLink.concat(this.httpLink),
  connectToDevTools: true,
  credentials: 'include',
)

当在本地运行服务器 (localhost:4000) 和 Reactjs 应用程序 (localhost:3000) 时,一切正常,但从技术上讲,两者都来自同一个来源 (localhost),当应用程序部署时,服务器是 (theserver.yyy) 域和 reactjs (thewebap.ddd) 域结果在 Chrome 浏览器中收到以下内容。

Access to fetch at 'https://theserver.yyy/graphql' from origin 'https://thewebap.ddd' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: The value of the 'Access-Control-Allow-Credentials' header in the response is '' which must be 'true' when the request's credentials mode is 'include'.

和使用 Firefox 类似。

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://theserver.yyy/graphql. (Reason: expected ‘true’ in CORS header ‘Access-Control-Allow-Credentials’).

CORSAWS API Gateway 中启用。我很感激一些指导来学习如何允许 CORS 从我的 web 应用程序到服务器并了解一般的 CORS。具体来说,任何配置 nestjs GraphQL 的提示都值得赞赏。

【问题讨论】:

【参考方案1】:

解决方案是您需要在 GraphqlOptions 中传递 CORS 选项,而不是在 Express 配置中。

【讨论】:

以上是关于在部署的 AWS 环境中使用 cookie 时出现 CORS 问题的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 AWS CloudFront 时出现 CORS 客户端错误?

使用 AWS Elasticbeanstalk 部署 Django 应用程序时出现 WSGIPath 错误

AWS Elastic Beanstalk 使用 CLI 部署时出现 Botocore 错误

使用 elasticbeanstalk 部署 Flask 时出现 AWS mod_wsgi 错误

在 AWS EKS 上使用 Kubernetes 身份验证方法部署 Hashicorp Vault 时出现证书错误

Spring Boot版本升级-在aws elastic beanstalk中部署时出现mysql错误