Skip to content

Latest commit

 

History

History
94 lines (70 loc) · 2.09 KB

graphql-yoga-jwt-verify.mdx

File metadata and controls

94 lines (70 loc) · 2.09 KB
title tags author slide published_at
graphql-yogaでJWTを検証する
Node.js GraphQL JWT graphql-yoga prisma
wawoon
false
2018-05-31

export const config = { amp: true }

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

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