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が必要です。どのインターフェースが検証されていませんか?

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が生成され、
パラメータの意味:
  • payload:キャリア、一般的にユーザ情報をキャリアとしてtoken
  • を生成する。
  • secret:秘密鍵は文字列でもいいし、ファイル
  • でもいいです。
  • expires In:賞味期限1 hは
  • 時間を表しています。
    ログイン中に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の検证と更新の机能を実现しました。皆さんのために役に立つことを望んでいます。ここでも私たちのサイトを応援してくれてありがとうございます。