Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: 🔐 add parse jwt tokens algos #3

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
136 changes: 135 additions & 1 deletion src/authn/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,14 +56,45 @@ impl AuthSdk {
.await?)
}

pub fn parse_jwt_token(&self, token: &str) -> SdkResult<Claims> {
pub fn parse_jwt_token_rs256(&self, token: &str) -> SdkResult<Claims> {
let mut validation = Validation::new(Algorithm::RS256);
validation.set_audience(&[self.sdk.client_id()]);

let td: TokenData<Claims> = jsonwebtoken::decode(token, &DecodingKey::from_rsa_pem(self.sdk.certificate().as_bytes())?, &validation)?;
Ok(td.claims)
}

pub fn parse_jwt_token_rs512(&self, token: &str) -> SdkResult<Claims> {
let mut validation: Validation = Validation::new(Algorithm::RS512);
validation.set_audience(&[self.sdk.client_id()]);

let td: TokenData<Claims> = jsonwebtoken::decode(token, &DecodingKey::from_rsa_pem(self.sdk.certificate().as_bytes())?, &validation)?;

Ok(td.claims)
}

pub fn parse_jwt_token_es256(&self, token: &str) -> SdkResult<Claims> {
let mut validation: Validation = Validation::new(Algorithm::ES256);
validation.set_audience(&[self.sdk.client_id()]);

let decode_key = &DecodingKey::from_ec_pem(self.sdk.certificate().as_bytes())?;

let token_data: TokenData<Claims> = jsonwebtoken::decode(&token, &decode_key, &validation)?;

Ok(token_data.claims)
}

pub fn parse_jwt_token_es384(&self, token: &str) -> SdkResult<Claims> {
let mut validation: Validation = Validation::new(Algorithm::ES384);
validation.set_audience(&[self.sdk.client_id()]);

let decode_key = &DecodingKey::from_ec_pem(self.sdk.certificate().as_bytes())?;

let token_data: TokenData<Claims> = jsonwebtoken::decode(&token, &decode_key, &validation)?;

Ok(token_data.claims)
}

pub fn get_signin_url(&self, redirect_url: String) -> String {
let scope = "read";
let state = self.sdk.app_name().clone().unwrap_or_default();
Expand Down Expand Up @@ -126,3 +157,106 @@ impl AuthSdk {
.into_data_default()
}
}

#[cfg(test)]

mod tests {
use std::fs;

use crate::Config;

#[test]
fn succesfully_es256() {
let token = fs::read_to_string("./src/authn/testdata/tok_es256.txt").unwrap();
let cert = fs::read_to_string("./src/authn/testdata/cert_es256.txt").unwrap();
let cfg = Config::new(
"http://localhost:8000",
"e953686f04e7055b698b",
"secret",
cert,
"org_name",
Some("app_name".to_owned()),
).into_sdk();

let authnx = cfg.authn();

let tk = authnx.parse_jwt_token_es256(&token).unwrap();
assert_eq!("user1", tk.user.display_name);
}

#[test]
fn succesfully_es384() {
let token = fs::read_to_string("./src/authn/testdata/tok_es384.txt").unwrap();
let cert = fs::read_to_string("./src/authn/testdata/cert_es384.txt").unwrap();
let cfg = Config::new(
"http://localhost:8000",
"e953686f04e7055b698b",
"secret",
cert,
"org_name",
Some("app_name".to_owned()),
).into_sdk();

let authnx = cfg.authn();

let tk = authnx.parse_jwt_token_es384(&token).unwrap();
assert_eq!("user1", tk.user.display_name);
}

#[test]
fn succesfully_rs512() {
let token = fs::read_to_string("./src/authn/testdata/tok_rs512.txt").unwrap();
let cert = fs::read_to_string("./src/authn/testdata/cert_rs512.txt").unwrap();
let cfg = Config::new(
"http://localhost:8000",
"e953686f04e7055b698b",
"secret",
cert,
"org_name",
Some("app_name".to_owned()),
).into_sdk();

let authnx = cfg.authn();

let tk = authnx.parse_jwt_token_rs512(&token).unwrap();
assert_eq!("user1", tk.user.display_name);
}

#[test]
#[should_panic]
fn bad_algo_rs_tk256_cert512() {
let token = fs::read_to_string("./src/authn/testdata/tok_rs256.txt").unwrap();
let cert = fs::read_to_string("./src/authn/testdata/cert_rs512.txt").unwrap();
let cfg = Config::new(
"http://localhost:8000",
"e953686f04e7055b698b",
"secret",
cert,
"org_name",
Some("app_name".to_owned()),
).into_sdk();

let authnx = cfg.authn();

let _tk = authnx.parse_jwt_token_rs512(&token).unwrap();
}

#[test]
#[should_panic]
fn bad_algo_es_tk256_cert512() {
let token = fs::read_to_string("./src/authn/testdata/tok_es256.txt").unwrap();
let cert = fs::read_to_string("./src/authn/testdata/cert_es384.txt").unwrap();
let cfg = Config::new(
"http://localhost:8000",
"e953686f04e7055b698b",
"secret",
cert,
"org_name",
Some("app_name".to_owned()),
).into_sdk();

let authnx = cfg.authn();

let _tk = authnx.parse_jwt_token_es384(&token).unwrap();
}
}
10 changes: 10 additions & 0 deletions src/authn/testdata/cert_es256.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
-----BEGIN CERTIFICATE-----
MIIBTjCB9KADAgECAgRnRMH0MAoGCCqGSM49BAMCMCYxDjAMBgNVBAoTBWFkbWlu
MRQwEgYDVQQDDAtjZXJ0XzUzNmd4OTAeFw0yNDExMjUxODI5MDhaFw00NDExMjUx
ODI5MDhaMCYxDjAMBgNVBAoTBWFkbWluMRQwEgYDVQQDDAtjZXJ0XzUzNmd4OTBZ
MBMGByqGSM49AgEGCCqGSM49AwEHA0IABCnOWrujrhFFgvuBXigUSYtSHj4oeCXE
QecGCIOMz/AIXSDYzkV0BbXQaBG49rGFeNux1dxP/yt3Ms55BdhnQAejEDAOMAwG
A1UdEwEB/wQCMAAwCgYIKoZIzj0EAwIDSQAwRgIhAPCxLcRPiFp70CnReHCoNv3B
RAWDs1bN8On3xWhSTLxXAiEApRAHyDZJkuBIwsfdKBBtvl3Lxz3sQXUn8L0vTQST
0zs=
-----END CERTIFICATE-----
11 changes: 11 additions & 0 deletions src/authn/testdata/cert_es384.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE-----
MIIBijCCARGgAwIBAgIEZ0Y2tjAKBggqhkjOPQQDAzAmMQ4wDAYDVQQKEwVhZG1p
bjEUMBIGA1UEAwwLY2VydF96NnR3cWIwHhcNMjQxMTI2MjA1OTM0WhcNNDQxMTI2
MjA1OTM0WjAmMQ4wDAYDVQQKEwVhZG1pbjEUMBIGA1UEAwwLY2VydF96NnR3cWIw
djAQBgcqhkjOPQIBBgUrgQQAIgNiAATEkGgkdnmTfcNrFF3Xe32uOwpO3KXGdYgq
TGJ8MNdh5vTiEBPaSM77ImEnPES7Da7ID/jmiVVc+TWWBN/a5RR3s2tTady+ssbk
JOmeq8qwqMTzHv/IqAxlFouW5GJ3xZqjEDAOMAwGA1UdEwEB/wQCMAAwCgYIKoZI
zj0EAwMDZwAwZAIwcFpz+OC2QGXsGvbDLSeassrqKYQuY2nyTCqhCe63O67kQpdp
Orn/UlQ9dPcST1YyAjAjv8olJlkvOVbEExeLUJDFFyHvKY386Z0AuW6ybAql4lrg
TaV2VdeQ84CjVIIlZ1o=
-----END CERTIFICATE-----
29 changes: 29 additions & 0 deletions src/authn/testdata/cert_rs512.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
-----BEGIN CERTIFICATE-----
MIIE3TCCAsWgAwIBAgIDAeJAMA0GCSqGSIb3DQEBDQUAMCgxDjAMBgNVBAoTBWFk
bWluMRYwFAYDVQQDEw1jZXJ0LWJ1aWx0LWluMB4XDTI0MTEyNjIxMTgzOVoXDTQ0
MTEyNjIxMTgzOVowKDEOMAwGA1UEChMFYWRtaW4xFjAUBgNVBAMTDWNlcnQtYnVp
bHQtaW4wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ3WejBKioE7nH
/zcf5qfMhXpiyOlkW3EceSgWnsMovOleRSypbSJISogC8RzyitYCqiCgPnL96Xov
swhJQ3+HShcxL8UHDR5aegIh+mM36lXeGEen7Q1W9D0kGlanc4jgRuj2Ok+43c1t
auoqZkMg+MdMgbyl39Bs16C/GV2Lmh4Pe31TRdIOAgLIX0CN+1BknVzvo4mjIF8O
aYrJztO6pnnBGmQXJR96PC3tv7heyZwGZeomL6xuvhqjqjleVxFYFQk6JHY/7L+u
1gSQnRfkJ2Q/ju+x8Oglc2/AaSuoICCfORoSRbrnKmXOXQIn9wEUlb2/WiENh796
N1NXMw43PTKpOPpPoi/GORO7kgT2Zd4/cyIhNnV8HaoA10z2GwLMz/+FlupUUiEI
CiDyn09q9PmT5rphqb60xy16+OGIsFHZIgZxlaWzBUV+ts+eZPQCbpqcxbU0QjqW
NS50PQaRIK+jH1p5MSvNSPHUxTBYjuTfmyVBr8EBg+xJX9SVEjJW7LLYwR6ZZGD7
xNeG4ew/i9icJRtDJ0jMgvrqeZPg7wnxmtabZZIHx+R+mea+PDAfJq7t8w7ftH7Q
pQ7no40i6DI5ONsDCn5LkaPVxGzjgt0aOlw90ixtdPlOFhu0a5IJcBGQEZftdNrS
aasV/G9P2WESM68MgcTDKH1v+XE2PwIDAQABoxAwDjAMBgNVHRMBAf8EAjAAMA0G
CSqGSIb3DQEBDQUAA4ICAQBhYxoH/yiX8dPe/+q4AtssuIr9fAD9mrcV7uKkwyo6
kK7FkQfFcviRJZVhbu5r3egH7AUn99KmnxeKTObQiwdml1xAFX65SALlY/fNWQ6K
JA7AUYw0iaLcaRDkDriHw33ZZtC3nhyjuZql3e3MeDX09iqjBGnngOb+FT9NdWET
OCW2A5I7gUSt2v6bNhbWRdzaYmUGCxboRFMjLeC9zEPQylejuwv7GKCJa+jXN2kp
CmmQCHlAMf9LZx6lymJ5lYOaLjqXouPE/taSeuA9fwh11NXb0BEx2+Duo/c88qOg
bbqR8/GmnHwb0fv9c2exCKDl7+11E72s/aF0z9VmV4LOwQYI0vhtPUqqGX4VOBmk
YbzxIC8/Ck0N3NlmvFf7WQa8IMQTYC8FtBsvuDZcGIhKa1JBUYjf1E649l4UcGWV
oKmYKLPex3xH+2WHuSZKvtS58bh71mUbAnwuBe19kBS+csWNkcck49reAe/H87d8
0eMAWOaCmY7lfNfZ/Xy+1MOshuUTujd49dgBZjfXMWUBaAAQy5I3h7eMJioQth48
3JhM4jendvx3xkgYZdesd6ThPB0Mmu7SvLO6Reb1PpnifQm6XpEfMPAjhI1M/cHW
oPIZICyzDrDEHJ/wKPyQ3fLXbCm+XvmVlsk+t3n/GKJjX7b5BTB8yGO78Dg2sJ6W
ug==
-----END CERTIFICATE-----
1 change: 1 addition & 0 deletions src/authn/testdata/tok_es256.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
eyJhbGciOiJFUzI1NiIsImtpZCI6ImNlcnRfNTM2Z3g5IiwidHlwIjoiSldUIn0.eyJvd25lciI6Ikt1YmVybmV0ZXMiLCJuYW1lIjoidXNlcjEiLCJjcmVhdGVkVGltZSI6IjIwMjQtMTEtMTRUMjM6NTA6MTYrMDM6MDAiLCJ1cGRhdGVkVGltZSI6IjIwMjQtMTEtMjVUMTg6MzY6MjVaIiwiZGVsZXRlZFRpbWUiOiIiLCJpZCI6ImFlYzI5NTBhLTkzMTEtNGM2Yy1iNzBiLTAyZGIzOTA5ZmQ4NCIsInR5cGUiOiJub3JtYWwtdXNlciIsInBhc3N3b3JkIjoiIiwicGFzc3dvcmRTYWx0IjoiIiwicGFzc3dvcmRUeXBlIjoicGxhaW4iLCJkaXNwbGF5TmFtZSI6InVzZXIxIiwiZmlyc3ROYW1lIjoiIiwibGFzdE5hbWUiOiIiLCJhdmF0YXIiOiJodHRwczovL2Nkbi5jYXNiaW4ub3JnL2ltZy9jYXNiaW4uc3ZnIiwiYXZhdGFyVHlwZSI6IiIsInBlcm1hbmVudEF2YXRhciI6IiIsImVtYWlsIjoiZHA4dTRhQGV4YW1wbGUuY29tIiwiZW1haWxWZXJpZmllZCI6ZmFsc2UsInBob25lIjoiODQ2NjQ2MTcxNTYiLCJjb3VudHJ5Q29kZSI6IlVTIiwicmVnaW9uIjoiIiwibG9jYXRpb24iOiIiLCJhZGRyZXNzIjpbXSwiYWZmaWxpYXRpb24iOiJFeGFtcGxlIEluYy4iLCJ0aXRsZSI6IiIsImlkQ2FyZFR5cGUiOiIiLCJpZENhcmQiOiIiLCJob21lcGFnZSI6IiIsImJpbyI6IiIsImxhbmd1YWdlIjoiIiwiZ2VuZGVyIjoiIiwiYmlydGhkYXkiOiIiLCJlZHVjYXRpb24iOiIiLCJzY29yZSI6MjAwMCwia2FybWEiOjAsInJhbmtpbmciOjIsImlzRGVmYXVsdEF2YXRhciI6ZmFsc2UsImlzT25saW5lIjpmYWxzZSwiaXNBZG1pbiI6dHJ1ZSwiaXNGb3JiaWRkZW4iOmZhbHNlLCJpc0RlbGV0ZWQiOmZhbHNlLCJzaWdudXBBcHBsaWNhdGlvbiI6IkNsdXN0ZXIiLCJoYXNoIjoiIiwicHJlSGFzaCI6IiIsImFjY2Vzc0tleSI6IiIsImFjY2Vzc1NlY3JldCI6IiIsImdpdGh1YiI6IiIsImdvb2dsZSI6IiIsInFxIjoiIiwid2VjaGF0IjoiIiwiZmFjZWJvb2siOiIiLCJkaW5ndGFsayI6IiIsIndlaWJvIjoiIiwiZ2l0ZWUiOiIiLCJsaW5rZWRpbiI6IiIsIndlY29tIjoiIiwibGFyayI6IiIsImdpdGxhYiI6IiIsImNyZWF0ZWRJcCI6IiIsImxhc3RTaWduaW5UaW1lIjoiIiwibGFzdFNpZ25pbklwIjoiIiwicHJlZmVycmVkTWZhVHlwZSI6IiIsInJlY292ZXJ5Q29kZXMiOm51bGwsInRvdHBTZWNyZXQiOiIiLCJtZmFQaG9uZUVuYWJsZWQiOmZhbHNlLCJtZmFFbWFpbEVuYWJsZWQiOmZhbHNlLCJsZGFwIjoiIiwicHJvcGVydGllcyI6e30sInJvbGVzIjpbXSwicGVybWlzc2lvbnMiOltdLCJncm91cHMiOltdLCJsYXN0U2lnbmluV3JvbmdUaW1lIjoiIiwic2lnbmluV3JvbmdUaW1lcyI6MCwibWFuYWdlZEFjY291bnRzIjpudWxsLCJ0b2tlblR5cGUiOiJhY2Nlc3MtdG9rZW4iLCJ0YWciOiJzdGFmZiIsInNjb3BlIjoicmVhZCIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODAwMCIsInN1YiI6ImFlYzI5NTBhLTkzMTEtNGM2Yy1iNzBiLTAyZGIzOTA5ZmQ4NCIsImF1ZCI6WyJlOTUzNjg2ZjA0ZTcwNTViNjk4YiJdLCJleHAiOjE3MzMxNjQ4NDMsIm5iZiI6MTczMjU2MDA0MywiaWF0IjoxNzMyNTYwMDQzLCJqdGkiOiJhZG1pbi9iOTgzODcyOS0yODk3LTQyMTAtOGNjZS0yN2ZkZDMxNDhhMmQifQ.HAd0GfUz3gBkOU02cu4JC7LK9evf5bmvC5KE6S1DvodG1-JlUvKm3UrxeJEQh_bPpGhybJSxTYiQT-_poQ2Erw
1 change: 1 addition & 0 deletions src/authn/testdata/tok_es384.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
eyJhbGciOiJFUzM4NCIsImtpZCI6ImNlcnRfejZ0d3FiIiwidHlwIjoiSldUIn0.eyJvd25lciI6Ikt1YmVybmV0ZXMiLCJuYW1lIjoidXNlcjEiLCJjcmVhdGVkVGltZSI6IjIwMjQtMTEtMTRUMjM6NTA6MTYrMDM6MDAiLCJ1cGRhdGVkVGltZSI6IjIwMjQtMTEtMjVUMTg6MzY6MjVaIiwiZGVsZXRlZFRpbWUiOiIiLCJpZCI6ImFlYzI5NTBhLTkzMTEtNGM2Yy1iNzBiLTAyZGIzOTA5ZmQ4NCIsInR5cGUiOiJub3JtYWwtdXNlciIsInBhc3N3b3JkIjoiIiwicGFzc3dvcmRTYWx0IjoiIiwicGFzc3dvcmRUeXBlIjoicGxhaW4iLCJkaXNwbGF5TmFtZSI6InVzZXIxIiwiZmlyc3ROYW1lIjoiIiwibGFzdE5hbWUiOiIiLCJhdmF0YXIiOiJodHRwczovL2Nkbi5jYXNiaW4ub3JnL2ltZy9jYXNiaW4uc3ZnIiwiYXZhdGFyVHlwZSI6IiIsInBlcm1hbmVudEF2YXRhciI6IiIsImVtYWlsIjoiZHA4dTRhQGV4YW1wbGUuY29tIiwiZW1haWxWZXJpZmllZCI6ZmFsc2UsInBob25lIjoiODQ2NjQ2MTcxNTYiLCJjb3VudHJ5Q29kZSI6IlVTIiwicmVnaW9uIjoiIiwibG9jYXRpb24iOiIiLCJhZGRyZXNzIjpbXSwiYWZmaWxpYXRpb24iOiJFeGFtcGxlIEluYy4iLCJ0aXRsZSI6IiIsImlkQ2FyZFR5cGUiOiIiLCJpZENhcmQiOiIiLCJob21lcGFnZSI6IiIsImJpbyI6IiIsImxhbmd1YWdlIjoiIiwiZ2VuZGVyIjoiIiwiYmlydGhkYXkiOiIiLCJlZHVjYXRpb24iOiIiLCJzY29yZSI6MjAwMCwia2FybWEiOjAsInJhbmtpbmciOjIsImlzRGVmYXVsdEF2YXRhciI6ZmFsc2UsImlzT25saW5lIjpmYWxzZSwiaXNBZG1pbiI6dHJ1ZSwiaXNGb3JiaWRkZW4iOmZhbHNlLCJpc0RlbGV0ZWQiOmZhbHNlLCJzaWdudXBBcHBsaWNhdGlvbiI6IkNsdXN0ZXIiLCJoYXNoIjoiIiwicHJlSGFzaCI6IiIsImFjY2Vzc0tleSI6IiIsImFjY2Vzc1NlY3JldCI6IiIsImdpdGh1YiI6IiIsImdvb2dsZSI6IiIsInFxIjoiIiwid2VjaGF0IjoiIiwiZmFjZWJvb2siOiIiLCJkaW5ndGFsayI6IiIsIndlaWJvIjoiIiwiZ2l0ZWUiOiIiLCJsaW5rZWRpbiI6IiIsIndlY29tIjoiIiwibGFyayI6IiIsImdpdGxhYiI6IiIsImNyZWF0ZWRJcCI6IiIsImxhc3RTaWduaW5UaW1lIjoiIiwibGFzdFNpZ25pbklwIjoiIiwicHJlZmVycmVkTWZhVHlwZSI6IiIsInJlY292ZXJ5Q29kZXMiOm51bGwsInRvdHBTZWNyZXQiOiIiLCJtZmFQaG9uZUVuYWJsZWQiOmZhbHNlLCJtZmFFbWFpbEVuYWJsZWQiOmZhbHNlLCJsZGFwIjoiIiwicHJvcGVydGllcyI6e30sInJvbGVzIjpbXSwicGVybWlzc2lvbnMiOltdLCJncm91cHMiOltdLCJsYXN0U2lnbmluV3JvbmdUaW1lIjoiIiwic2lnbmluV3JvbmdUaW1lcyI6MCwibWFuYWdlZEFjY291bnRzIjpudWxsLCJ0b2tlblR5cGUiOiJhY2Nlc3MtdG9rZW4iLCJub25jZSI6IjdaUDBOTUhpN3BEcyIsInRhZyI6InN0YWZmIiwic2NvcGUiOiJyZWFkIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDAwIiwic3ViIjoiYWVjMjk1MGEtOTMxMS00YzZjLWI3MGItMDJkYjM5MDlmZDg0IiwiYXVkIjpbImU5NTM2ODZmMDRlNzA1NWI2OThiIl0sImV4cCI6MTczMzI1OTY5NiwibmJmIjoxNzMyNjU0ODk2LCJpYXQiOjE3MzI2NTQ4OTYsImp0aSI6ImFkbWluL2EzYWVkMmJhLWJhMmMtNDliYi1iYmMxLTQ3NTdjM2NhMTI2OCJ9.LqeNfXxRu_FTVBcqp12nRHAtwxZEOFtF7eTpvKsb2cD_Pv-m1-bP7NJUszpRKmzw3NvsYWabVVhdAe-ITa_bI5ZbCr2Rq3vwPsWIDhn3aLzr2OudcNqD5Ox7fLxtMmZL
1 change: 1 addition & 0 deletions src/authn/testdata/tok_rs512.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
eyJhbGciOiJSUzUxMiIsImtpZCI6ImNlcnQtYnVpbHQtaW4iLCJ0eXAiOiJKV1QifQ.eyJvd25lciI6Ikt1YmVybmV0ZXMiLCJuYW1lIjoidXNlcjEiLCJjcmVhdGVkVGltZSI6IjIwMjQtMTEtMTRUMjM6NTA6MTYrMDM6MDAiLCJ1cGRhdGVkVGltZSI6IjIwMjQtMTEtMjVUMTg6MzY6MjVaIiwiZGVsZXRlZFRpbWUiOiIiLCJpZCI6ImFlYzI5NTBhLTkzMTEtNGM2Yy1iNzBiLTAyZGIzOTA5ZmQ4NCIsInR5cGUiOiJub3JtYWwtdXNlciIsInBhc3N3b3JkIjoiIiwicGFzc3dvcmRTYWx0IjoiIiwicGFzc3dvcmRUeXBlIjoicGxhaW4iLCJkaXNwbGF5TmFtZSI6InVzZXIxIiwiZmlyc3ROYW1lIjoiIiwibGFzdE5hbWUiOiIiLCJhdmF0YXIiOiJodHRwczovL2Nkbi5jYXNiaW4ub3JnL2ltZy9jYXNiaW4uc3ZnIiwiYXZhdGFyVHlwZSI6IiIsInBlcm1hbmVudEF2YXRhciI6IiIsImVtYWlsIjoiZHA4dTRhQGV4YW1wbGUuY29tIiwiZW1haWxWZXJpZmllZCI6ZmFsc2UsInBob25lIjoiODQ2NjQ2MTcxNTYiLCJjb3VudHJ5Q29kZSI6IlVTIiwicmVnaW9uIjoiIiwibG9jYXRpb24iOiIiLCJhZGRyZXNzIjpbXSwiYWZmaWxpYXRpb24iOiJFeGFtcGxlIEluYy4iLCJ0aXRsZSI6IiIsImlkQ2FyZFR5cGUiOiIiLCJpZENhcmQiOiIiLCJob21lcGFnZSI6IiIsImJpbyI6IiIsImxhbmd1YWdlIjoiIiwiZ2VuZGVyIjoiIiwiYmlydGhkYXkiOiIiLCJlZHVjYXRpb24iOiIiLCJzY29yZSI6MjAwMCwia2FybWEiOjAsInJhbmtpbmciOjIsImlzRGVmYXVsdEF2YXRhciI6ZmFsc2UsImlzT25saW5lIjpmYWxzZSwiaXNBZG1pbiI6dHJ1ZSwiaXNGb3JiaWRkZW4iOmZhbHNlLCJpc0RlbGV0ZWQiOmZhbHNlLCJzaWdudXBBcHBsaWNhdGlvbiI6IkNsdXN0ZXIiLCJoYXNoIjoiIiwicHJlSGFzaCI6IiIsImFjY2Vzc0tleSI6IiIsImFjY2Vzc1NlY3JldCI6IiIsImdpdGh1YiI6IiIsImdvb2dsZSI6IiIsInFxIjoiIiwid2VjaGF0IjoiIiwiZmFjZWJvb2siOiIiLCJkaW5ndGFsayI6IiIsIndlaWJvIjoiIiwiZ2l0ZWUiOiIiLCJsaW5rZWRpbiI6IiIsIndlY29tIjoiIiwibGFyayI6IiIsImdpdGxhYiI6IiIsImNyZWF0ZWRJcCI6IiIsImxhc3RTaWduaW5UaW1lIjoiIiwibGFzdFNpZ25pbklwIjoiIiwicHJlZmVycmVkTWZhVHlwZSI6IiIsInJlY292ZXJ5Q29kZXMiOm51bGwsInRvdHBTZWNyZXQiOiIiLCJtZmFQaG9uZUVuYWJsZWQiOmZhbHNlLCJtZmFFbWFpbEVuYWJsZWQiOmZhbHNlLCJsZGFwIjoiIiwicHJvcGVydGllcyI6e30sInJvbGVzIjpbXSwicGVybWlzc2lvbnMiOltdLCJncm91cHMiOltdLCJsYXN0U2lnbmluV3JvbmdUaW1lIjoiIiwic2lnbmluV3JvbmdUaW1lcyI6MCwibWFuYWdlZEFjY291bnRzIjpudWxsLCJ0b2tlblR5cGUiOiJhY2Nlc3MtdG9rZW4iLCJub25jZSI6InJEeVZEQmNtSDhIeSIsInRhZyI6InN0YWZmIiwic2NvcGUiOiJyZWFkIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDAwIiwic3ViIjoiYWVjMjk1MGEtOTMxMS00YzZjLWI3MGItMDJkYjM5MDlmZDg0IiwiYXVkIjpbImU5NTM2ODZmMDRlNzA1NWI2OThiIl0sImV4cCI6MTczMzI2MDgwNywibmJmIjoxNzMyNjU2MDA3LCJpYXQiOjE3MzI2NTYwMDcsImp0aSI6ImFkbWluLzZlNWM2MzkxLTIyMzItNDFhOC05YjMxLTk0NTJmMDM1NDMxZiJ9.jDR9jcyxJaxuP-3YVOf12sHB-gaSDIYeVgYPjsU-Y0gfZls-wbvX2e2sddrCzeEbLKFoQnG9YBzaKK6VF4ePAIbjdfUzUy4Pp_Uckjq8tD1EdZUtieDay51508zvagXClMgyF_K8CvBy-kHpkGiMtH_lediHTQuUBYS9oMajzRP_TgUsQvf6KGshv_LJD4DFgjar9yWpkGBMxqdGLo17x_cO2K-6c8Wz53jxw0qP-GqXHhzhjlvcAe-WtFaFUkuYD-6nOprzM8vpqTiZ-WR1EjjgTq8j5iB4NUBamoPhrDcxF9x-pKZKjqAOQ20j8LXJHrwFRcrgX7zT5rnrpWZeZTqZ3N0s9SUQWt19yT3B-C6yCj6cEzmmRBFZWEciWSNsOUbbqdLwJwhyPsYRjne7-fXn545xk_vb1-bIqL0ntH0-DI2lfm9W0yAWWb8ezmYkInH8fVipMQkmLv8u3Ct0BasFQMYTs1KHBVZ5YbNdKuxcWs5kR6xVh5z6ZD-C48R4xqsa7_6GXLG3LYxZ6zoid7XVPm7CgBGhAQeRlSM_qOSUec62xSB1OFZo9jygp0zFrDi97BSDOPkbpGXCyvPEYv9IqBCVBLVcuFo8BNehRh-t3FKXm8mHoOP07XQHHxj9HjPr7Yxng_MBiJbJmmcDWHLlHZXOCMP1bQ-PN4k4uQo