Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Express-session不设置cookie?

Express-session不设置cookie?
EN

Stack Overflow用户
提问于 2021-09-26 01:13:32
回答 2查看 687关注 0票数 1

我跟着Ben Awad's 13-hour Fullstack React GraphQL TypeScript Tutorial走,在设置登录cookie时遇到了一堵墙(aprx在1:50:00)。

我想我成功地连接到了redis,设置了express-session并设置了请求类型,但是在graphql沙箱中,我在Inspect->Application中看不到我的cookie (名为'qid')。

index.ts

代码语言:javascript
运行
AI代码解释
复制
import { MikroORM } from "@mikro-orm/core";
import { __prod__ } from "./constants";
import microConfig from "./mikro-orm.config";
import express from "express";
import { ApolloServer } from "apollo-server-express";
import { buildSchema } from "type-graphql";
import { HelloResolver } from "./resolvers/hello";
import { PostResolver } from "./resolvers/post";
import { UserResolver } from "./resolvers/user";
import redis from "redis";
import session from "express-session";
import connectRedis from "connect-redis";

const main = async () => {
  const orm = await MikroORM.init(microConfig);
  await orm.getMigrator().up();

  const app = express();

  const RedisStore = connectRedis(session);
  const redisClient = redis.createClient();

  app.use(
    session({
      name: "qid",
      store: new RedisStore({
        client: redisClient,
        disableTouch: true,
      }),
      cookie: {
        maxAge: 1000 * 60 * 60 * 24 * 365 * 10,
        httpOnly: true,
        sameSite: "none",
        // secure: __prod__,
      },
      saveUninitialized: false,
      secret: "dfhfdjkgfkbjktzkzf",
      resave: false,
    })
  );

  app.use(function (req, res, next) {
    res.header(
      "Access-Control-Allow-Origin",
      "https://studio.apollographql.com"
    );
    res.header("Access-Control-Allow-Credentials", "true");
    next();
  });

  const apolloServer = new ApolloServer({
    schema: await buildSchema({
      resolvers: [HelloResolver, PostResolver, UserResolver],
      validate: false,
    }),
    context: ({ req, res }) => ({ em: orm.em, req, res }),
  });

  await apolloServer.start();
  apolloServer.applyMiddleware({
    app,
    cors: {
      credentials: true,
      origin: new RegExp("/*/"),
    },
  });

  app.listen(4000, () => {
    console.log("server started on port 4000");
  });
};

main();

types.ts

代码语言:javascript
运行
AI代码解释
复制
import { EntityManager, IDatabaseDriver, Connection } from "@mikro-orm/core";
import { Request, Response } from "express";
import { Session, SessionData } from "express-session";

export type MyContext = {
  em: EntityManager<any> & EntityManager<IDatabaseDriver<Connection>>;
  req: Request & {
    session: Session & Partial<SessionData> & { userId: number };
  };
  res: Response;
};

和我的userResolver (user.ts)

代码语言:javascript
运行
AI代码解释
复制
import { User } from "../entities/User";
import { MyContext } from "../types";
import {
  Arg,
  Ctx,
  Field,
  InputType,
  Mutation,
  ObjectType,
  Query,
  Resolver,
} from "type-graphql";
import argon2 from "argon2";

@InputType()
class UsernamePasswordInput {
  @Field()
  username: string;

  @Field()
  password: string;
}

@ObjectType()
class FieldError {
  @Field()
  field: string;

  @Field()
  message: string;
}

@ObjectType()
class UserResponse {
  @Field(() => [FieldError], { nullable: true })
  errors?: FieldError[];

  @Field(() => User, { nullable: true })
  user?: User;
}

@Resolver()
export class UserResolver {


  @Mutation(() => UserResponse)
  async login(
    @Arg("options", () => UsernamePasswordInput) options: UsernamePasswordInput,
    @Ctx() { em, req }: MyContext
  ): Promise<UserResponse> {
    const user = await em.findOne(User, { username: options.username });
    if (!user) {
      return {
        errors: [
          {
            field: "username",
            message: "username does not exist",
          },
        ],
      };
    }
    const valid = await argon2.verify(user.password, options.password);
    if (!valid) {
      return {
        errors: [
          {
            field: "password",
            message: "incorrect password",
          },
        ],
      };
    }

    req.session.userId = user.id;

    return {
      user,
    };
  }
}

我试着按照graphql沙箱的要求设置res.headers,但仍然没有效果。非常感谢您的帮助,谢谢!

EN

回答 2

Stack Overflow用户

发布于 2021-09-26 02:36:55

好吧,我不确定发生了什么,但我似乎解决了这个问题。

我的想法是:阿波罗游乐场退役了,localhost:port/graphql现在重定向到GraphQL GraphQL沙盒到不同的url,我猜cookie不会被传输到这个位置,但cookie被设置在本地主机。

因此,有一种方法可以强制Apollo仍然使用游乐场,方法是添加:

代码语言:javascript
运行
AI代码解释
复制
import { ApolloServerPluginLandingPageGraphQLPlayground } from "apollo-server-core";


  const apolloServer = new ApolloServer({
    ...,
    plugins: [
      ApolloServerPluginLandingPageGraphQLPlayground({
        // options
      }),
    ],
  });

这样,Playground就会出现,你可以设置

代码语言:javascript
运行
AI代码解释
复制
  "request.credentials": "include",

在设置中,cookie显示在localhost:port。

我希望这能帮助任何人解决这个问题--但是我仍然不确定这是不是一个正确的解决方案。

票数 6
EN

Stack Overflow用户

发布于 2022-01-11 12:33:03

添加旧的游乐场作为插件可能会起作用,但是,因为他们说它正在被弃用,如果你想让它在新的Apollo Studio中工作,以下是我如何做到的:

我在初始化应用程序后添加了这三行:

代码语言:javascript
运行
AI代码解释
复制
  app.set("trust proxy", !process.env.NODE_ENV === "production");
  app.set("Access-Control-Allow-Origin", "https://studio.apollographql.com");
  app.set("Access-Control-Allow-Credentials", true);

下面是我的会话的配置:

代码语言:javascript
运行
AI代码解释
复制
const RedisStore = connectRedis(session);
const redisClient = redis.createClient();

app.use(
  session({
    saveUninitialized: false,
    store: new RedisStore({ client: redisClient }),
    cookie: {
      maxAge: 1000 * 60 * 60 * 24 * 365 * 1, // 1 year
      httpOnly: true,
      sameSite: "none",
      secure: true, // if true, studio works, postman doesn't; if false its the other way around
    },
    name: "qid",
    secret: "keyboard cat",
    resave: false,
  }),
);

然后,转到Apollo Studio,转到连接设置->编辑Cookie包含Cookie(这真的很难找到):

确保在每次登录请求时都发送此标头:x-forwarded-proto: https

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69333408

复制
相关文章
Yelp 故障转移策略的实现
作者 | Yelp 工程团队 译者 | 王强 策划 | Tina 讲述 Yelp 工程师如何协调其流量故障转移流程,并在可靠性、性能和成本效率之间实现微妙平衡的故事。 表面上看,这是很简单明了的流程:Yelp 的站点可靠性工程师有时会转移流量,以防止出现面向用户的错误。但是在幕后,这一流程涉及生产系统、基础架构团队以及成百上千开发人员和他们负责服务之间的复杂编排。这篇文章讲述的就是 Yelp 的生产工程和计算基础架构团队如何实现故障转移策略,在可靠性、性能和成本效率之间找到平衡的故事。 什么是流量故障转移?
深度学习与Python
2023/04/01
4450
Yelp 故障转移策略的实现
Yelp 的 Spark 数据血缘建设实践!
在这篇博文中,我们介绍了 Spark-Lineage,这是一种内部产品,用于跟踪和可视化 Yelp 的数据是如何在我们的服务之间处理、存储和传输的。
从大数据到人工智能
2022/09/16
1.5K0
Yelp 的 Spark 数据血缘建设实践!
GAN 优化 Yelp 形象图片广告
论文标题:You eat with your eyes first: Optimizing Yelp Image 论文链接:https://arxiv.org/abs/2011.01434 论文单位:斯坦福大学
CV君
2020/11/23
2K0
GAN 优化 Yelp 形象图片广告
Yelp 的 Apache Cassandra 集群重建解决方案
Yelp 构建了一个解决方案,利用其数据流架构来清理来自已损坏的 Apache Cassandra 集群的数据。提供解决方案的团队探索了许多可能的选项来解决数据损坏问题,但最终不得不将数据转移到一个新的集群中,以便在转移过程中移除损坏的记录。
深度学习与Python
2023/09/08
2010
Yelp 的 Apache Cassandra 集群重建解决方案
Yelp,如何使用深度学习对商业照片进行分类
作者:张天雷 来源:InfoQ 摘自:http://www.infoq.com/cn/news/2015/11/Yelp-photo Yelp是美国最大点评网站,拥有世界各地的Yelper上传的成千上万的照片。各种各样的照片给进入当地的商业提供了一个丰富的窗口。通过开发一个照片理解系统使Yelp能够创建有关个人照片的语义数据。跟Yelp第一次在基于内容的照片多样化方面所做的尝试一样,由系统生成的数据正在增强Yelp近期推出的封面照片多样化、标签式照片浏览等服务。 构建一个照片分类器 对于理解照片中的模棱两可
大数据文摘
2018/05/23
8960
Salesforce连接器在Yelp中的应用案例
Yelp是美国著名商户点评网站,创立于2004年,囊括各地餐馆、购物中心、酒店、旅游等领域的商户,用户可以在Yelp网站中给商户打分,提交评论,交流购物体验等。
臭豆腐
2019/04/16
1.1K0
Salesforce连接器在Yelp中的应用案例
Flink Forward 2019--实战相关(9)--Yelp公司分享CEP应用
Creating millions of user sessions using Complex Event Processing -- Prem Santosh & Udaya Shankar(Yelp)
阿泽
2019/07/11
5880
Flink Forward 2019--实战相关(9)--Yelp公司分享CEP应用
【深度学习】Yelp是如何使用深度学习对商业照片进行分类的
Yelp是美国最大点评网站,拥有世界各地的Yelper上传的成千上万的照片。各种各样的照片给进入当地的商业提供了一个丰富的窗口。通过开发一个照片理解系统使Yelp能够创建有关个人照片的语义数据。跟Yelp第一次在基于内容的照片多样化方面所做的尝试一样,由系统生成的数据正在增强Yelp近期推出的封面照片多样化、标签式照片浏览等服务。 构建一个照片分类器 对于理解照片中的模棱两可的目标,其实有许多不同的方式。一开始,为了帮助简化Yelp的问题,Yelp只专注于将照片分类为几个预定义的类。之后,Yelp又只专注于
陆勤_数据人网
2018/02/27
1.4K0
【深度学习】Yelp是如何使用深度学习对商业照片进行分类的
Flink Forward 2019--实战相关(16)--Yelp分享实时访问规模预测
Realtime Store Visit Predictions at Scale -- Luca Giovagnoli(Yelp)
阿泽
2019/08/20
4370
Flink Forward 2019--实战相关(16)--Yelp分享实时访问规模预测
neo4j APOC插件安装以及Yelp示例数据导入
APOC库包含许多(约450个)程序和函数,可帮助处理数据集成,图算法或数据转换等
lovelife110
2021/01/14
1.3K0
案例分享 | Yelp 如何在 Kubernetes 上运行 Kafka(第 2 部分 - 迁移)
上一篇文章,我们详细介绍了开发基于 PaaSTA 的新部署模型的架构和动机。现在想分享我们将现有 Kafka 集群从 EC2 无缝迁移到基于 Kubernetes 的内部计算平台的策略。为了帮助促进迁移,我们构建了与集群架构的各种组件接口的工具,以确保该过程是自动化的,并且不会影响用户读取或写入 Kafka 记录的能力。
灵雀云
2022/08/12
1.1K0
案例分享 | Yelp 如何在 Kubernetes 上运行 Kafka(第 2 部分 - 迁移)
[- 壹 FFmpeg4.2.1 -] CLion 集成 、Xcode 集成、 Android集成
吾的最终目的在移动端。但为了方便对FFmpeg的认知和调试,先在桌面把它消化一下,毕竟在Android中修改、调试都比较费事。知识殊途同归,重要的不是它在哪里,而是它能干嘛,你想拿他干嘛。 FFmpeg是c写的,在使用时需要动态链接到相应的库上。虽然用文本编辑器和命令行也能手撕代码,但IDE能让人少调些头发。这里记录一下Xcode 和 CLion 桌面、Android集成FFmpeg的方式。本篇的目标只有一个:跑起来 ---- 1.安装与配置ffmpeg 1.1:安装ffmpeg brew可以安装f
张风捷特烈
2020/04/30
1.3K0
[- 壹 FFmpeg4.2.1 -] CLion 集成 、Xcode 集成、 Android集成
Flink Forward 2019--实战相关(17)--Yelp分享实时访问规模预测
Using Flink to inspect live data as it flows through a data pipeline -- Matthew Dailey(Splunk)
阿泽
2019/08/23
7480
Flink Forward 2019--实战相关(17)--Yelp分享实时访问规模预测
案例分享 | Yelp 如何在 Kubernetes 上运行 Kafka(第 1 部分 - 架构)
在 Yelp,Kafka 每天接收数百亿条消息来推进数据驱动并为关键业务管道和服务提供支持。我们最近通过在 PaaSTA (Yelp 自己的平台即服务)上运行集群,对 Kafka 部署架构进行一些改进。基于 K8s 的部署利用了 Kafka 的自定义 Kubernetes operator 以及用于生命周期管理的 Cruise Control 。
灵雀云
2022/08/12
5940
案例分享 | Yelp 如何在 Kubernetes 上运行 Kafka(第 1 部分 - 架构)
【微服务干货系列】Yelp公司总结的微服务架构的实践经验
创建 首先探讨系统的整体架构 在你开始考虑设计服务之初,也就是动手写代码和设计之前,和团队成员、其他服务领域的专家聊一聊。除了如何与现有的特性、产品以及服务如何适配之外,考虑一下你想要额外添加的功能。考虑一种最合理的组织整体功能的方式。有时候添加新功能意味着要对现有组件进行重组。 我们希望避免那些简单的 “append-only”服务架构,也就是说development只存在于新的服务中 核实是否能够给现有服务添加新的功能 在编写新的服务之前,应该核实是否现有服务不包括你的功能。它可能会与现有的功能存在冲突
Rainbond开源
2018/05/31
6500
【开源公告】NeuralNLP-NeuralClassifier - 深度学习文本分类工具
NeuralNLP是腾讯广告(Tencent Marketing Solution,TMS)(https://e.qq.com/)数据算法团队搭建的一个基于PyTorch的深度学习NLP公共实验平台,主要涵盖文本分类、序列标注、语义匹配、BERT微调和文本生成等,目前已经广泛应用于腾讯广告业务文本相关的需求场景中,如广告定向、相关性计算、LookAlike、动态创意、点击率/转化率预估等。 NeuralClassifier是NeuralNLP的一个子项目,是一款基于PyTorch开发的深度学习文本分类工具
腾讯开源
2019/07/09
1.4K0
【开源公告】NeuralNLP-NeuralClassifier - 深度学习文本分类工具
「集成架构」理解企业应用集成
应用程序和数据集成是交付新客户体验和服务的基础。通常,一个团队管理整个企业的单片集成技术,但是应用程序正变得越来越复杂——它们是分布式的,并且必须快速扩展和更改,以在竞争的市场中保持同步。这些新的挑战需要基于云本地集成技术和敏捷团队的迭代方法。
架构师研究会
2022/01/25
1.6K0
「集成架构」理解企业应用集成
集成wangEditor
寿命的缩短与思想的虚耗成正比。——达尔文 官方文档 wangEditor:Typescript 开发的 Web 富文本编辑器, 轻量、简洁、易用、开源免费 html里集成wangEditor非常简单 <div id="div1"></div> <script src="https://unpkg.com/wangeditor/dist/wangEditor.min.js"></script> <script> var E = window.wangEditor; var editor =
阿超
2022/08/16
5570
集成wangEditor
集成学习
集成学习(ensemble learning)通过构建并集合多个学习器完成学习任务,有时也被称为多分类器系统(multi-classifier system)、基于委员会的学习(committee based learning)等。先产生一组“个体学习器”(invidual learner),再用某种策略将它们结合起来。个体学习器通常由一个现有的学习算法从训练数据中产生,例如C4.5决策树、BP神经网络算法等,此时集成中只包含同种类型的个体学习器,例如“决策树集成”中全是决策树,“神经网络集成”中全是神经网络,这样的集成是“同质”的(homogeneous)。同质集成中的个体学习器亦称为“基学习器”(base learner),相应的算法称为“基学习算法”(base learning algorithm)。集成也包含不同类型的个体学习器。例如同时包含决策树和神经网络,这样的集成是“异质”的(heterogeneous)。异质集成中的个体学习器由不同的学习算法生成,这时就不再有学习算法;相应的,个体学习器一般不称为学习器,常称为“组件学习器”(component learner)或直接称为个体学习器。
狼啸风云
2019/11/07
1.2K0
集成学习
「集成架构」Redhat 观点:理解企业集成
应用程序和数据集成是交付新客户体验和服务的基础。通常,一个团队管理整个企业的单片集成技术,但是应用程序正变得越来越复杂——它们是分布式的,并且必须快速扩展和更改,以在竞争的市场中保持同步。这些新的挑战需要基于云本地集成技术和敏捷团队的迭代方法。
架构师研究会
2019/12/10
9270
「集成架构」Redhat 观点:理解企业集成

相似问题

基于位置的Yelp API集成

18

Yelp在Android中的集成

20

iPhone应用: Yelp Api集成问题

11

如何将YELP API与iphone集成?

11

如何在iPhone应用程序中集成Yelp APi?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档