通常は2つの方法がありありユーザー認証、1は認証Cookieに基づいており、もう一方はトークン認証方式をベースにしています。現在の一般的には間違いなく、認証トークンに基づいています。KOA koa2バージョンを記載されている以下。
利点認証トークンは、これに基づいて、ステートレス機構であり、自然に正面達成することができるとクロスドメインの分離の後端部。
欠点は、認証トークンサーバ、それを検証する必要があるたびに、追加の運転圧力をもたらすことです。さらに、ユーザプロセスを制御または異常のステートレスAPIの不足では、このようなリプレイ攻撃などの異常を避けるために、それらのほとんどは、短い有効期限を設定します。
準備
KOA-JWT一般的なプロセスを使用することです。
有効期間内で、現在のユーザーのトークンのIDを取得することにより1.ユーザー認証API(ログイン)
2.あなたが以前に認証トークンを持参する必要があります必要が認証APIは、サーバーに送信されます
3. KOAは、認証のためのデフォルトの認証KOA-JWTのミドルウェアを使用しますが、ミドルウェアを検証し、シャントの失敗の成功を検証します。
3つの方法でKOA-JWTミドルウェアの認証:
1.認可要求ヘッダはスペースベアラベアラ+トークン、注目するために設けられています。(興亜-JWTデフォルトの認証)
{ '許可': "ベアラ" +トークン}
2.カスタム入手トークン方法
3.クッキーは、ここだけのサーバーに分散ストレージ媒体の領域として、サーバはセッションメカニズムの検証に依存しない(このクッキークッキーもその)クッキーの使用は、サーバがどのような状態を保存しません。
実際のロジック:
検証をルーティングでログインし、ユーザーは名前のように、必要な情報を伝達し、コンテキストオブジェクトにそれを置いてもよいです。
router.post( '/ログイン'、非同期(CTX、次)=> { CONSTユーザー= ctx.request.body; IF(ユーザ&& user.username === 'テイト'){ } {ユーザー名せ=ユーザー; CONSTトークン=記号({ユーザー名、テスト: 'testok'}、秘密の、{expiresIn '1H'}); ctx.body = { mssage: 'TOKEN成功を得る'、 コード:1、 トークン } }他{ ctx.body = { メッセージ: 'PARAMエラー' コード:-1 } } })
2.クライアントが正常にログオンし、クライアントに格納されたトークン情報を、取得した後。localStorageなど。
ログイン認証情報は、ユーザのアクセスを必要とする3インターフェースは要求ヘッダーセット許可する必要があります。ここで私は、2つの方法で使用しました:
(1)遠位切片要求ヘッダーaxios用途等jQueryライブラリーは、例えばすることにより本明細書に、対応するフックにJQ設けられています。このアイデアは、提供インターフェースを確認するために必要とされる全ては、別個の要求ヘッダーを必要とするより多くの厄介な点を有します。ユーザー自身のアクセストークンは、URLによって組み立てられた場合は、対応する効果を達成することはできません。
$アヤックス({ URL: '/ユーザー情報'、 タイプ: 'get'が、 データ:{ PARAM1: 'POST1'、 PARAM2: 'POST2'、 トークン:localStorage.getItem( 'トークン') }、 beforeSend:関数(XHR ){ xhr.setRequestHeader( "承認"、 "ベアラ" + localStorage.getItem( 'トークン')); }、 成功:関数(MSG){ にconsole.log(MSG); }、 失敗:関数(ERR){ コンソール.logの(ERR); } })
(2)第二は、合計でミドルウェアKOAインターセプトルーティングプロセスを使用することです。限りただ検証のために、フィールドパラメータのトークンが組み立てられているよう。この方法の最大の利点は、トラバースすることですが、他のルートへの干渉が生じないように、全体的なルーティング傍受にバックエンドアーキテクチャを行う必要があることに注意してください。
app.use(bodyParser()) app.use(非同期(CTX、次)=> { にconsole.log(CTX) させparamsは= Object.assign({}、ctx.request.query、ctx.request.body)。 ctx.request.header = { '許可': "ベアラ" +( '|| params.token')} (次待ちます); })
3. KOA-JWTに配置された認証コンテキスト内の状態のステータス情報を取得することができる検証が成功した後、インターフェイスにアクセスするために必要とされます。
router.get( '/ユーザー情報'、JWT、非同期(CTX、次)=> { ctx.body = {名:ctx.state.user.username} にconsole.log(CTX) }) に.get( '/ viplist' 、JWT、非同期(CTX、次)=> { にconsole.log(ctx.state) ctx.body = 'OKチェック' })
次は、ソースコアバックエンドファイルです。
CONST KOA =( 'KOA')を必要とします。 constのアプリ=新しいKOA(); CONST bodyParserは=( 'KOA-bodyparser')を必要とします。 constのルータは=( 'KOA-ルータ')を必要とします。 constのルータ=新しいルータ(); CONSTビュー=は( 'KOA-ビュー')を必要とします。 CONST静的=(「KOA静的」)を必要とします。 CONSTパス=(「パス」)を必要とします。 CONST {記号} =( 'jsonwebtoken')が必要。 constの秘密= 'デモ'; CONST JWT =必要とする( 'KOA-JWT')({秘密})。 app.use(bodyParser()) app.use(ビュー(__ DIRNAME + '/ビュー'、{ マップ:{HTML: 'EJS'} })) app.use(静的(path.join(__ DIRNAME、 '/静的' ))) app.use(非同期(CTX、次)=> { コンソール。 ctx.request.header = { '許可': "ベアラ" +(params.tokenが|| '')} 次待ちます()。 }) router.get( '/'、非同期(CTX、次)=> { 待つctx.render( 'インデックス') }) router.post( '/ログイン'、非同期(CTX、次)=> { CONSTユーザ= ctx.request.body; {(ユーザ&& user.username === 'テイト')なら 、{ユーザー名}はユーザ=せ CONSTトークン=記号({ユーザー名、テスト: 'testok'}、秘密の、{expiresIn ' 1H '}); ctx.body = { mssage: '' TOKEN成功を得る、 コード:1、 トークン } メッセージ: ctx.body = { } } }) に.get( '/ユーザー情報'、JWT、非同期(CTX、次)=> { ctx.body = {名:ctx.state.user.username} にconsole.log(CTX) }) に.get(」 / viplist」、JWT、非同期(CTX、次)=> { にconsole.log(ctx.state) ctx.body = 'OKチェック' }) router.get( '/ 404'、次の非同期(CTX)=> { ctx.renderを待つ( '404') }) アプリ .USE(router.routes()) .USE(router.allowedMethods()) app.listen(3000、()=> { にconsole.log( 'サーバーが実行されていますポート3000' )に; はconsole.log(3) })