首页 > 解决方案 > Okta Jwt-Verifier 不工作 - “jwt_verifier_1.OktaJwtVerifier 不是构造函数”

问题描述

在我的 SPA 中,编译我的 TypeScript,然后启动服务器后,我得到:
“TypeError:jwt_verifier_1.OktaJwtVerifier 不是构造函数”

我已经为 @okta/jwt-verifier 安装了模块,并安装了 npm 以确保模块在那里。

这是我的 auth.ts 文件,其中 import 语句被注释掉(因为我认为这不是解决模块问题的正确方法):


import { Request, Response, NextFunction } from 'express';
// import { OktaJwtVerifier } from '@okta/jwt-verifier';

const OktaJwtVerifier = require('okta/jwt-verifier');

const oktaJwtVerifier = new OktaJwtVerifier({
    clientId: '{{clientID}}',
    issuer: '{{OktaURL}}'
});

export async function oktaAuth(req:Request, res:Response, next:NextFunction) {
    try {
        const token = (req as any).token;
        if (!token) {
            return res.status(401).send('Not Authorised');
        }
        const jwt = await oktaJwtVerifier.verifyAccessToken(token);
        req.user = {
            uid: jwt.claims.uid,
            email: jwt.claims.sub
        };
        next();
    }
    catch (err) {
        return res.status(401).send(err.message);
    }
}

这是编译后的JS文件:


"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", { value: true });
const jwt_verifier_1 = require("@okta/jwt-verifier");
// const OktaJwtVerifier = require('okta/jwt-verifier');
const oktaJwtVerifier = new jwt_verifier_1.OktaJwtVerifier({
    clientId: '0oavj2s8pN39hTh0v356',
    issuer: 'https://dev-214594.okta.com/oauth2/default'
});
function oktaAuth(req, res, next) {
    return __awaiter(this, void 0, void 0, function* () {
        try {
            const token = req.token;
            if (!token) {
                return res.status(401).send('Not Authorised');
            }
            const jwt = yield oktaJwtVerifier.verifyAccessToken(token);
            req.user = {
                uid: jwt.claims.uid,
                email: jwt.claims.sub
            };
            next();
        }
        catch (err) {
            return res.status(401).send(err.message);
        }
    });
}
exports.oktaAuth = oktaAuth;

服务器应该在没有任何错误的情况下启动。

标签: node.jstypescriptserverjwtokta

解决方案


导入它的正确方法是使用:

import * as OktaJwtVerifier from '@okta/jwt-verifier';

此外,尚未为 TypeScript 正确声明类型。您需要在项目的根目录下创建一个 global.d.ts,如果您还没有这样做的话,其中包含:

declare module "@okta/jwt-verifier";

@okta/okta-sdk-node-js 可以使用相同的方法。


推荐阅读