use dsh_sdk::protocol_adapters::token::{
DatastreamsMqttTokenClaim, RequestDataAccessToken, RequestRestToken, RestToken,
api_client_token_fetcher::ApiClientTokenFetcher,
};
use std::time::{SystemTime, UNIX_EPOCH};
const PLATFORM: dsh_sdk::Platform = dsh_sdk::Platform::Poc;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let tenant_name = std::env::var("TENANT").expect("TENANT environment variable is not set");
let api_key = std::env::var("API_KEY").expect("API_KEY environment variable is not set");
env_logger::builder()
.filter(Some("dsh_sdk"), log::LevelFilter::Trace)
.target(env_logger::Target::Stdout)
.init();
println!("API Authentication Service Code:\n");
let token_fetcher = ApiClientTokenFetcher::new(api_key, PLATFORM);
let claim = DatastreamsMqttTokenClaim::new()
.set_id("External-client-id") .set_relexp(300);
let expiration_time = SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("System time is before UNIX epoch")
.as_secs() as i64
+ 600;
let rest_token_request = RequestRestToken::new(&tenant_name)
.set_exp(expiration_time)
.set_claims(claim);
let partial_token = token_fetcher
.get_or_fetch_rest_token(rest_token_request)
.await?;
println!(
"\nGenerated REST token with partial permissions: {:?}",
partial_token
);
let raw_token = partial_token.raw_token();
println!("\nRaw token to send to external client: {}", raw_token);
println!("\nExternal Client Code:");
let rest_token = RestToken::parse(raw_token)?;
println!("\nParsed REST token: {:?}", rest_token);
let data_access_request =
RequestDataAccessToken::new(rest_token.tenant_id(), "External-client-id");
let http_client = reqwest::Client::new();
let data_access_token = data_access_request.send(&http_client, rest_token).await?;
println!("\nFetched DataAccessToken: {:#?}", data_access_token);
Ok(())
}