koa+jwtはtoken検証とリフレッシュ機能を実現します。
JWT
JSON Web Token(JWT)は、JSONオブジェクトとして各当事者間で安全に情報を伝送するためのコンパクトで自己含める方法を定義するオープン基準(RFC 7519)である。この情報はデジタル署名のために検証され信頼されます。
本文はKoo 2+jwtの使用だけを話します。JWTを知らないならここに来てください。
コア環境
koa 2+jwtを使うにはまずkoaの空き環境が必要です。環境に乗るのは面倒くさいです。直接にコアを使ってスタート式を作ります。これは私がkoa+typescriptを使って作った空環境です。もしあなたもよくコアでデモトを書いたら、スターを注文してもいいです。便利です。
koa-jwtの取り付け
koa-jwtの主要な役割はどのルートを制御するかを確認するためにjwtが必要です。どのインターフェースが検証されていませんか?
関連コード:
パラメータの意味: payload:キャリア、一般的にユーザ情報をキャリアとしてtoken を生成する。 secret:秘密鍵は文字列でもいいし、ファイル でもいいです。 expires In:賞味期限1 hは 時間を表しています。
ログイン中にtokenに戻る
フロントエンドはログインによって戻ってきたtokenを持ってきて、local Strageに存在して、その後の要求の中にtokenを要求ヘッドのAuthorzationに置いてサービスを提供することができます。
ここではaxios要求を例にとって、要求を送信する際に、要求ブロックを介してtokenをheaderにセットする:
フロントエンド送信要求はtokenを携帯し、バックエンドは以下の点を判断する必要がある:
tokenが正しいかどうか、正しくないとエラーに戻ります。
tokenは期限が切れているかどうか、期限が切れたらtokenを更新します。または401に戻ります。新規登録が必要です。
上の2点については後端に中間部品を書いて完成します。
バックエンドがtokenの先端を更新するにはtokenを更新する必要があります。
バックエンドが新しいtokenに変更された後、先端も新しいtokenを取得する必要があります。
バックエンド更新のtokenは応答ヘッドにあるので、フロントエンドは応答ブロックにおいて新しいtokenを取得する必要がある。
相変わらずaxiosを例にします。
以上は小编が绍介したkoa+jwtがtokenの検证と更新の机能を実现しました。皆さんのために役に立つことを望んでいます。ここでも私たちのサイトを応援してくれてありがとうございます。
JSON Web Token(JWT)は、JSONオブジェクトとして各当事者間で安全に情報を伝送するためのコンパクトで自己含める方法を定義するオープン基準(RFC 7519)である。この情報はデジタル署名のために検証され信頼されます。
本文はKoo 2+jwtの使用だけを話します。JWTを知らないならここに来てください。
コア環境
koa 2+jwtを使うにはまずkoaの空き環境が必要です。環境に乗るのは面倒くさいです。直接にコアを使ってスタート式を作ります。これは私がkoa+typescriptを使って作った空環境です。もしあなたもよくコアでデモトを書いたら、スターを注文してもいいです。便利です。
koa-jwtの取り付け
koa-jwtの主要な役割はどのルートを制御するかを確認するためにjwtが必要です。どのインターフェースが検証されていませんか?
import * as koaJwt from 'koa-jwt';
// path token
app.use(
koaJwt({
secret: secret.sign
}).unless({
path: [/^\/login/, /^\/register/]
})
);
上のコードの中には登録、登録インターフェース以外にjwt検証は必要ないです。他の要求は全部必要です。jsonwebtoken
を用いてtokenを生成、検証する。npm install jsonwebtoken
を実行してjsonwebtoken
をインストールします。関連コード:
import * as jwt from 'jsonwebtoken';
const secret = 'my_app_secret';
const payload = {user_name:'Jack', id:3, email: '[email protected]'};
const token = jwt.sign(payload, secret, { expiresIn: '1h' });
上のコードではjwt.signによってtokenが生成され、パラメータの意味:
ログイン中にtokenに戻る
import * as crypto from 'crypto';
import * as jwt from 'jsonwebtoken';
async login(ctx){
//
const user = await userRespository.findOne({
where: {
name: user.name
}
});
//
const psdMd5 = crypto
.createHash('md5')
.update(user.password)
.digest('hex');
// md5 token
if (user.password === psdMd5) {
// token
token = jwt.sign(user, secret, { expiresIn: '1h' });
//
ctx.body = {
token
}
}
}
フロントブロックフロントエンドはログインによって戻ってきたtokenを持ってきて、local Strageに存在して、その後の要求の中にtokenを要求ヘッドのAuthorzationに置いてサービスを提供することができます。
ここではaxios要求を例にとって、要求を送信する際に、要求ブロックを介してtokenをheaderにセットする:
//
axios.interceptors.request.use(function(config) {
// localStorage token
const token = localStorage.getItem('tokenName');
// token Authorization
config.headers.Authorization = `Bearer ${token}`;
return config;
},
function(error) {
// Do something with request error
return Promise.reject(error);
}
);
サービス処理の先端から送られてきたTokenフロントエンド送信要求はtokenを携帯し、バックエンドは以下の点を判断する必要がある:
tokenが正しいかどうか、正しくないとエラーに戻ります。
tokenは期限が切れているかどうか、期限が切れたらtokenを更新します。または401に戻ります。新規登録が必要です。
上の2点については後端に中間部品を書いて完成します。
app.use((ctx, next) => {
if (ctx.header && ctx.header.authorization) {
const parts = ctx.header.authorization.split(' ');
if (parts.length === 2) {
// token
const scheme = parts[0];
const token = parts[1];
if (/^Bearer$/i.test(scheme)) {
try {
//jwt.verify token
jwt.verify(token, secret.sign, {
complete: true
});
} catch (error) {
//token token
const newToken = getToken(user);
// token Authorization
ctx.res.setHeader('Authorization', newToken);
}
}
}
}
return next().catch(err => {
if (err.status === 401) {
ctx.status = 401;
ctx.body =
'Protected resource, use Authorization header to get access
';
} else {
throw err;
}});
});
上の中間部品はtokenを検証する必要がある時はここを歩くべきです。ブロックとして理解できます。このブロックでtokenが正しいかどうかを判断し、有効期限が切れているかを処理して対応します。バックエンドがtokenの先端を更新するにはtokenを更新する必要があります。
バックエンドが新しいtokenに変更された後、先端も新しいtokenを取得する必要があります。
バックエンド更新のtokenは応答ヘッドにあるので、フロントエンドは応答ブロックにおいて新しいtokenを取得する必要がある。
相変わらずaxiosを例にします。
//
axios.interceptors.response.use(function(response) {
// token
const { authorization } = response.headers;
// token localStorage
authorization && localStorage.setItem('tokenName', authorization);
return response;
},
function(error) {
if (error.response) {
const { status } = error.response;
// 401 405
if (status == 401 || status == 405) {
history.push('/login');
}
}
return Promise.reject(error);
}
);
締め括りをつける以上は小编が绍介したkoa+jwtがtokenの検证と更新の机能を実现しました。皆さんのために役に立つことを望んでいます。ここでも私たちのサイトを応援してくれてありがとうございます。