paseto 2.0.2+1.0.3

An alternative token format to JWT
Documentation
#[cfg(feature = "easy_tokens_chrono")]
use chrono::prelude::*;
#[cfg(any(feature = "easy_tokens_chrono", feature = "easy_tokens_time"))]
use serde_json::json;
#[cfg(feature = "easy_tokens_time")]
use time::{time, Date, OffsetDateTime};

fn main() {
  #[cfg(all(feature = "easy_tokens_chrono", not(feature = "easy_tokens_time")))]
  chrono_example();

  #[cfg(all(feature = "easy_tokens_time", not(feature = "easy_tokens_chrono")))]
  time_example();

  #[cfg(all(feature = "easy_tokens_time", feature = "easy_tokens_chrono"))]
  chrono_and_time_example();
}

#[cfg(all(feature = "easy_tokens_chrono", not(feature = "easy_tokens_time")))]
fn chrono_example() {
  let current_date_time = Utc::now();
  let dt = Utc.ymd(current_date_time.year() + 1, 7, 8).and_hms(9, 10, 11);

  let token = paseto::tokens::PasetoBuilder::new()
    .set_encryption_key(&Vec::from("YELLOW SUBMARINE, BLACK WIZARDRY".as_bytes()))
    .set_issued_at(None)
    .set_expiration(&dt)
    .set_issuer("instructure")
    .set_audience("wizards")
    .set_jti("gandalf0")
    .set_not_before(&Utc::now())
    .set_subject("gandalf")
    .set_claim("go-to", json!("mordor"))
    .set_footer("key-id:gandalf0")
    .build()
    .expect("Failed to construct paseto token w/ builder!");
  println!("{:?}", token);

  let verified_token = paseto::tokens::validate_local_token(
    &token,
    Some("key-id:gandalf0"),
    &"YELLOW SUBMARINE, BLACK WIZARDRY".as_bytes(),
    &paseto::tokens::TimeBackend::Chrono,
  )
  .expect("Failed to validate token!");
  println!("{:?}", verified_token);
}

#[cfg(all(feature = "easy_tokens_time", not(feature = "easy_tokens_chrono")))]
fn time_example() {
  let current_date_time = OffsetDateTime::now_utc();
  let dt = Date::try_from_ymd(current_date_time.year(), 7, 8)
    .unwrap()
    .with_time(time!(09:10:11))
    .assume_utc();

  let token = paseto::tokens::PasetoBuilder::new()
    .set_encryption_key(&Vec::from("YELLOW SUBMARINE, BLACK WIZARDRY".as_bytes()))
    .set_issued_at(None)
    .set_expiration(&dt)
    .set_issuer("instructure")
    .set_audience("wizards")
    .set_jti("gandalf0")
    .set_not_before(&OffsetDateTime::now_utc())
    .set_subject("gandalf")
    .set_claim("go-to", json!("mordor"))
    .set_footer("key-id:gandalf0")
    .build()
    .expect("Failed to construct paseto token w/ builder!");
  println!("{:?}", token);

  let verified_token = paseto::tokens::validate_local_token(
    &token,
    Some("key-id:gandalf0"),
    &"YELLOW SUBMARINE, BLACK WIZARDRY".as_bytes(),
    &paseto::tokens::TimeBackend::Time,
  )
  .expect("Failed to validate token!");
  println!("{:?}", verified_token);
}

#[cfg(all(feature = "easy_tokens_time", feature = "easy_tokens_chrono"))]
fn chrono_and_time_example() {
  {
    println!("Using Time Crate:");
    let current_date_time = OffsetDateTime::now_utc();
    let dt = Date::try_from_ymd(current_date_time.year(), 7, 8)
      .unwrap()
      .with_time(time!(09:10:11))
      .assume_utc();

    let token = paseto::tokens::PasetoBuilder::new()
      .set_encryption_key(&Vec::from("YELLOW SUBMARINE, BLACK WIZARDRY".as_bytes()))
      .set_issued_at_time(None)
      .set_expiration_time(&dt)
      .set_issuer("instructure")
      .set_audience("wizards")
      .set_jti("gandalf0")
      .set_not_before_time(&OffsetDateTime::now_utc())
      .set_subject("gandalf")
      .set_claim("go-to", json!("mordor"))
      .set_footer("key-id:gandalf0")
      .build()
      .expect("Failed to construct paseto token w/ builder!");
    println!("{:?}", token);

    let verified_token = paseto::tokens::validate_local_token(
      &token,
      Some("key-id:gandalf0"),
      &"YELLOW SUBMARINE, BLACK WIZARDRY".as_bytes(),
      &paseto::tokens::TimeBackend::Time,
    )
    .expect("Failed to validate token!");
    println!("{:?}", verified_token);
  }

  {
    println!("Using Chrono Crate");
    let current_date_time = Utc::now();
    let dt = Utc.ymd(current_date_time.year() + 1, 7, 8).and_hms(9, 10, 11);

    let token = paseto::tokens::PasetoBuilder::new()
      .set_encryption_key(&Vec::from("YELLOW SUBMARINE, BLACK WIZARDRY".as_bytes()))
      .set_issued_at_chrono(None)
      .set_expiration_chrono(&dt)
      .set_issuer("instructure")
      .set_audience("wizards")
      .set_jti("gandalf0")
      .set_not_before_chrono(&Utc::now())
      .set_subject("gandalf")
      .set_claim("go-to", json!("mordor"))
      .set_footer("key-id:gandalf0")
      .build()
      .expect("Failed to construct paseto token w/ builder!");
    println!("{:?}", token);

    let verified_token = paseto::tokens::validate_local_token(
      &token,
      Some("key-id:gandalf0"),
      &"YELLOW SUBMARINE, BLACK WIZARDRY".as_bytes(),
      &paseto::tokens::TimeBackend::Chrono,
    )
    .expect("Failed to validate token!");
    println!("{:?}", verified_token);
  }
}