Как правильно обрабатывать ошибки и не показывать каталог папки - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь создать свой собственный бэкэнд-сервер с нуля, используя Apollo Server 2 для своего школьного проекта, и пытаюсь создать функции безопасности для авторизации и аутентификации, но не уверен, должен ли я сделать это так

Я не совсем уверен, правильно ли я буду обрабатывать ошибки для авторизации пользователя, и при возникновении ошибки сервер ответит на ошибку с помощью stacktrace, включая каталоги моих папок на сервере.

Я пробовал много способов ииспользуя блок try catch, минимизируйте ошибки, которые я получаю.

Auth.js / auth

import JWTR from 'jwt-redis'
import Redis from 'ioredis'

const redis = new Redis({
  ....
})

const jwtr = new JWTR(redis)
const token = req => req.headers.authorization.replace('Bearer', '').trim()
export const attemptSignIn = async (email, password) => {
    var user = await User.findOne({ email })

    if (!user || !await user.matchesPassword(password)) {
        throw new AuthenticationError(INVALID_CREDENTIAL)
}

const payload = await jwtr.sign({ id: user.id }, JWT_SECRET)
user.token = payload
return user
}

export const decodeAuthToken = async req => {
    if (!token(req)) {
        throw new AuthenticationError(NO_JWT)
    }
    try {
        const payload = await jwtr.verify(token(req), JWT_SECRET)
        return payload
    } catch (error) {
        throw new AuthenticationError(INVALID_JWT)
    }
}

export const checkAuthToken = async req => {
    console.log(token(req))
    if (!token(req)) {
        throw new AuthenticationError(NO_JWT)
    }
    try {
        const payload = await jwtr.verify(token(req), JWT_SECRET)
        if (payload) {
            return true
        }
    } catch (error) {
        throw new AuthenticationError(INVALID_JWT)
    }
    return false
}

user.js / resolvers

import * as Auth from '../auth'
users: async (root, args, { req }, info) => {
    // Auth.checkSignedIn(req)
    await Auth.checkAuthToken(req)
    return User.find({})
},

Я ожидаю эту ошибкусообщение, но без получения этой конкретной информации об ошибке -> / Users / firmanjamal / Desktop / School Project / FYP / backend / src / auth.js: 68: 11)

"    at Proxy.checkAuthToken (/Users/firmanjamal/Desktop/School Project/FYP/backend/src/auth.js:68:11)",
        "    at process.internalTickCallback (internal/process/next_tick.js:77:7)"

"errors": [
{
  "message": "The JWT you supply is not valid or already expired.",
  "locations": [
    {
      "line": 2,
      "column": 3
    }
  ],
  "path": [
    "user"
  ],
  "extensions": {
    "code": "UNAUTHENTICATED",
    "exception": {
      "stacktrace": [
        "AuthenticationError: The JWT you supply is not valid or already expired.",
        "    at Proxy.checkAuthToken (/Users/firmanjamal/Desktop/School Project/FYP/backend/src/auth.js:68:11)",
        "    at process.internalTickCallback (internal/process/next_tick.js:77:7)"
      ]
    }
  }
}
],

1 Ответ

0 голосов
/ 30 декабря 2018

Из документов :

Чтобы отключить трассировки стека для производства, передайте debug: false конструктору сервера Apollo или установите для переменной среды NODE_ENV значение «production» или «test».».Обратите внимание, что это сделает трассировку стека недоступной для вашего приложения.

Другими словами, трассировка стека включена по умолчанию, но только когда переменная среды NODE_ENV не установлена ​​на production.Если вы хотите опустить трассировку стека, даже в процессе разработки, создайте свой ApolloServer следующим образом:

new ApolloServer({ typeDefs, resolvers, debug: false })
...