Javascript 如何在hapi.js上的路径上使用hapi-auth-jwt2身份验证?

Javascript 如何在hapi.js上的路径上使用hapi-auth-jwt2身份验证?,javascript,node.js,jwt,hapijs,Javascript,Node.js,Jwt,Hapijs,在hapi.js中使用访问令牌有一个问题。我无法理解如何使用该令牌进行身份验证。我正在关注这篇文章。我使用mongodb作为我的数据库。但在我像这样发送请求之前,我无法登录{auth:'jwt'}页面。但是像这样发送请求似乎并不正确。那我怎么用这个代币呢?我不需要将其保存在本地存储或数据库中才能访问吗?这是我的代码: app.js const jwt = require('jsonwebtoken'); await server.register(require('hapi-auth-jwt

在hapi.js中使用访问令牌有一个问题。我无法理解如何使用该令牌进行身份验证。我正在关注这篇文章。我使用mongodb作为我的数据库。但在我像这样发送请求之前,我无法登录{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);
        }
    }
 }

您能分享一下您的
验证
功能吗?我知道您可以生成JWT令牌。为了使用该令牌对您的请求进行身份验证,您需要将请求上带有“Authorization”头的令牌发送到服务器

我使用react作为前端,这是我向服务器发送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预览

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

我添加了验证函数。我也愿意使用react作为前端,但我不确定如何发送您的validate函数,但您应该在else语句中返回
{isValid:false}
。只有当您有一个向api后端发出请求的单页应用程序时,JWT才是合乎逻辑的。当您试图从服务器中提取数据时,需要向请求中添加授权标头。假设这是我想要进行身份验证的路径
。在服务器上,我已将
/add
路径的auth设置为“jwt”。但直到我提交post按钮,页面才显示401错误。但是在单击之后,如果没有设置令牌,我会得到auth error,但是我想要的是,如果没有该令牌,页面不应该显示,而不是页面的元素