ノードを確保します.JSONウェブトークンによるJSアプリケーション


クロス投稿CodeWall
フロントエンドとバックエンドが分離されたWebアプリケーションをビルドすると、ログインの後に置く方法の1つがJSONWebTokenです.それは非常に迅速に2010年初頭に導入されたときに非常に迅速に普及した概念です.このポストでは、JSON Webトークン(JWT)はどのように動作し、どのようにあなたのノードに統合する方法を学びます.JSアプリケーション.始めましょう!

のウェブトークン
引用符official website , 「JSONウェブトークンは、2つの党の間で安全にクレームを表すための開いた、業界標準の方法です」.つまり、サーバがクライアントによって送信された情報(JSON形式)が変更されておらず、そのサーバが効果的に発行されたかどうかをサーバが判断できる.

トークンは何を含んでいますか.
JSONウェブトークンは3つの部分から構成されています.
  • 📃 ヘッダー:それがどんな種類のトークンであるか(JWT)、そして、どの署名アルゴリズムが使用されているか(例えばSHA 256)を含んでいます.ヘッダJSONはbase 64 urlエンコードされています.
  • 📦 ペイロード:2つの当事者が共有したい情報(または「クレーム」)を含みます.これはあなたが望む何かを含むことができました、しかし、デフォルトで、JWTトークンを共有秘密なしで解読されることができるので、それは敏感なデータ(例えばパスワード)を共有する良い考えでありません.JWTはデータを暗号化する目的を持っていません.私は個人的に通常ユーザーID、役割、発行日と有効期限を使用します.ヘッダJSONと同様に、ペイロードJSONもbase 64 urlでエンコードされます.
  • 🔏 シグネチャ:符号化ヘッダー、コード化されたペイロード、暗号化されたペイロード(あなたのサーバだけが知っている)を含んで、ヘッダーで決定されるアルゴリズムによって署名されます.
  • ハッシュアルゴリズムがSHA 256である場合、署名は以下のように作成されます.
    HMACSHA256(
    base64UrlEncode(header)
    + "."
    + base64UrlEncode(payload)
    ,secret)
    
    最後に、すべての3つの部分が連結されています.
    <Header>.<Payload>.<Signature>
    
    JWTの例
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1ZDM5YzI4MjdhZDgyMjBmMTJiMGZkMWIiLCJyb2xlIjoiYWRtaW4iLCJpYXQiOjE1NjUyNzE4NzUsImV4cCI6MTU2NjQ4MTQ3NX0.NmcvfTBmUw1cdEI1cNRHzq6q5W0HmPELoh8rd_7EFAc
    
    頭を突くjwt.io そしてそこにトークンを貼り付けます.すべての情報が表示されます(署名を除く)


    JWTトークンはどのように動作しますか?
    JWTが暗号化されたデータを交換することを意味しないことに注意することは重要です.パスワードのような賢明な情報を決して含んではいけません.jwtの鍵はトークンの検証において行われる.タプルされたトークンを確認しようとすると(おそらく、ユーザーIDがスワップされた場合)、トークンは拒否されます.
    なぜ?内容がもう署名と一致しないので.それで、あなたが署名をハッシュするのに使用するあなたの秘密に手を得るとき以外は、有効なトークンはあなた以外の誰かによってつくられることができません.
    あなたのJWT秘密が何らかの理由でハッキングされるならば、あなたはすぐにそれを変える必要があります.その時から既に存在しているトークンはすべて無効です.ログインしているユーザにとっては少し迷惑になるかもしれませんが、アプリケーションの有効なトークンを生成できないことを確認できます.

    JWTワークフローはサーバー上でどのように見えますか?

    一般的にJWTをよく知っているので、クライアントサーバ交換でどのように動作するかを見てみましょう.
  • 最初の移動はクライアントを作る.これは、Webフロントエンドアプリケーション、モバイルアプリケーションなど、基本的に何かをバックエンドアプリケーション(例えばREST API)と対話しようとすることができます.それは、認証になるために、彼らのログイン資格情報をサーバーに送ります.
  • サーバーがログイン要求を受け取ると、最初にユーザ名/メールとパスワードがデータベースに格納された情報と一致することを確認します.資格情報が正しいとき、これはサーバーのためにこのユーザーが彼が言うということです.
  • 次にJWTトークンが生成されます.ここで、ユーザを識別するために重要である情報はペイロードに渡されている.また、問題と有効期限を含める良いアイデアです.それで、セッションはあなたが示す時間より長く有効でないでしょう.一週間はいい時間のようです.ユーザーは、各使用後に、アプリケーションのログを使用する必要があります、右?しかし、これはちょうどゾンビのログインユーザーを避けることによってセキュリティの1つの余分な部分を追加します.
  • トークンは、ログイン試行に対する応答としてクライアントに返されます.彼がトークンを受け取るとき、それは彼がログインが成功したことを意味します.トークンはクライアント側のどこかに格納されます.これは、モバイルアプリケーションのためのLocalStoreまたはモバイルアプリケーションのためのデバイス変数のどこかでありえます.
  • サーバーとのすべての更なるコミュニケーションのために、クライアントは各々の要求に認証ヘッダーを加えます.このように見えます.
    認証:ベアラー
  • 保護されたリソースへの新しい要求がサーバーに到着するとき、それがする最初のことは認証ヘッダーが要求とともに通過されるかどうかチェックすることです.この場合、トークンがチェックアウトされたかどうかを確認しようとします.それが有効なトークンでないならば(それは改ざんされました、期限切れにしました).
  • しかし、トークンが有効であるなら、ユーザがまだ彼が言うということであり、要求されたリソースをクライアントに対する応答として返すことができるサーバを仮定するのは安全です.

  • ノード中のJWTアプリケーション
    このポストでは、Webサーバがどのようにノードで動作するかについて詳しく説明していません.jsしかし、JavaScriptサーバ環境でJWTを使用できる方法を紹介します.

    準備
    JWTで動作するには、便利なjsonwebtoken 図書館.インストールします
    npm install jsonwebtoken
    

    トークンを作る
    クライアントが正しいログイン資格情報を提供しているかどうかを確認するコードの場所(おそらくデータベースをチェックした直後に)、JSON Webトークンを作成できます.
    const token = jwt.sign(<Your payload>, <Your JWT secret>, { expiresIn: <Expiration Time> })
    
    実際の例では、次のようになります.
    const jwt = require('jsonwebtoken')
    const token = jwt.sign({ _id: user._id, admin: true }, process.env.JWT_SECRET, { expiresIn: '1 week' })
    
    二つのことに注意してください.
  • あなたがよく知らないならばdotenv , process.env.JWT_SECRET あなたのJWT秘密が置かれるところです.あなたのコードを明確なテキストとしてあなたのコードに保存するのは良い考えではありません.https://www.npmjs.com/package/dotenv ] Gitリポジトリにアップロードされないファイルにそれを見つけます.
  • ExpiredInプロパティは、文字列形式で人間に読み取り可能な時刻表示を行うことができます.
    - ' 4日間'
    - ' 7時間'
    -' 2週間'
    - ' 6ヶ月'
    **

  • 認証トークン
    クライアントは認証ヘッダを設定します.したがって、最初のストリップをする必要があります"Bearer: " 文字列から離れます.
    const token = req.header('Authorization').replace('Bearer ', '')
    
    ( req . header ('認可')はExpressです.許可ヘッダーを読むJS方法
    次のようにして、指定したトークンを確認できます.
    const jwt = require('jsonwebtoken')
    try{
        const payload = jwt.verify(token, process.env.JWT_SECRET) 
        console.log(payload._id)
    } catch(error) {
        console.error(error.message)
    }
    
    トークンが有効な場合、ペイロード変数のすべてのペイロードデータを右にアクセスできます.トークンが無効な場合、JWTライブラリはcatchで処理できるエラーをスローします.

    概要
    それだ!ご覧のようにJWTを使用することは複雑ではありません.最も重要なこと-私は十分に強調することはできません- JWTはデータを暗号化していないので、賢明な情報を交換するために使用しないでください.
    JSONのWebトークンは、情報の誰かが彼らが実際に本物であると主張するかどうかを確認する優れた技術です.
    楽しいコーディングを持っている!