graphql-yogaでJWTを検証する

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

1
2// middlewares/check_jwt.js
3
4const jwt = require('express-jwt');
5const jwksRsa = require('jwks-rsa');
6
7const 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 }),
14
15 // 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})
21
22module.exports = checkJwt
23
24
1
2// index.js
3
4require("dotenv").config();
5const { Prisma } = require("prisma-binding");
6const { GraphQLServer } = require("graphql-yoga");
7const checkJwt = require("./middlewares/check_jwt");
8
9const getPrismaInstance = () => {
10 return new Prisma({
11 typeDefs: "src/generated/prisma.graphql",
12 endpoint: process.env.PRISMA_ENDPOINT,
13 secret: process.env.PRISMA_JWT_SECRET
14 });
15};
16
17const resolvers = {
18 Query: {
19 currentUser: async (_, args, context, info) => {
20 if (context.request.user) {
21 // ログイン時の処理
22 // context.request.userでデコードされたjwtを取得できる
23
24 } else {
25 // 未ログイン時の処理
26 }
27 }
28 }
29};
30
31const server = new GraphQLServer({
32 typeDefs: "src/schema.graphql",
33 resolvers,
34 context: req => ({
35 ...req,
36 db: getPrismaInstance()
37 })
38});
39
40server.express.use(checkJwt)
41
42const 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

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

This site uses Google Analytics.
source code