Как использовать аутентификацию hapi-auth-jwt2 на пути в hapi.js? - PullRequest
0 голосов
/ 21 марта 2019

У меня проблема с использованием токена доступа в hapi.js.Я не могу понять, как я могу использовать этот токен для аутентификации.Я слежу за этой статьей dwyl / hapi-auth-jwt2 .Я использую mongodb в качестве базы данных.Но пока я не отправлю свой запрос, как этот http://localhost:8000/restricted?token=mycreatedtoken,, я не могу войти на {auth: 'jwt'} страниц.Но отправка запроса, как это, не кажется правильным.Так как я могу использовать этот токен?Разве мне не нужно сохранять это в локальном хранилище или базе данных для доступа?Это мой код:

app.js

 const jwt = require('jsonwebtoken');
 await server.register(require('hapi-auth-jwt2'));

    server.auth.strategy('jwt', 'jwt', {
        key: 'NeverShareYourSecret',
        validate: validate,
        verifyOptions: { algorithms: ['HS256'] }
      });
      server.auth.default('jwt');

проверка функции:

const validate = async (decoded, req) => {
let user = await User.findOne({ _id: decoded.id });
if (user) {
     req.user = user;
   return { isValid: true };
  } else {
   return { isValid: false };
 }
};

для входа в систему:

method: 'POST',
path: '/login',
config: { auth: false },
handler: async function(req, h) {
  try {
    let { username, password } = req.payload;
    let student = await student.findOne({
      username
    });
    let validUser = student && (await bcrypt.compareSync(password,student.password));

    if (validUser) {
      let token = jwt.sign({ id: user.id }, 'mysecretkey');
      console.log('tpken'+token);
     // return h.view('welcome');
      return { token };
    } else {
      return boom.unauthorized('incorrect pass');
    }
  } 
}

регистрация

method: 'POST',
path: '/student',
config: { auth: false },
handler: async function(req, h) {
  try {
    let salt = bcrypt.genSaltSync(10);
    req.payload.password = bcrypt.hashSync(req.payload.password, salt);

    let student = new User(req.payload); 
    let result = await student.save();
    const  expiresIn  =  24  *  60  *  60;
    let token = jwt.sign({ id: result.id }, 'mysecretkey',{ expiresIn:  expiresIn
    });
    return {token}   ;     

  } 
}

этот путь использует токен jwt.

 { 
    method: 'GET', 
    path: '/register',
    config: { auth: 'jwt' },
    handler: async (request, h) => {
        try {
              return h.view('student');
        } catch(err){
            return h.response(err).code(500);
        }
    }
 }

1 Ответ

1 голос
/ 22 марта 2019

Не могли бы вы поделиться своей функцией validate? Я понимаю, что вы можете сгенерировать токен JWT. Чтобы использовать этот токен для проверки подлинности вашего запроса, вам необходимо отправить этот токен с заголовком «Авторизация» в ваших запросах на ваш сервер.

Я использую реагирование для внешнего интерфейса, и это моя установка для отправки токена JWT на сервер.

import axios, {AxiosInstance} from 'axios';

const createClient: () => AxiosInstance = () => {
    const options = {
        baseURL: process.env.REACT_APP_API_URL,
        responseType: 'json',        
        withCredentials: true,
        headers: {
            'X-Requested-With': 'XMLHttpRequest',
            'Authorization': ''
        },
    };

    const instance = axios.create(options);

    // Set the AUTH token for any request
    // ref: https://stackoverflow.com/questions/43051291/attach-authorization-header-for-all-axios-requests
    instance.interceptors.request.use(function (config) {        
        const token = localStorage.getItem("USER_JWT_TOKEN");
        config.headers.Authorization = token ? `Bearer ${token}` : '';     

        return config;
    });

    return instance;
};

export default createClient();

Затем, когда я делаю запросы с этой настройкой, axios автоматически отправляет заголовки аутентификации во всех моих запросах.

import apiClient from "./apiClient";

const results = await apiClient.get(`/users`);

Существует предварительный просмотр запроса, который я скопировал с сетевой панели Chrome.

curl 'https://myserver.com/users' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36' -H 'Accept: application/json, text/plain, */*' -H 'Referer: https://myserver.com/' -H 'Origin: https://myserver.com' -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...... long JWT token string here' -H 'X-Requested-With: XMLHttpRequest' --compressed
...