認証にapi
を使用するjwt
があります。このAPIをvuejs
アプリに使用しています。私はアプリで画像を表示しようとしています
<img src="my/api/link" />
ただし、api
には、jwt token
を含むAuthorization
ヘッダーが必要です。
このようなブラウザリクエストにヘッダーを追加できますか(ここのいくつかの質問に対する回答により、それは不可能だと思われました)?
それを回避する方法はありますか(jsを使用)、またはapi
自体を変更する必要がありますか?
Imgタグでhrefとして直接使用される画像に対して認証を実行することはできません。画像に対してこのタイプの認証が本当に必要な場合は、ajaxを使用してそれらを取得し、htmlに埋め込む方が良いでしょう。
<img src="/api/images/yourimage.jpg?token=here-your-token">
バックエンドで、queryparamからJWTを検証します。
デフォルトでは、ブラウザはクッキーを送信しています。ヘッダーの{credentials: 'omit'}
を設定すると、Cookieがfetch
で送信されないようにすることができます。 [〜#〜] mdn [〜#〜]
完全なfetch
の例:
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) {
...
ログインすると、Webサイトで、webappは資格情報をbothlocalStorageおよび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
}
そのため、スマートフォンアプリケーションと同様に、webappはlocalStorageを使用します。ブラウザは、デフォルトでクッキーを送信することにより、すべての静的コンテンツ(img、video、href)を取得します。
サーバー側では、Cookieがない場合は、認証ヘッダーにCookieをコピーできます。
Node.js + expressの例:
.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();
})
私はそれが誰かを助けることを願っています。