
无场景,就是做做看,试试 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('requet', (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 2024 年 8 月 15 日 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 会混入请求头也就是有注入风险”,具体解释一下的话我或许可以给你答案。 |