0

我最近开始研究 Node.js 和 Javascript 中的 U2F。我得到错误:TypeError: Cannot read property 'registerResponse' of undefined

在服务器上收到错误之前,我得到以下返回:

{errorCode: 5, errorMessage: "NotAllowedError: The operation either timed out or…://w3c.github.io/webauthn/#sec-assertion-privacy."}

服务器在 Mac os 的 localhost 上使用 HTTPS 和自签名证书

可能是什么问题?响应似乎是空的;而且我没有被要求在浏览器中插入 USB。

应用程序.js:

const U2F = require("u2f");
const Cors = require("cors");
const session = require("express-session");
const HTTPS = require("https");
const FS = require("fs");
const BodyParser = require("body-parser");
const express = require("express");

var app = express();
var routes = require("./routes")(app);

const APP_ID = "https://localhost:3000";

app.use(BodyParser.json());
app.use(BodyParser.urlencoded({ extended: true }));
app.use(session({ secret: "thepolyglotdeveloper", cookie: { secure: true, maxAge: 60000 }, saveUninitialized: true, resave: true }));
app.use(Cors({ origin: [APP_ID], credentials: true }));

HTTPS.createServer({
    key: FS.readFileSync("server.key"),
    cert: FS.readFileSync("server.crt")
}, app).listen(3000, () => {
    console.log("Listening at :443...");
});

路由.js

const U2F = require("u2f");
const session = require("express-session");

const APP_ID = "https://localhost:3000";

var appRouter = function(app) {

    var user;

    app.get("/", function(req, res, next) {
        res.sendFile(__dirname + '/index.html');
    });

    app.get("/register", function(req, res, next) {
        var session = U2F.request(APP_ID);
        app.set("session", JSON.stringify(session));
        console.log("session: " + JSON.stringify(session));
        res.send(session);
    });

    app.post("/register", function (req, res, next) {
        console.log("res2: " + req.body);

        var registration = U2F.checkRegistration(JSON.parse(app.get("session")), req.body.registerResponse);
        if(!registration.successful) {
            return res.status(500).send({ message: "error" });
        } else {
            console.log("error");
        }
        user = registration;
        res.send(registration);
    });

}

module.exports = appRouter;

索引.html

$("#register").click(() => {
                if(window.u2f && window.u2f.register) {
                    $.get("/register", result => {
                        console.log(result);
                        window.u2f.register(result.appId, [result], [], response => {
                            console.log(response);
                            $.post("/register", { registerResponse: response }, result => {
                                console.log(result);
                            });
                            console.log(response);
                        });
                    });
                } else {
                    document.write("<p>U2F is not supported</p>");
                }
            });

请求似乎超时或不允许。我试过寻找解决方案等等;但几乎没有关于这个问题的信息。

任何帮助深表感谢!

4

1 回答 1

1

var routes = require("./routes")(app);以前用过BodyParser。中间件按照它们初始化的顺序工作。所以,在你的情况下body-parser,甚至没有在路线中使用。

将路线放在bodyParserand之后cors

var app = express();

const APP_ID = "https://localhost:3000";

app.use(BodyParser.json());
app.use(BodyParser.urlencoded({ extended: true }));
app.use(session({ secret: "thepolyglotdeveloper", cookie: { secure: true, maxAge: 60000 }, saveUninitialized: true, resave: true }));
app.use(Cors({ origin: [APP_ID], credentials: true }))
var routes = require("./routes")(app);
于 2019-08-12T14:38:09.630 回答