【问题标题】:auth and redirection with totp (speakeasy)使用 totp 进行身份验证和重定向(speakeasy)
【发布时间】:2020-07-11 10:07:34
【问题描述】:

我用 SpeakEasy 做了一个 TOTP(基于时间的唯一密码),一切正常,我设置了一个条件(在代码末尾)来验证令牌,然后将其重定向到隐藏页面,但它没有工作,我不知道为什么。 谢谢你的帮助

views/validate.ejs


<form method='post' action='/hidden'>
    <input type="text" name="TokenClient" placeholder="your password">
    <button type="submit">submit</button>
</form>

<p><strong>remain :</strong><%= remaining %></p>

<p>
    <strong>token client :</strong><%= user %></br>
</p>

<strong>validation :</strong><%= valid %></br> 

views/hidden.ejs

&lt;h1&gt;Hidden Page&lt;/h1&gt;

apps.js

const Express = require("express");
const BodyParser = require("body-parser");
const Speakeasy = require("speakeasy");
const app = Express();

app.use(BodyParser.json());
app.use(BodyParser.urlencoded({ extended: true }));

// EJS /////////////////////////
app.set("views", "./views");
app.set("view engine", "ejs");

// Menu = OK ///////////////////
app.get("/", (req, res) => {
  res.render("index", {});
});

// Secret Key = OK /////////////
app.get("/totp-secret", (req, res) => {
  //let secret = Speakeasy.generateSecret({ length: 20 }).base32;
  let secret = "azerty";
  res.render("secret", { secret });
});

// TOKEN = OK //////////////////
app.get("/totp-generate-token", (req, res) => {
  let token = Speakeasy.totp({
    secret: req.body.secret,
    encoding: "base32",
  });
  let remaining = 30 - Math.floor((new Date().getTime() / 1000.0) % 30);

  res.render("token", { token, remaining });
});

//Validation/////////////////////
app.get("/totp-validate", (req, res) => {
  let remaining = 30 - Math.floor((new Date().getTime() / 1000.0) % 30);
  ///////////////////////////////
  let user = req.body.TokenClient;
  ///////////////////////////////
  let valid = Speakeasy.totp.verify({
    secret: req.body.secret,
    encoding: "base32",
    token: req.body.TokenClient, // Token Client
    window: 0,
  });

  res.render("validate", { remaining, user, valid });
});

app.post("/totp-validate", (req, res) => {
  let remaining = 30 - Math.floor((new Date().getTime() / 1000.0) % 30);

  let user = req.body.TokenClient;

  let valid = Speakeasy.totp.verify({
    secret: req.body.secret,
    encoding: "base32",
    token: req.body.TokenClient, // Token Client
    window: 0,
  });

  // Probleme here !!! ////////////////////////////
  if (valid) {
    res.redirect("/hidden");
    console.log("valide");
  } else {
    res.redirect("/totp-validate");
  }

  res.render("validate", { remaining, user, valid });
});

app.listen(3000, () => {
  console.log("Listening at :3000...");
});

变量“有效”是一个布尔值

【问题讨论】:

  • 1) 您必须选择是使用render() 还是redirect() 来发送回复。你不能同时使用它们。 2) 你想在哪里打电话给toHiddenPage()?它只是写出来的,但从未触发过。 3)您似乎设置了 next 参数,但甚至没有使用它。你是想用路由还是中间件结束?
  • 感谢您的帮助fedesc,我用您的指令更新了我的代码,但我有同样的消息Cannot POST /hidden

标签: javascript node.js express speakeasy


【解决方案1】:

我不太确定您的问题,但是我知道问题所在。 您的表单通过 POST 请求重定向到 /hidden 页面,并且 express 不知道如何处理

当用户完成表单时,这个函数应该处理响应:

app.post('hidden', (req, res) => { /* Your code here */ });

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 2021-05-13
    • 2021-12-18
    • 1970-01-01
    • 2022-11-11
    • 2019-03-12
    相关资源
    最近更新 更多