Prisma with Next-Auth,用户创建失败导致Keycloak的api响应键名

Posted

技术标签:

【中文标题】Prisma with Next-Auth,用户创建失败导致Keycloak的api响应键名【英文标题】:Prisma with Next-Auth, user creation fails cause of Keycloak's api response key name 【发布时间】:2021-12-22 21:25:15 【问题描述】:

我正在使用带有默认设置的 next-auth 的 keycloak 适配器来保存,keycloak 对使用 Prisma orm 的数据库的响应。

问题在于 keycloak 的响应(即 next-auth 中的 account 变量)有一个 key-value 字段not-before-policy

  data: 
    provider: 'keycloak',
    type: 'oauth',
    providerAccountId: '', 
    access_token: '..--P0Y19Ee-TKh47w',      
       expires_at: 1636469568,
    refresh_expires_in: 1800,
    refresh_token: 'fasdfsf',
    token_type: 'Bearer',
    id_token: 'fsdfA8HL85zFsekhgp1F0g',
    'not-before-policy': 1636367915, <-----------------------------------------------------
    session_state: 'b11fe259-961f-49c3-b1b6-27ff8b22d94c',     
    scope: 'openid email profile',
    userId: 'ckvs7jszn0006qck9qnajrqan'
  

字符 "-"(破折号)阻止我在 Prisma 架构上定义 Account 模型中的字段。

not-before-policy Int

根据 Github 上的 this issue 和 文档 中的 this topic,此问题已得到解决。

我正在尝试通过在帐户模型中执行类似操作来映射此值(使用“非法”字符)。

  not_before_policy Int     @map("not-before-policy") // THIS doesn't work!

这也不起作用并给我错误:

 1
 17 updateUser: (data) => p.user.update( where:  id: data.id , data ),
 18 deleteUser: (id) => p.user.delete( where:  id  ),
→ 19 linkAccount: (data) => p.account.create(
  data: 
    provider: 'keycloak',
    type: 'oauth',
    providerAccountId: '', 
    access_token: '..--P0Y19Ee-TKh47w',      
       expires_at: 1636469568,
    refresh_expires_in: 1800,
    refresh_token: 'fasdfsf',
    token_type: 'Bearer',
    id_token: 'fsdfA8HL85zFsekhgp1F0g',
    'not-before-policy': 1636367915, 
    session_state: 'b11fe259-961f-49c3-b1b6-27ff8b22d94c',     
    scope: 'openid email profile',
    userId: 'ckvs7jszn0006qck9qnajrqan'
  
)

Unknown arg not-before-policy in data.not-before-policy for type AccountUncheckedCreateInput. Did you mean not_before_policy? Available args:
type AccountUncheckedCreateInput 
 id?: String
 userId: String
 type: String
 not_before_policy?: Int | Null
 provider: String
 providerAccountId: String
 refresh_token?: String | Null
 access_token?: String | Null
 expires_at?: Int | Null
 token_type?: String | Null
 scope?: String | Null
 id_token?: String | Null
 session_state?: String | Null
 oauth_token_secret?: String | Null
 oauth_token?: String | Null
 refresh_expires_in?: Int | Null

我可以让 prisma 以某种方式理解 keycloak 对这个“非法”名称的响应,还是我可以在 next-auth-prisma-adapter 调用它之前改变具有 keycloak 响应的 next-auth 对象? 我错过了文档中的某些内容吗?

非常感谢您!

【问题讨论】:

您应该在您的account.create 调用中使用not_before_policy 以使其正常工作。另外,在将数据写入 Prisma 时,您能否不只是手动将 keycloak 返回的对象中的 not-before-policy 字段重新分配/映射到 not_before_policy 字段? Next-auth 有一个用于 Prisma 的适配器,它会在将数据写入 prisma 时自动调用 account.create 并使用 keycloak 的响应(登录时)account。不是我来决定 account.create(data) 中的数据是什么或何时调用该函数。所以,当然,如果我可以干预这个函数调用,那就没有问题了。所以我问是否有办法手动更改 account.create 的参数,或者我是否可以以不同的方式定义 prisma 模式,以便它能够理解 not-before-policy 我现在明白了。不幸的是,没有办法在您的 prisma 客户端中使用名称中带有“-”的字段。架构中的 `@map` 注释允许您自省/创建名称中带有“-”的数据库列,但 Prisma 客户端中生成的字段名称不能带有“-”。也许值得在下一个身份验证回购中打开一个关于此的问题? 感谢您的回答,我将打开一个新问题,如果有修复,我会更新问题。 抱歉,我帮不上忙。祝你好运! 【参考方案1】:

似乎 Keycloak 正在发送默认 Prisma Schema 不知道的额外字段。您可以从 next-auth 的 github 问题页面查看 this 类似对话。

但简而言之,您可以在适配器回调中覆盖 linkAccount 或更改默认的 Prisma Schema 以包含那些额外的字段。

【讨论】:

以上是关于Prisma with Next-Auth,用户创建失败导致Keycloak的api响应键名的主要内容,如果未能解决你的问题,请参考以下文章

Next JS with Prisma - 更新基于用户的角色

登录 NEXT-AUTH 后重定向到自定义 URL

如何在 next-auth 中向客户端 API 添加数据?

我想使用 Next-Auth 实现会话管理系统

使用 next-auth 时,如何从浏览器调用我的 Cognito 安全 Rest API?

Next-auth - 如何更新会话客户端?