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 - 更新基于用户的角色