我目前正在使用wkhtmlpdf和nodejs创建pdf文档服务器端。客户端发送要呈现的html(可能包含带有源的img标记)。当用户在浏览器中预览html时,他们上传到他们帐户的图像显示正常,因为用户通过浏览器进行了身份验证,并且节点路径可以根据用户ID(保存到会话)和图像ID简单地查找图像(在每个图像请求中传递)。
问题是当图像试图在wkhtmltopdf webkit中呈现时,渲染器在通过节点的wkhtmltopdf的exec在单独的进程中发出图像请求时未经过身份验证。由于在无头wkhtmltopdf渲染器内发出请求时未设置会话,因此GET /user/images/<imageId>
之类的请求将失败。
有没有办法通过某些wkhtmltopdf选项传递身份验证,或者可能采用不同的身份验证方式?唯一的限制是不公开图像。
答案 0 :(得分:1)
前一段时间我问了一个类似的问题,可能对你有所帮助: Generate PDF Behind Authentication Wall
WKHTMLTOPDF有--cookie-jar
,其中应该为您提供所需内容。请注意,它不适合我,我最后用另一种解决方案回答了我自己的问题。简而言之,我通过CURL访问页面 - 更加灵活 - 然后写一个我转换为PDF的临时文件,然后删除临时文件。
一点点回合,但它完成了工作。
答案 1 :(得分:1)
为了实现身份验证,我允许cookie id标志(连接键默认为connect.sid)作为我的图像路由中的查询选项。唯一的“陷阱”是因为从服务器的角度请求图像,您必须确保所有图像路径都是绝对域路径而不是相对于您的应用程序(除非这两个路径相同)。
Expressjs的步骤:
设置id标志中间件,通过req.query (eg ?id=abc123 where abc123 is the req.cookies['connect.sid'], or req.signedCookies['connect.sid'] if your using a secret as you probably should )
检查查询中的sid。您可能需要确保首先设置查询中间件。
确保req.headers在cookie解析器之前包含此会话ID密钥和值,以便正确设置会话(eg if a cookie exists append a new one or if one does add it as the first req.headers.cookie = 'connect.sid=abc123;')
确保所有图片路径都包含完整的网址(eg https://www.yourdomain.com/images/imageId?id=abc123)
一些额外的tid位:图像源替换可能应该在服务器级别进行,以确保用户不会使用会话ID复制/粘贴图像URL,并将其通过电子邮件发送给朋友,这显然会为帐户打开门劫持。