JsonWebToken(jwt)の使い方とその利点
4492 ワード
jsonwebtoken
具体的な実践は私のgithubの例を見ることができます.
使用法
jwt.sign(payload, secretOrPrivateKey, [options, callback])
(非同期)コールバックが指定されている場合、errまたはJWTを使用してコールバックが呼び出されます.
(同期)JsonWebTokenを文字列として返します.
payloadはobject、bufferまたはstringでなければなりません.expはpayloadがobject字面量である場合にのみ設定できます.secretOrPrivateKeyは、HMACアルゴリズムの鍵またはRSAおよびECDSAを含むPEM符号化秘密鍵のstringまたはbufferである.options:
payloadがbufferまたはstringでない場合、使用する文字列JSONに強制的に変換されます.stringify(). expiresIn,notBefore,audience,subject,issuerにデフォルト値がない場合.payloadでexp,nbf,aud,sub,issで直接表すこともできますが、この2つの場所で同時に設定することはできません.exp,nbf,iatはNumericDateタイプであることを覚えておいてください.生成されたjwtsには、noTimestampが指定されていない限りiat値が通常含まれる.iatがpayloadに挿入すると、optionsなどの他のことを実際のタイムスタンプの代わりに計算するために使用されます.expiresInはexpのような時間間隔を与える.
// sign with default (HMAC SHA256)
var jwt = require('jsonwebtoken');
var token = jwt.sign({ foo: 'bar' }, 'shhhhh');
//backdate a jwt 30 seconds
var older_token = jwt.sign({ foo: 'bar', iat: Math.floor(Date.now() / 1000) - 30 }, 'shhhhh');
// sign with RSA SHA256
var cert = fs.readFileSync('private.key'); // get private key
var token = jwt.sign({ foo: 'bar' }, cert, { algorithm: 'RS256'});
// sign asynchronously
jwt.sign({ foo: 'bar' }, cert, { algorithm: 'RS256' }, function(err, token) {
console.log(token);
});
Token Expiration (exp claim)
1時間以内に署名するtoken:
jwt.sign({
exp: Math.floor(Date.now() / 1000) + (60 * 60),
data: 'foobar'
}, 'secret');
このライブラリを使用してトークンを生成する別の方法は、次のとおりです.
jwt.sign({
data: 'foobar'
}, 'secret', { expiresIn: 60 * 60 });
//or even better:
jwt.sign({
data: 'foobar'
}, 'secret', { expiresIn: '1h' });
jwt.verify(token,secretOrPublicKey,[options,callback])
tokenの正当性の検証
jwt.decode(token [,options])
(同期)署名が有効かどうかを検証していないpayloadを返す.警告:署名が有効かどうかは検証されません.信頼できないメッセージのためにこれを使用しないはずです.jwtを使う可能性が高い.verify().
エラーとコード
TokenExpiredErrorトークンが期限切れの場合、エラーが放出されます.エラーオブジェクト:
JsonWebTokenErrorエラーオブジェクト:
JWTはシーンを適用しますか?
プロフィールには2つのシーンがありますが、主に1つ目はアイデンティティ認証だと思います.なぜこの方式を採用したのでしょうか.まとめてみました
1、jsonフォーマットは簡単で、xmlよりjsonのほうが好きです.Self-containedは、jwtに必要なすべての情報があるので、出して使えばいいという意味です.
2、sessionに比べて、性能はもっと良くて、分布sessionを処理する問題を省いた.大いに活躍するrestfulにとって、支持はとても良いです;ブラウザ+app+pc、このようなマルチ端末開発は、良い選択です.
JWTのメリットは何ですか?
1、ドメイン間アクセスをサポートする:Cookieはドメインを潰すアクセスを許可しない.この点はTokenメカニズムに対して存在しない.前提は、伝送されたユーザ認証情報がHTTPヘッダを通じて伝送することである.
2、ステータスレス(サービス側拡張可能行とも呼ばれる):Tokenメカニズムは、サービス側にセッション情報を記憶する必要がない.なぜなら、Token自身はすべてのログインユーザの情報を含み、クライアントのクッキーまたはローカルメディアにステータス情報を記憶する必要があるからである.
4、CDNの適用:コンテンツ配信ネットワークを通じて、javascript、HTML、画像などのサービス側のすべての資料を要求することができ、サービス側はAPIを提供すればよい.
5、デカップリング:特定の認証スキームにバインドする必要はありません.Tokenはどこでも生成できます.APIが呼び出されたときにToken生成呼び出しを行うことができます.
6、モバイルアプリケーションにもっと適しています:クライアントがオリジナルプラットフォーム(iOS、Android、Windows 8など)である場合、Cookieはサポートされていません(Cookieコンテナで処理する必要があります)、Token認証メカニズムを採用すると簡単になります.
7、CSRF:Cookieに依存しなくなったので、CSRF(クロスステーション要求偽造)の防止を考慮する必要はありません.
8、性能:一度のネットワーク往復時間(データベースを通じてsession情報を検索)は一度のHMACSHA 256計算のToken検証と解析よりずっと時間がかかる.
9、登録ページに特別な処理をする必要はありません:Protractorを使って機能テストをする場合、登録ページに特別な処理をする必要はありません.
10、標準化に基づく:あなたのAPIは標準化のJSON Web Token(JWT)を採用することができる.この基準はすでに複数のバックエンドライブラリ(.NET,Ruby,Java,Python,PHP)と複数の会社のサポート(例えば:Firebase,Google,Microsoft)が存在する.
補足:Base 64 URLこのアルゴリズムはBase 64アルゴリズムと基本的に似ていますが、いくつかの小さな違いがあります.JWTはトークン(token)として、api.example.com/?token=xxxなどのURLを置く場合があります.Base 64には3文字+、/および=があり、URLには特別な意味があるので、=省略、+置換-、/置換_と置換される.これがBase 64 URLアルゴリズムです.