keycloak/lib.rs
1/*!
2# Keycloak Admin REST API
3
4## Legal
5
6Dual-licensed under `MIT` or the [UNLICENSE](http://unlicense.org/).
7
8## Features
9
10Implements [Keycloak Admin REST API version 26.5.2](https://www.keycloak.org/docs-api/26.5.2/rest-api/index.html).
11
12### Feature flags
13
14Default flags: `tags-all`, `resource-builder`, `reqwest`.
15
16- `rc`: use `Arc` for deserialization.
17- `schemars`: add [schemars](https://crates.io/crates/schemars) support.
18- `multipart`: add multipart support to reqwest, enabling extra methods in API.
19- `tags-all`: activate all tags (resource groups) in REST API, it is default behavior. Disable default features and use individual `tag-xxx` features to activate only required resource groups. For a full list reference the [Cargo.toml](Cargo.toml).
20- `resource-builder`: add resource builder support.
21- `reqwest`: use up to date [reqwest](https://crates.io/crates/reqwest) version (`reqwest 0.13.x`).
22- `reqwest12`: use `reqwest 0.12.x`.
23- `reqwest13`: use `reqwest 0.13.x`.
24
25## Usage
26
27Requires Rust version >= `1.87.0`.
28
29Add dependency to Cargo.toml:
30
31```toml
32[dependencies]
33keycloak = "~26.5"
34```
35
36```rust, no_run
37#[tokio::main]
38async fn main() -> Result<(), Box<dyn std::error::Error>> {
39 use keycloak::{prelude::reqwest, types::*, KeycloakAdmin, KeycloakAdminToken};
40
41 const REALM: &str = "resource";
42
43 let url = std::env::var("KEYCLOAK_ADDR").unwrap_or_else(|_| "http://localhost:8080".into());
44 let user = std::env::var("KEYCLOAK_USER").unwrap_or_else(|_| "admin".into());
45 let password = std::env::var("KEYCLOAK_PASSWORD").unwrap_or_else(|_| "password".into());
46
47 let client = reqwest::Client::new();
48 let admin_token = KeycloakAdminToken::acquire(&url, &user, &password, &client).await?;
49
50 eprintln!("{admin_token:?}");
51
52 let admin = KeycloakAdmin::new(&url, admin_token, client);
53
54 admin
55 .post(RealmRepresentation {
56 realm: Some(REALM.into()),
57 ..Default::default()
58 })
59 .await?;
60
61 let realm = admin.realm(REALM);
62
63 let response = realm
64 .users_post(UserRepresentation {
65 username: Some("user".into()),
66 ..Default::default()
67 })
68 .await?;
69
70 eprintln!("{:?}", response.to_id());
71
72 let users = realm.users_get().username("user".to_string()).await?;
73
74 eprintln!("{users:?}");
75
76 let id = users
77 .iter()
78 .find(|u| u.username == Some("user".into()))
79 .unwrap()
80 .id
81 .as_ref()
82 .unwrap()
83 .to_string();
84
85 realm.users_with_user_id_delete(id.as_str()).await?;
86
87 realm.delete().await?;
88 Ok(())
89}
90```
91
92## Version agreement
93
94If we have `x.y.z` version of `keycloak`, our package version would be `x.y.(z * 100 + v)` there v is a minor
95fix version to official `x.y.z` version.
96
97Example: official version `13.0.1` is `13.0.100` for crate version. `13.0.102` means keycloak version `13.0.1` and minor fix version `2`.
98
99## Update
100
101To update current version use provided [update.ts](./update.ts) `deno` script:
102
103```sh
104deno run --allow-env=KEYCLOAK_RUST_VERSION,KEYCLOAK_VERSION,KEYCLOAK_RUST_MAJOR_VERSION --allow-read=Cargo.toml --allow-write=Cargo.toml,api/openapi.json,src/types.rs,src/rest/generated_rest,src/resource --allow-net=keycloak.org,www.keycloak.org --allow-run=cargo,gh,git,handlebars-magic update.ts
105```
106
107*/
108
109#[cfg(feature = "builder")]
110pub mod builder;
111#[cfg(feature = "resource")]
112pub mod resource;
113pub mod types;
114
115mod error;
116pub mod prelude;
117mod rest;
118
119pub use error::KeycloakError;
120pub use rest::{
121 DefaultResponse, KeycloakAdmin, KeycloakAdminToken, KeycloakRealmAdmin,
122 KeycloakRealmAdminMethod, KeycloakServiceAccountAdminTokenRetriever, KeycloakTokenSupplier,
123};