GraphQL Typcript - как проверить токен и добавить пользователя для запроса

Marcelo Tardelli Magalhães спросил: 13 июня 2018 в 03:30 в: node.js

Я пытаюсь сделать GraphQL (GraphQL Yoga) api с помощью TypeORM, и у меня возникла проблема с тем, как проверить JWT token по каждому запросу, чтобы проверить его и вставить идентификатор пользователя в объект запроса.

Мой код следующий:

index.ts:

const app = new GraphQLServer({
    schema: mergeSchemas({ schemas }),
    context: ({ req }) => ({
      req,
    }),
  });  app.express.post('/', addUser);

addUser.ts:

import { Request, Response, NextFunction } from 'express';
import * as jwt from 'jsonwebtoken';
import { refreshTokens } from '../utils/auth';const addUser = async (req: Request, res: Response, next: NextFunction) => {
  const SECRET = process.env.SECRET;
  const REFRESH_SECRET = process.env.REFRESH_SECRET;  const token = req.headers['x-token'];
  if (token) {
    try {
      if (SECRET) {
        const id = jwt.verify(token[0], SECRET);
        req.user = id;
      }
    } catch (e) {
      const refreshToken = req.headers['x-refresh-token'];
      if (refreshToken && SECRET && REFRESH_SECRET) {
        const newTokens = await refreshTokens(refreshToken[0], SECRET, REFRESH_SECRET);
        if (newTokens.token && newTokens.refreshToken) {
          res.set('Access-Control-Expose-Headers', 'x-token, x-refresh-token');
          res.set('x-token', newTokens.token);
          res.set('x-refresh-token', newTokens.refreshToken);
        }
        req.user = newTokens.user;
      }
    }
  }
  next();
}export default addUser;

Я расширил объект Request с помощью интерфейса (не уверен если он правильно загружен).

express.d.ts:

declare namespace Express {
  export interface Request {
    user: any
  }
}

И мой tsconfig.json:

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "lib": [
      "dom",
      "es6",
      "es2017",
      "esnext.asynciterable"
    ],
    "sourceMap": true,
    "outDir": "./dist",
    "moduleResolution": "node",
    "removeComments": true,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "strictFunctionTypes": true,
    "noImplicitThis": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": true,
    "allowSyntheticDefaultImports": false,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true
  },
  "exclude": [
    "node_modules"
  ],
  "include": [
    "./src/**/*.tsx",
    "./src/**/*.ts"
  ]
}

Но когда я пытаюсь запустить сервер, появляется следующее сообщение:

TSError: ⨯ Unable to compile TypeScript:
src/middleware/addUser.ts(14,13): error TS2339: Property 'user' does not exist on type 'Request'.
src/middleware/addUser.ts(25,13): error TS2339: Property 'user' does not exist on type 'Request'.

Кто-нибудь решил эта проблема, или есть идея о том, как я могу улучшить этот код?

Спасибо!

1 ответ

Daniel Jakobsen Hallel ответил: 13 июня 2018 в 04:12

дублировать вопрос продлить-экспресс-запрос

из того, что я пробовал это решение, работало лучше решение

Marcelo Tardelli Magalhães ответил: 13 июня 2018 в 06:16
Не могли бы вы объяснить, как это дубликат? Вы пробовали с похожим кодом, чем я опубликовал?