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
環境変数について適宜読み換えをしてください。