当前位置: 首页 > 知识库问答 >
问题:

如何使用hapi-auth-jwt2认证的路径上hapi.js?

单于善
2023-03-14

我在hapi.js.中使用访问令牌时遇到问题,我无法理解如何使用该令牌进行身份验证。我正在关注这篇文章dwyl/hapi-auth-jwt2。我使用mongoDB作为我的数据库。但是在我像这样http://localhost:8000/restricted?token=mycreatedtoken发送请求之前,我不能登录{auth:'jwt'}页面。但是像这样发送请求似乎不对。那么我如何使用那个代币呢?我不需要保存在本地存储或数据库中才能访问吗?这是我的代码:

应用程序。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个答案

须旭
2023-03-14

你能分享一下你的验证函数吗?我知道您可以生成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预览。

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
 类似资料:
  • 首先,我不完全确定这是正确的问题。基本上,我的最终目标是生成一个可以操作一组。docx文件的程序,以便对每个文件进行小的更改。在我看来,docx4j是实现这一目标的最佳方式。但是,我从来没有使用过提供的库之外的库。我首先试图破译手册中提供的所有信息,然后告诉我需要SLF4J才能使用Docx4J。 从这一点来看,我想我做错了什么。我很确定我知道我想写的程序背后的伪逻辑,但我不确定如何写它。我还没有做

  • 问题内容: 谁能告诉我如何使用nodejs和HAPI上传文件? 我在处理程序中获取二进制数据。 这是我的html代码: 这是我的Nodejs代码: 问题答案: 最后,我得到了使用HAPI上传大型文件的解决方案,并感谢Roman。 解决方法如下: server.js代码 处理程序代码:

  • 在Canvas中绘图,其实就是先按照一定顺序定义一些坐标点,再通过指定的方式,用画笔将这些坐标点连接起来,就形成我们所需要的图形。 Canvas中的所有基本图形,包括线段、矩形、圆弧、贝塞尔曲线等,都是基于路径进行绘制的。 Canvas中,把从绘制起点到绘制终点所经过的这些点,就称为路径。一个路径可以包含多个子路径,子路径又是由两个或多个点组成。在某一时刻,canvas中只能有一条路径存在,can

  • 问题内容: 在将我的PHP配置完全搞乱之后,尝试使SOAP模块正常工作(-bash:/ usr / bin / php:没有这样的文件或目录…。)我现在必须使用MAMP,但是每次必须键入路径 如何只键入php而不是MAC上的整个路径? 我仔细检查过,但没有一个名为nor 的文件 谢谢 PS:这是输出echo $ PATH的内容: 问题答案: 每次保存MAMP config(PHP部分)时,它将在文

  • 请帮助使用firebase身份验证在云运行中进行最终用户身份验证。 更多详情: 我有一个简单的firebase应用程序与电子邮件/密码firebase认证。当user1(比如test@test.com)使用电子邮件/密码进行身份验证时,我使用firebase.user.getidtoken()为该用户获取Id令牌,并将其提交给firebase函数。 在firebase函数端,我提取用户令牌并将其作

  • 那里我需要与建立https连接https://free.temafon.ru但我在Android2.3及以下版本上遇到了CertPathValidator异常。我做了什么。 > 最终密钥库密钥库=密钥库。getInstance(“BKS”); 在这里,我使用custom TrustManager,因为服务器以错误的顺序发送证书。 此代码在Android 4.0上运行良好,但在2.3上失败,