【问题标题】:express-openid-connect with TypeScript使用 TypeScript 的 express-openid-connect
【发布时间】:2022-02-02 03:31:26
【问题描述】:

我正在尝试使用此库 (express-openid-connect) 提供具有“简单设置”的身份验证后端,但在从 express.Request 调用 oidc 对象时遇到一个简单错误:

app.get("/", (req: express.Request, res: express.Response) => {
    res.send(req.oidc.isAuthenticated() ? "Hi user" : "Hi guest");
});

当然,我得到了这个错误:

“Request”类型上不存在属性“oidc”。ts(2339)

到目前为止,我已经尝试实现一个接口来替换 express.Request,但我遇到了更多错误:

interface OIDRequest extends express.Request {
    oidc: OpenidRequest
}

app.get("/", (req: OIDRequest, res: express.Response) => {
    res.send(req.oidc.isAuthenticated() ? "Hi user" : "Hi guest");
});

现在:

没有重载匹配这个调用。

Overload 1 of 4, '(path: PathParams, ...handlers: RequestHandler[]): Express',给出以下错误。

'(req: OIDRequest, res: express.Response) => void' 类型的参数不可分配给'RequestHandler' 类型的参数。

参数“req”和“req”的类型不兼容。

“Request”类型中缺少属性“oidc”,但在“OIDRequest”类型中是必需的。

Overload 2 of 4, '(path: PathParams, ...handlers: RequestHandlerParams[]): Express',给出以下错误。

'(req: OIDRequest, res: express.Response) => void' 类型的参数不可分配给'RequestHandlerParams' 类型的参数。

类型 '(req: OIDRequest, res: express.Response) => void' 不可分配给类型 'RequestHandler'。

Overload 3 of 4, '(path: PathParams, subApplication: Application): Express',给出以下错误。

'(req: OIDRequest, res: express.Response) => void' 类型的参数不可分配给'Application' 类型的参数。

类型 '(req: OIDRequest, res: Response) => void' 缺少类型 'Application' 中的以下属性:init、defaultConfiguration、engine、set 和 61 more.ts(2769)

以防万一你问我的应用是这样配置的:

import express from 'express';
import { auth, ConfigParams, OpenidRequest } from 'express-openid-connect';

require('dotenv').config();

const app = express();

const config: ConfigParams = {
    authRequired: false,
    auth0Logout: true,
    issuerBaseURL: process.env.ISSUER_BASE_URL,
    baseURL: process.env.BASE_URL,
    clientID: process.env.CLIENT_ID,
    secret: process.env.SECRET,
};

app.use(auth(config));

interface OIDRequest extends express.Request {
    oidc: OpenidRequest
}

app.get("/", (req: OIDRequest, res: express.Response) => {
    res.send(req.oidc.isAuthenticated() ? "Hi user" : "Hi guest");
});

app.get("/profile", (req: express.Request, res: express.Response) => {
    res.json(req.oidc.user);
});

const port = process.env.PORT || 8080;
app.listen(port, () => {
    console.log(`Listening to port: ${port}`);
});

我在这里问之前找到了一些答案,但这些不适用于这种情况。我应该如何从express.Request 对象调用oidc

【问题讨论】:

    标签: node.js typescript express auth0


    【解决方案1】:

    我们最近切换到express-openid-connect,不得不使用这种方法与 OIDC 交互。

        app.get('/api/me', async (req, res) => {
            const userInfo = await req['oidc']?.fetchUserInfo();
            res.json({
                info: req['oidc']?.user,
                userInfo
            });
        });
    

    【讨论】:

    • 我猜你的 TypeScript 的非默认 strict 属性标记为 false,对吧?
    【解决方案2】:

    我最近在我的项目中使用了express-openid-connect,我就是这样做的。基本上,我已经使用以下代码在我的项目根目录中创建了一个namespace.d.ts 文件。

    import { Request } from 'express';
    import { OpenidRequest } from 'express-openid-connect';
    declare module 'express' {
        interface Request {
            openId?: OpenidRequest
        }
    }
    

    然后像这样使用它:

    app.get("/profile", (req: Request, res: Response) => {
       const user = req.openId?.oidc.user
        res.status(200).json({user});
    });
    

    【讨论】:

      【解决方案3】:

      从 2022 年初开始,当您尝试导入 import { OpenidRequest } from 'express-openid-connect'; 你会收到一条警告,说它已被弃用。

      @不推荐使用 改用原生的 express 的 Request 接口;它已被扩展 > 现在包括一个内置的 oidc 参数。

      所以你应该能够做到这一点:

      app.use(auth());
      
      app.get('/profile', (req: Express.Request, res: Express.Response) => {
        const user = req.oidc.user;
        ...
      })
      

      【讨论】:

        【解决方案4】:

        还有关于此的更多文档吗? 我也找不到让它工作的方法......

        Property 'oidc' does not exist on type 'Request'.ts(2339)
        

        我注意到了已弃用的警告,但它并没有太大帮助... 我正在使用 Nuxt2 和 Express。

        【讨论】:

        猜你喜欢
        • 2022-10-30
        • 2021-10-24
        • 1970-01-01
        • 2020-09-13
        • 2015-10-09
        • 1970-01-01
        • 2020-10-23
        • 1970-01-01
        • 2019-04-14
        相关资源
        最近更新 更多