Dgraph 适配器
资源
设置
安装
npm install @auth/dgraph-adapter
环境变量
AUTH_DGRAPH_GRAPHQL_ENDPOINT=https://127.0.0.1:8080/graphql
AUTH_DGRAPH_GRAPHQL_KEY=abc123
配置
import NextAuth from "next-auth"
import { DgraphAdapter } from "@auth/dgraph-adapter"
export const { handlers, auth, signIn, signOut } = NextAuth({
providers: [],
adapter: DgraphAdapter({
endpoint: process.env.AUTH_DGRAPH_GRAPHQL_ENDPOINT,
authToken: process.env.AUTH_DGRAPH_GRAPHQL_KEY,
// you can omit the following properties if you are running an unsecure schema
authHeader: process.env.AUTH_HEADER, // default: "Authorization",
jwtSecret: process.env.AUTH_SECRET,
}),
})
不安全的模式
使用 Dgraph 的最快方法是将不安全的模式应用于您的 本地 Dgraph 实例,或者如果您使用 Dgraph 云,您可以在代码框中粘贴模式以更新。
这种方法不安全,不适合生产环境使用,也不需要 jwtSecret
。
此模式适用于 Dgraph,并且基于我们的主要 模式
示例
type Account {
id: ID
type: String
provider: String @search(by: [hash])
providerAccountId: String @search(by: [hash])
refreshToken: String
expires_at: Int64
accessToken: String
token_type: String
refresh_token: String
access_token: String
scope: String
id_token: String
session_state: String
user: User @hasInverse(field: "accounts")
}
type Session {
id: ID
expires: DateTime
sessionToken: String @search(by: [hash])
user: User @hasInverse(field: "sessions")
}
type User {
id: ID
name: String
email: String @search(by: [hash])
emailVerified: DateTime
image: String
accounts: [Account] @hasInverse(field: "user")
sessions: [Session] @hasInverse(field: "user")
}
type VerificationToken {
id: ID
identifier: String @search(by: [hash])
token: String @search(by: [hash])
expires: DateTime
}
安全模式
对于生产部署,您需要限制对 next-auth 使用的类型的访问。Dgraph 中使用的主要访问控制形式是通过 @auth
指令以及模式中的类型。
示例
type Account
@auth(
delete: { rule: "{$nextAuth: { eq: true } }" }
add: { rule: "{$nextAuth: { eq: true } }" }
query: { rule: "{$nextAuth: { eq: true } }" }
update: { rule: "{$nextAuth: { eq: true } }" }
) {
id: ID
type: String
provider: String @search(by: [hash])
providerAccountId: String @search(by: [hash])
refreshToken: String
expires_at: Int64
accessToken: String
token_type: String
refresh_token: String
access_token: String
scope: String
id_token: String
session_state: String
user: User @hasInverse(field: "accounts")
}
type Session
@auth(
delete: { rule: "{$nextAuth: { eq: true } }" }
add: { rule: "{$nextAuth: { eq: true } }" }
query: { rule: "{$nextAuth: { eq: true } }" }
update: { rule: "{$nextAuth: { eq: true } }" }
) {
id: ID
expires: DateTime
sessionToken: String @search(by: [hash])
user: User @hasInverse(field: "sessions")
}
type User
@auth(
query: {
or: [
{
rule: """
query ($userId: String!) {queryUser(filter: { id: { eq: $userId } } ) {id}}
"""
}
{ rule: "{$nextAuth: { eq: true } }" }
]
}
delete: { rule: "{$nextAuth: { eq: true } }" }
add: { rule: "{$nextAuth: { eq: true } }" }
update: {
or: [
{
rule: """
query ($userId: String!) {queryUser(filter: { id: { eq: $userId } } ) {id}}
"""
}
{ rule: "{$nextAuth: { eq: true } }" }
]
}
) {
id: ID
name: String
email: String @search(by: [hash])
emailVerified: DateTime
image: String
accounts: [Account] @hasInverse(field: "user")
sessions: [Session] @hasInverse(field: "user")
}
type VerificationToken
@auth(
delete: { rule: "{$nextAuth: { eq: true } }" }
add: { rule: "{$nextAuth: { eq: true } }" }
query: { rule: "{$nextAuth: { eq: true } }" }
update: { rule: "{$nextAuth: { eq: true } }" }
) {
id: ID
identifier: String @search(by: [hash])
token: String @search(by: [hash])
expires: DateTime
}
# Dgraph.Authorization {"VerificationKey":"<YOUR JWT SECRET HERE>","Header":"<YOUR AUTH HEADER HERE>","Namespace":"<YOUR CUSTOM NAMESPACE HERE>","Algo":"HS256"}
Dgraph.Authorization
为了保护您的 graphql 后端,请在模式的底部定义 Dgraph.Authorization
对象,并将 authHeader
和 jwtSecret
值提供给 DgraphClient。
# Dgraph.Authorization {"VerificationKey":"<YOUR JWT SECRET HERE>","Header":"<YOUR AUTH HEADER HERE>","Namespace":"YOUR CUSTOM NAMESPACE HERE","Algo":"HS256"}
验证密钥和 jwtSecret
这是用于签署 JWT 的密钥。例如 process.env.SECRET
或 process.env.APP_SECRET
。
头文件和 authHeader
Header
告诉 Dgraph 在发送到 Dgraph 服务器的传入请求的头文件中查找 JWT 的位置。您需要在模式文件的底部配置它。此头文件与您在实例化 DgraphClient
时提供的 authHeader
属性相同。
nextAuth 密钥
$nextAuth
密钥是使用 jwtSecret
安全生成的,并由 DgraphAdapter 注入,以允许与系统内匿名用户请求(即登录、注册
)的 JWT DgraphClient 进行交互。这允许与 next-auth 所需的所有 auth 类型进行安全交互。您需要为安全模式中定义的每种类型的所有 auth 规则指定它。
type VerificationRequest
@auth(
delete: { rule: "{$nextAuth: { eq: true } }" },
add: { rule: "{$nextAuth: { eq: true } }" },
query: { rule: "{$nextAuth: { eq: true } }" },
update: { rule: "{$nextAuth: { eq: true } }" }
) {
}
JWT 会话和 @auth
指令
Dgraph 仅与 HS256 或 RS256 算法配合使用。如果您想使用会话 jwt 安全地与您的 Dgraph 数据库交互,您必须自定义 next-auth encode
和 decode
函数,因为默认算法是 HS512。如果您想实现 RBAC 逻辑
,您可以进一步自定义 jwt 以及角色。
import NextAuth from "next-auth"
import * as jwt from "jsonwebtoken"
export const { handlers, auth, signIn, signOut } = NextAuth({
session: {
strategy: "jwt",
},
jwt: {
secret: process.env.SECRET,
encode: async ({ secret, token }) => {
return jwt.sign({ ...token, userId: token.id }, secret, {
algorithm: "HS256",
expiresIn: 30 * 24 * 60 * 60, // 30 days
})
},
decode: async ({ secret, token }) => {
return jwt.verify(token, secret, { algorithms: ["HS256"] })
},
},
})
一旦您的 Dgraph.Authorization
在模式中定义并且 JWT 设置完成,您就可以定义 @auth 规则
,用于模式的每个部分。