1use ibmcloud_iam::jwt::validate_token;
2use ibmcloud_iam::pdp as pdpapi;
3use ibmcloud_iam::pdp::Resource;
4use ibmcloud_iam::token::TokenManager;
5
6pub fn main() -> Result<(), Box<dyn std::error::Error>> {
7 let endpoint = "https://iam.cloud.ibm.com";
9
10 let api_key =
14 std::env::var("IBMCLOUD_API_KEY").expect("Could not read IBMCLOUD_API_KEY from env");
15 let tm = TokenManager::new(&api_key, &endpoint);
16 let user_token = tm.token()?;
17
18 let _claims = validate_token(&user_token, &endpoint);
20
21 let service_id_key =
23 std::env::var("SERVICE_ID_KEY").expect("Could not parse SERVICE_ID_KEY from env");
24
25 let pdp = pdpapi::PDPClient::new(&service_id_key, &endpoint);
27
28 let sub = pdpapi::subject_from_token(&user_token);
30
31 let action = "books.dashboard.view";
33
34 let mut resource = Resource::new();
38 [
39 ("serviceName", "books"),
40 ("accountId", "1111222233334444"),
41 ("ctype", "public"),
42 ("serviceInstance", "9e386139-0000-000-8101-103771fa7793"),
43 ]
44 .iter()
45 .for_each(|tup| {
46 resource.insert(tup.0.to_string(), tup.1.to_string());
47 });
48
49 let resp = pdp.authorize(sub, &action, resource)?;
51
52 println!("Authorization Decision: {:?}", resp);
53
54 Ok(())
55}