GraphQLサーバーの実装にgraphql-yogaを使っているとき、JWTを検証するには以下のようにする。Auth0とPrisma.ioを使っているときの例。
12// middlewares/check_jwt.js34const jwt = require('express-jwt');5const jwksRsa = require('jwks-rsa');67const checkJwt = jwt({8 secret: jwksRsa.expressJwtSecret({9 cache: true,10 rateLimit: true,11 jwksRequestsPerMinute: 1,12 jwksUri: `${process.env.AUTH0_URL}.well-known/jwks.json`13 }),1415 // Validate the audience and the issuer.16 credentialsRequired: false,17 audience: process.env.AUTH0_AUDIENCE,18 issuer: process.env.AUTH0_URL,19 algorithms: [`RS256`]20})2122module.exports = checkJwt2324
12// index.js34require("dotenv").config();5const { Prisma } = require("prisma-binding");6const { GraphQLServer } = require("graphql-yoga");7const checkJwt = require("./middlewares/check_jwt");89const getPrismaInstance = () => {10 return new Prisma({11 typeDefs: "src/generated/prisma.graphql",12 endpoint: process.env.PRISMA_ENDPOINT,13 secret: process.env.PRISMA_JWT_SECRET14 });15};1617const resolvers = {18 Query: {19 currentUser: async (_, args, context, info) => {20 if (context.request.user) {21 // ログイン時の処理22 // context.request.userでデコードされたjwtを取得できる2324 } else {25 // 未ログイン時の処理26 }27 }28 }29};3031const server = new GraphQLServer({32 typeDefs: "src/schema.graphql",33 resolvers,34 context: req => ({35 ...req,36 db: getPrismaInstance()37 })38});3940server.express.use(checkJwt)4142const port = process.env.PORT || 4000;43server.start({ port }, () =>44 console.log(`GraphQL server is running on http://localhost:${port}`)45);46
graphql-yogaはexpressをラップしているので、expressのミドルウェアを使える。
https://github.com/prismagraphql/graphql-yoga
環境変数について適宜読み換えをしてください。