【问题标题】:Hasura whatsapp clone JWT boilerplate - how does "users" table get populated?Hasura whatsapp 克隆 JWT 样板 - 如何填充“用户”表?
【发布时间】:2020-02-10 07:04:48
【问题描述】:

我已经为whatsapp clone tutorial 构建并启动了所有组件。 我的身份验证服务器正在使用对称加密生成有效的 JWT(根据 jwt.io)。 JWT 似乎正确地由 react-app 传递,因为我可以注册和登录。 现在我有一些问题在使用 react-app 登录后无法立即解决。

登录后,我们的用户被重定向到components/ChatsListScreen/ChatsList.tsx。在这里,我们想要显示基于连接用户的数据(使用useMe())。我的问题是useMe() 返回一个空对象。

我在 hasura 服务器上也收到以下错误(在 docker 中运行):

{"timestamp":"2019-10-13T08:21:26.663+0000","level":"error","type":"http-log","detail":{"operation":{"query_execution_time":null,"user_vars":{"x-hasura-role":"user","x-hasura-user-id":"4"},"error":{"path":"$.variableValues","error":"expecting a value for non-nullable variable: userId of type: Int! in variableValues","code":"validation-failed"},"request_id":"5a8c6897-69dd-410e-bd10-f637750e1957","response_size":148,"query":{"variables":{},"operationName":"ChatsListQuery","query":"query ChatsListQuery($userId: Int!) {\n  chat(order_by: [{messages_aggregate: {max: {created_at: desc}}}]) {\n    ...chat\n    users(where: {user_id: {_neq: $userId}}) {\n      user {\n        ...user\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n}\n\nfragment chat on chat {\n  id\n  name\n  picture\n  owner_id\n  created_at\n  messages(order_by: [{created_at: asc}]) {\n    ...message\n    __typename\n  }\n  __typename\n}\n\nfragment message on message {\n  id\n  chat_id\n  sender {\n    id\n    name\n    __typename\n  }\n  content\n  created_at\n  __typename\n}\n\nfragment user on users {\n  id\n  username\n  name\n  picture\n  __typename\n}\n"}},"http_info":{"status":200,"http_version":"HTTP/1.1","url":"/v1/graphql","ip":"172.18.0.1","method":"POST"}}}

如您所见,x-hasura-user-id 已正确传递,但查询需要一个空的 userId

根据我的日志和我的理解,这是由于提供useMe() 挂钩的fetchUser 是空的。

现在这个为空的原因很可能是因为我的 hasura 数据库是空的。身份验证服务器数据库有用户(登录的用户),但 hasura 的 users 表为空。

hasura 的 users 表是如何被填充的?

【问题讨论】:

    标签: reactjs graphql passport.js hasura


    【解决方案1】:

    此样板假定身份验证服务器和 Hasura API 都读取和写入同一数据库,users 表是共享实体。

    注册后,用户被插入到数据库(用户表)中。这是 source 在身份验证服务器中发生的位置。

    如果您已将身份验证服务器配置为写入不同的数据库,那么您需要在注册后同步用户数据。

    【讨论】:

    • 我虽然拥有一个身份验证服务器和使用 JWT 的全部目的是实际上拥有一个非共享数据库和整体不同的基础架构?因此,为了让事情顺利进行,我可能不得不更改代码以使用 JWT 中的 userId,并且通常我所做的任何事情都依赖这些数据。
    • 身份验证服务器和 hasura 实例不必共享数据库。但是身份验证服务器必须创建可以被 Hasura 实例解密的 JWT。这意味着他们使用共享密钥或 RSA
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2019-11-01
    • 2014-05-12
    相关资源
    最近更新 更多