wawoon blog

graphql-yogaでJWTを検証する

GraphQLサーバーの実装にgraphql-yogaを使っているとき、JWTを検証するには以下のようにする。Auth0とPrisma.ioを使っているときの例。

 
// middlewares/check_jwt.js
 
const jwt = require('express-jwt');
const jwksRsa = require('jwks-rsa');
 
const checkJwt = jwt({
  secret: jwksRsa.expressJwtSecret({
    cache: true,
    rateLimit: true,
    jwksRequestsPerMinute: 1,
    jwksUri: `${process.env.AUTH0_URL}.well-known/jwks.json`
  }),
 
  // Validate the audience and the issuer.
  credentialsRequired: false,
  audience: process.env.AUTH0_AUDIENCE,
  issuer: process.env.AUTH0_URL,
  algorithms: [`RS256`]
})
 
module.exports = checkJwt
 
 
// index.js
 
require("dotenv").config();
const { Prisma } = require("prisma-binding");
const { GraphQLServer } = require("graphql-yoga");
const checkJwt = require("./middlewares/check_jwt");
 
const getPrismaInstance = () => {
  return new Prisma({
    typeDefs: "src/generated/prisma.graphql",
    endpoint: process.env.PRISMA_ENDPOINT,
    secret: process.env.PRISMA_JWT_SECRET
  });
};
 
const resolvers = {
  Query: {
    currentUser: async (_, args, context, info) => {
      if (context.request.user) {
        // ログイン時の処理
        // context.request.userでデコードされたjwtを取得できる
 
      } else {
        // 未ログイン時の処理
      }
    }
  }
};
 
const server = new GraphQLServer({
  typeDefs: "src/schema.graphql",
  resolvers,
  context: req => ({
    ...req,
    db: getPrismaInstance()
  })
});
 
server.express.use(checkJwt)
 
const port = process.env.PORT || 4000;
server.start({ port }, () =>
  console.log(`GraphQL server is running on http://localhost:${port}`)
);

graphql-yogaはexpressをラップしているので、expressのミドルウェアを使える。

https://github.com/prismagraphql/graphql-yoga

環境変数について適宜読み換えをしてください。