Как заставить все экспресс-маршрутизаторы использовать код проверки - PullRequest
0 голосов
/ 16 мая 2018

Когда я создаю маршрутизатор, мне нужно добавить следующий код в каждый модуль:

const express = require("express")
const cookieParser = require('cookie-parser')()
const cors = require('cors')({origin: true})
const router = express.Router()
const firebase = require("./firebase.js")

// https://github.com/firebase/functions-samples/tree/master/authorized-https-endpoint
// Must have header 'Authorization: Bearer <Firebase ID Token>'
const validateFirebaseIdToken = (req, res, next) => {
  if ((!req.headers.authorization || !req.headers.authorization.startsWith('Bearer ')) &&
      !req.cookies.__session) {
    res.status(403).send({ "error": 'Unauthorized'})
    return
  }

  let idToken
  if (req.headers.authorization && req.headers.authorization.startsWith('Bearer ')) {
    // Read the ID Token from the Authorization header.
    idToken = req.headers.authorization.split('Bearer ')[1]
  } else {
    // Read the ID Token from cookie.
    idToken = req.cookies.__session
  }
  firebase.admin.auth().verifyIdToken(idToken).then((decodedIdToken) => {
    req.user = decodedIdToken
    return next()
  }).catch(error => {
    res.status(403).send({"error": 'Unauthorized'})
  })
}
router.use(cors)
router.use(cookieParser)
router.use(validateFirebaseIdToken)

// api functions go here

module.exports = router

Первоначально я имел это в отдельном файле и разделял маршрутизатор между модулями, однако совместное использование вызывало проблемы.Я не хочу копировать и вставлять этот код в каждый файл модуля ... Как я могу убедиться, что все маршрутизаторы созданы таким образом, без необходимости копировать и вставлять?

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Трудно понять, какой именно частью вы хотите поделиться, но если вы перетащите функцию validateFirebaseIdToken в ее собственный файл, вы сможете импортировать ее, как и все остальное. Это важно, потому что вы можете легко использовать его где угодно. У вас могут быть маршруты, которые не требуют аутентификации ... в этом случае вы не будете использовать это промежуточное ПО.

проверить-firebase-token.js

const firebase = require("./firebase.js")

const validateFirebaseIdToken = (req, res, next) => {
  if ((!req.headers.authorization || !req.headers.authorization.startsWith('Bearer ')) &&
      !req.cookies.__session) {
    res.status(403).send({ "error": 'Unauthorized'})
    return
  }

  let idToken
  if (req.headers.authorization && req.headers.authorization.startsWith('Bearer ')) {
    // Read the ID Token from the Authorization header.
    idToken = req.headers.authorization.split('Bearer ')[1]
  } else {
    // Read the ID Token from cookie.
    idToken = req.cookies.__session
  }
  firebase.admin.auth().verifyIdToken(idToken).then((decodedIdToken) => {
    req.user = decodedIdToken
    return next()
  }).catch(error => {
    res.status(403).send({"error": 'Unauthorized'})
  })
}

module.exports = validateFirebaseIdToken

... и теперь код вашего роутера выглядит так:

const express = require("express")
const cookieParser = require('cookie-parser')()
const cors = require('cors')({origin: true})
const router = express.Router()
const validateFirebaseIdToken = require('./validate-firebase-token')

router.use(cors)
router.use(cookieParser)
router.use(validateFirebaseIdToken)

// api functions go here

module.exports = router
0 голосов
/ 16 мая 2018

Как указано кем-то в ответах на мой другой вопрос , вы можете применять промежуточное ПО к приложению, а не к конкретному маршрутизатору. Таким образом, промежуточное ПО применяется ко всем запросам!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...