无场景,就是做做看,试试 API 随便写写,现在有几个问题想请教各位仁兄
现在我通过
export default defineNitroPlugin((nitroApp) => {
const link = new HttpLink({
uri: 'http://localhost:8080/v1/graphql',
headers: {
'x-hasura-admin-secret': '123456'
}
});
const apolloClient = new ApolloClient({
cache: new InMemoryCache(),
link: link
});
nitroApp.hooks.hook('request', (event) => {
event.context.apollo = apolloClient
})
})
------------------------Handler---------------------------------
import { gql } from '@apollo/client/core'
export default defineEventHandler(async (event) => {
const client = event.context.apollo
const query = gql`
query getUser($limit: Int!) {
User(limit: $limit) {
id
name
}
User_aggregate {
aggregate {
count
}
}
}
`
const { limit } = await readBody(event)
try {
const { data } = await client.query({ query, variables: { limit: 10 } })
return data
} catch (error) {
console.error('GraphQL query error:', error)
return { error: 'Failed to fetch data' }
}
})
连接本地的 Hasura 服务,Hasura 是动态管理 GraphQL 的 Schema 的一个服务,这个服务我链接了 PGSQL ,具体的环境如下
version: '3.6'
services:
postgres:
image: postgres:16.3
restart: always
environment:
POSTGRES_USER: root
POSTGRES_PASSWORD: root
POSTGRES_DB: rm00
ports:
- "5432:5432"
volumes:
- ./postgres:/var/lib/postgresql/data
hasura:
restart: always
image: hasura/graphql-engine:v2.15.2
ports:
- "8080:8080"
depends_on:
- postgres
environment:
HASURA_GRAPHQL_DATABASE_URL: postgres://root:root@postgres:5432/rm00
HASURA_GRAPHQL_ENABLE_CONSOLE: "true"
HASURA_GRAPHQL_ENABLE_ALLOWLIST: "true"
HASURA_GRAPHQL_ADMIN_SECRET: 123456
<template>
<div>
<h1>Login</h1>
<div v-if="data">
{{ data }}
</div>
{{ error }}
</div>
</template>
<script lang="ts" setup>
definePageMeta({
layout: 'blank',
auth: 'guest'
})
const { data, error, execute } = useFetch('/api/demo', {
method: 'post',
auth: false
})
</script>
整个 demo 跑通了是跑通了,但是总觉得不是一个很好的方式或者说不成熟,现在有几个问题想请教请教大佬们
1
c3de3f21 OP 额,沉了。。。
|
2
rocmax 77 天前 1
hasura 的 admin secret 最好不要用来请求 API ,因为会直接跳过所有权限检查。admin 留着登陆管理后台比较好。
hasura 有基于角色的权限管理,但是角色信息需要从外部获得,可以参考一下 authentication 文档,有和多种认证服务连接的例子,hasura 有两种取得 role 的方式: 1. 从请求头中取得含有 role 信息的 jwt ( hasura 会取得认证服务的公钥进行验证),这种情况下需要客户端先从认证服务器取得 jwt 并附加在请求头中(例如 keycloak ) 2. hasura 将请求转发至认证服务器并从 response 中取得 role 信息,然后根据 role 信息完成查询将结果返回给客户端,这种情况可能需要自建认证服务器用以返回 hasura 需要的数据格式(例如 aws congnito ) 我理解你用 api 服务端隔离了前端来的请求和 hasura ,由 api 服务端添加认证 header 后传递给 hasura 对吗?按道理只要保证 secret 不离开后端应该没有什么风险,不过即使这样也不推荐直接用 admin secret 。 我不太理解 “secret 会混入请求头也就是有注入风险”,具体解释一下的话我或许可以给你答案。 |