JWTトークンのデコードと検証にいくつかのライブラリを使用する理由はまったく不思議です。
エンコードJWTトークンがfollowing pseudocode
var headers = base64URLencode(myHeaders);
var claims = base64URLencode(myClaims);
var payload = header + "." + claims;
var signature = base64URLencode(HMACSHA256(payload, secret));
var encodedJWT = payload + "." + signature;
任意の特定のライブラリなしで行うことは非常に簡単です使用して作成することができます。次のコードを使用して:
using System;
using System.Text;
using System.Security.Cryptography;
public class Program
{
// More info: https://stormpath.com/blog/jwt-the-right-way/
public static void Main()
{
var header = "{\"typ\":\"JWT\",\"alg\":\"HS256\"}";
var claims = "{\"sub\":\"1047986\",\"email\":\"[email protected]\",\"given_name\":\"John\",\"family_name\":\"Doe\",\"primarysid\":\"b521a2af99bfdc65e04010ac1d046ff5\",\"iss\":\"http://example.com\",\"aud\":\"myapp\",\"exp\":1460555281,\"nbf\":1457963281}";
var b64header = Convert.ToBase64String(Encoding.UTF8.GetBytes(header))
.Replace('+', '-')
.Replace('/', '_')
.Replace("=", "");
var b64claims = Convert.ToBase64String(Encoding.UTF8.GetBytes(claims))
.Replace('+', '-')
.Replace('/', '_')
.Replace("=", "");
var payload = b64header + "." + b64claims;
Console.WriteLine("JWT without sig: " + payload);
byte[] key = Convert.FromBase64String("mPorwQB8kMDNQeeYO35KOrMMFn6rFVmbIohBphJPnp4=");
byte[] message = Encoding.UTF8.GetBytes(payload);
string sig = Convert.ToBase64String(HashHMAC(key, message))
.Replace('+', '-')
.Replace('/', '_')
.Replace("=", "");
Console.WriteLine("JWT with signature: " + payload + "." + sig);
}
private static byte[] HashHMAC(byte[] key, byte[] message)
{
var hash = new HMACSHA256(key);
return hash.ComputeHash(message);
}
}
トークン復号化はあなたが同じにする必要があります署名を検証し、算出した署名と署名の一部を比較above.Toコードのバージョンを逆転しています。
UPDATE:どのようにbase64でurlsafeエンコーディング/デコーディングは別のSO question参照してください行い、また、ウィキおよびRFC
私は本当にあなたの答えに感謝するためにどのように苦労している人のために。ですから、ClaimsIdentityを取得したら、それを公開鍵と照合するにはどうすればよいですか?具体的には、自分の公開鍵(https://www.gstatic.com/authtoolkit/cert/gitkit_cert.pem)に対してGoogle IDツールキットJWTを検証しようとしています –
私の答えが更新されました。これで、私はあなたに適切な開発者サンプルの方向を指摘しました。それが役に立てば幸い。 –
@ w.brian - 私は同じことをしようとしています。私はデコードできるトークンと私が検証したい公開鍵を持っていますが、これらのサンプルを見ても私はこれをどうやって行うのか苦労しています。コードが実際にあなたを助けた指針はありますか?ありがとう。 – Barguast