在 img 标签中显示从 API 到 Next.js 客户端的受保护图像

Show protected image from API to Next.js client in an img tag

我正在尝试显示我的 Node.js 后端资产文件夹中的受保护图像。

它有一个中间件来检查用户是否登录并有权访问文件。

在客户端我想在 img 标签中显示图像:

有没有办法拦截这个传递用户令牌的请求,以便他能够访问图像?

谢谢

您可以通过以下方式之一实现:

  1. 使用 Cookie 进行身份验证
  2. 使用token作为图片的查询参数URL

Cookies

登录时可以向浏览器发送cookies,使用中间件验证用户是否有权限查看图片。

router.use("/uploads", function(req, res, next) {
    // Check if the user is loged in
    if (req.isAuthenticated()) {
    next();
    } else {
        res.status(401).send("You are not authorized to view this page");
    }
});

// Static files
router.use("/uploads", express.static(path.join(__dirname, 'public')));

令牌

类似地,您可以使用这样的令牌

<img src="localhost:5000/uploads/image.png?token=xxxxxxxxxxxxxx" />

router.use("/uploads", function(req, res, next) {
    // Check if the user is loged in
    if (req.query.token && checkToken(req.query.token)) {
        next();
    } else {
        res.status(401).send("You are not authorized to view this page");
    }
});

// Static files
router.use("/uploads", express.static(path.join(__dirname, 'public')));

注意:此代码以express为例。你必须在你使用的任何库中实现这个中间件。

使用 blob 可以延迟将从后端 API 下载的图像绑定到 < img > 标签

<img id="image"/>

来自 API 的响应被传递给下面的函数

function response(e) {
   var urlCreator = window.URL || window.webkitURL;
   var imageUrl = urlCreator.createObjectURL(this.response);
   document.querySelector("#image").src = imageUrl;
}