当前位置: 首页 > 知识库问答 >
问题:

img src 链接中的授权标头

皇甫琛
2023-03-14

我有一个使用< code>jwt进行身份验证的< code>api。我正在为一个< code>vuejs应用程序使用这个api。我试图在应用程序中显示图像,使用

<img src="my/api/link" />

但是api需要授权header,其中包含

我可以像这样在浏览器请求中添加标题吗(这里回答的几个问题让我相信这是不可能的)?

有没有办法(使用js)或者我应该改变<code>api</code>本身?

共有3个答案

温亮
2023-03-14

您可以使用服务工作进程截获 img 提取,并在命中服务器之前添加带有 JWT 令牌的授权标头。描述见:

  • https://www.sjoerdlangkemper.nl/2021/01/06/adding-headers-to-image-request-using-service-workers/
  • https://www.twelve21.io/how-to-access-images-securely-with-oauth-2-0/#:~: text=4.使用服务工人
孙弘博
2023-03-14

默认情况下,浏览器会发送cookies。如果设置了header的< code > { credentials:' omit ' } ,则可以防止在< code>fetch中发送cookie。MDN

完整提取示例:

const user = JSON.parse(localStorage.getItem('user'));
let headers = {};

if (user && user.token) {
  headers = { 'Authorization': 'Bearer ' + user.token };
} 

const requestOptions = {
    method: 'GET',
    headers: headers,
    credentials: 'omit'
};

let req = await fetch(`${serverUrl}/api/v2/foo`, requestOptions);
if (req.ok === true) {
...

现在,当您登录时,在您的网站中,webapp可以将凭据保存到本地存储和cookie中。示例:

let reqJson = await req.json();
// response is: {token: 'string'}
//// login successful if there's a jwt token in the response
if (reqJson.token) {
    // store user details and jwt token in local storage to keep user logged in between page refreshes
    localStorage.setItem('user', JSON.stringify({token: reqJson.token}));
    document.cookie = `token=${reqJson.token};`; //set the cookies for img, etc
}

因此,您的 Web 应用程序使用 localStorage,就像您的智能手机应用程序一样。浏览器默认通过发送cookie来获取所有静态内容(img,视频,href)。

在服务器端,如果没有授权头,您可以将cookie复制到授权头。

Node.js表示示例:

.use(function(req, res, next) { //function setHeader
  if(req.cookies && req.headers &&
     !Object.prototype.hasOwnProperty.call(req.headers, 'authorization') &&
     Object.prototype.hasOwnProperty.call(req.cookies, 'token') &&
     req.cookies.token.length > 0
   ) {
    //req.cookies has no hasOwnProperty function,
    // likely created with Object.create(null)
    req.headers.authorization = 'Bearer ' + req.cookies.token.slice(0, req.cookies.token.length);
  }
  next();
})

我希望它对某人有所帮助。

贺经纶
2023-03-14

您不能对在img标签中直接用作href的图像执行身份验证。如果您真的希望对您的图像进行这种类型的身份验证,那么最好使用ajax获取它们,然后嵌入到您的html中。

 类似资料:
  • 我正在使用令牌式认证过程。客户端获得令牌后,它或者被设置在客户端的cookies中(对于Web),或者被设置在客户端请求的授权头中(对于移动设备)。但是,为了获得有效的令牌,客户端必须首先使用有效的用户名/密码组合“登录”。我的问题是: 通过在授权标头中发送用户名/密码组合与作为请求的JSON正文中的参数(假设我使用的是HTTPS)是否有任何额外的安全性? 我只需要在每次会话中发送用户名/密码组合

  • 问题内容: 我一直在尝试使用axios向National Park Service API发出GET请求,并尝试了几种方法将请求标头中的API密钥设置为无效。任何帮助将不胜感激。 我努力了: 和 都返回401。当我在Postman中发送GET请求时工作,我在密钥字段中输入Authorization,在值字段中输入我的API密钥。 谢谢。 问题答案: 此问题是由浏览器中的CORS OPTIONS请求

  • HTTP规范说; HTTP访问身份验证在“HTTP身份验证:基本和摘要访问身份验证”[43]中进行了描述。如果请求经过身份验证并指定了一个领域,则相同的凭据应该对该领域内的所有其他请求有效(假设身份验证方案本身不需要其他凭据,例如根据质询值变化的凭据或使用同步时钟)。 我真的不明白这意味着什么,但这是我的情况,这里有反对 HTTP 规范的东西吗?我使用 Java Rest 服务 客户端使用HTTP

  • 我正在尝试从这个 API 调用中创建“UUID”,我正在使用 axios 和 vue.js。这是我的源代码。 但不幸的是,我得到了 在'访问XMLHttpRequesthttps://www.uuidtools.com/api/generate/v1'从原点'http://localhost:8080'已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“access c

  • 问题内容: 我正在尝试发送跨域域并添加自定义的“授权”标头。请参见下面的代码。 错误: XMLHttpRequest无法加载{url}。请求标头字段Access-Control-Allow-Headers不允许授权。 我也尝试过: 在ajax请求中。 可能是jquery-ajax框架阻止了跨域身份验证?我怎样才能解决这个问题? 更新: 顺便说一句:是否有一种更安全的方法将auth.key存储在客户