Struct zitadel::credentials::ServiceAccount
source · pub struct ServiceAccount { /* private fields */ }
Expand description
A service account for ZITADEL. The service account can be loaded from a valid JSON string or from a file containing the JSON string. The account is used to communicate with the ZITADEL API and may serve as access token provider for a gRPC service client.
The service account can be used with the provided access rights in ZITADEL. If you want to use the ZITADEL API itself (for example to manage organizations) TODO: sicher?
To create a service account json, head over to your ZITADEL console and execute the following steps:
- create a
Service User
in your organization - Give the service user the relevant authorization (e.g. ORG_OWNER or access to a specific project)
- Create a “key” in the account detail page of the service user and download it
Implementations§
source§impl ServiceAccount
impl ServiceAccount
sourcepub fn load_from_file(file_path: &str) -> Result<Self, ServiceAccountError>
pub fn load_from_file(file_path: &str) -> Result<Self, ServiceAccountError>
Load a ServiceAccount
from a JSON file at a specific filepath.
§Errors
This function may return an error when read_to_string
returns an error.
Further, an error may occur during the deserialization of
load_from_json
.
§Example
use zitadel::credentials::ServiceAccount;
let service_account = ServiceAccount::load_from_file("./my_json_key.json")?;
println!("{:#?}", service_account);
sourcepub fn load_from_json(json: &str) -> Result<Self, ServiceAccountError>
pub fn load_from_json(json: &str) -> Result<Self, ServiceAccountError>
Load a ServiceAccount
from a JSON string.
§Errors
This method may fail if the deserialization does fail. Such an error can occur if the JSON is not formatted properly.
§Example
use zitadel::credentials::ServiceAccount;
let service_account = ServiceAccount::load_from_json(r#"{"keyId": "1337", "userId": "42", "key": "foobar"}"#)?;
println!("{:#?}", service_account);
sourcepub async fn authenticate(
&self,
audience: &str
) -> Result<String, ServiceAccountError>
pub async fn authenticate( &self, audience: &str ) -> Result<String, ServiceAccountError>
Authenticates the ServiceAccount
against the provided audience (or issuer) to
fetch an access token. To authenticate with special options, use the
authenticate_with_options call.
The function returns an access token that can be sent to authenticate any request as the given service account. The access token is valid for 60 minutes.
§Errors
This method may fail when:
- The key in the service account is not a valid PEM encoded RSA private key.
- When the audience (issuer) is not reachable.
- When any error in the request happens.
- When the response status code is not 200 OK.
- When the response cannot be parsed as valid JSON.
§Example
use zitadel::credentials::ServiceAccount;
let service_account = ServiceAccount::load_from_json(SERVICE_ACCOUNT)?;
let access_token = service_account.authenticate(ZITADEL_URL).await?;
println!("{}", access_token);
sourcepub async fn authenticate_with_options(
&self,
audience: &str,
options: &AuthenticationOptions
) -> Result<String, ServiceAccountError>
pub async fn authenticate_with_options( &self, audience: &str, options: &AuthenticationOptions ) -> Result<String, ServiceAccountError>
Authenticates the ServiceAccount
against the provided audience (or issuer) like
authenticate. However, the user can specify special options for the authentication
within AuthenticationOptions
.
The function returns an access token that can be sent to authenticate any request as the given service account. The access token is valid for 60 minutes.
§Errors
This method may fail when:
- The key in the service account is not a valid PEM encoded RSA private key.
- When the audience (issuer) is not reachable.
- When any error in the request happens.
- When the response status code is not 200 OK.
- When the response cannot be parsed as valid JSON.
§Examples
§Authenticate with API access and profile scope
use zitadel::credentials::{AuthenticationOptions, ServiceAccount};
let service_account = ServiceAccount::load_from_json(SERVICE_ACCOUNT)?;
let access_token = service_account.authenticate_with_options(ZITADEL_URL, &AuthenticationOptions {
api_access: true,
scopes: vec!["profile".to_string()],
..Default::default()
}).await?;
println!("{}", access_token);
§Authenticate with profile and email scope
use zitadel::credentials::{AuthenticationOptions, ServiceAccount};
let service_account = ServiceAccount::load_from_json(SERVICE_ACCOUNT)?;
let access_token = service_account.authenticate_with_options(ZITADEL_URL, &AuthenticationOptions {
scopes: vec!["profile".to_string(), "email".to_string()],
..Default::default()
}).await?;
println!("{}", access_token);
Trait Implementations§
source§impl Clone for ServiceAccount
impl Clone for ServiceAccount
source§fn clone(&self) -> ServiceAccount
fn clone(&self) -> ServiceAccount
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl Debug for ServiceAccount
impl Debug for ServiceAccount
source§impl<'de> Deserialize<'de> for ServiceAccount
impl<'de> Deserialize<'de> for ServiceAccount
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl Freeze for ServiceAccount
impl RefUnwindSafe for ServiceAccount
impl Send for ServiceAccount
impl Sync for ServiceAccount
impl Unpin for ServiceAccount
impl UnwindSafe for ServiceAccount
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoCollection<T> for T
impl<T> IntoCollection<T> for T
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request
source§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self
with the foreground set to
value
.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red()
and
green()
, which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg()
:
use yansi::{Paint, Color};
painted.fg(Color::White);
Set foreground color to white using white()
.
use yansi::Paint;
painted.white();
source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightBlack
.
§Example
println!("{}", value.bright_black());
source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightGreen
.
§Example
println!("{}", value.bright_green());
source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightYellow
.
§Example
println!("{}", value.bright_yellow());
source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightMagenta
.
§Example
println!("{}", value.bright_magenta());
source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightWhite
.
§Example
println!("{}", value.bright_white());
source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self
with the background set to
value
.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red()
and
on_green()
, which have the same functionality but
are pithier.
§Example
Set background color to red using fg()
:
use yansi::{Paint, Color};
painted.bg(Color::Red);
Set background color to red using on_red()
.
use yansi::Paint;
painted.on_red();
source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightBlack
.
§Example
println!("{}", value.on_bright_black());
source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightGreen
.
§Example
println!("{}", value.on_bright_green());
source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightYellow
.
§Example
println!("{}", value.on_bright_yellow());
source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightBlue
.
§Example
println!("{}", value.on_bright_blue());
source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightMagenta
.
§Example
println!("{}", value.on_bright_magenta());
source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightCyan
.
§Example
println!("{}", value.on_bright_cyan());
source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightWhite
.
§Example
println!("{}", value.on_bright_white());
source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute
value
.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold()
and
underline()
, which have the same functionality
but are pithier.
§Example
Make text bold using attr()
:
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);
Make text bold using using bold()
.
use yansi::Paint;
painted.bold();
source§fn underline(&self) -> Painted<&T>
fn underline(&self) -> Painted<&T>
Returns self
with the
attr()
set to
Attribute::Underline
.
§Example
println!("{}", value.underline());
source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Returns self
with the
attr()
set to
Attribute::RapidBlink
.
§Example
println!("{}", value.rapid_blink());
source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi
Quirk
value
.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask()
and
wrap()
, which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk()
:
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);
Enable wrapping using wrap()
.
use yansi::Paint;
painted.wrap();
source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting()
due to conflicts with Vec::clear()
.
The clear()
method will be removed in a future release.
fn clear(&self) -> Painted<&T>
resetting()
due to conflicts with Vec::clear()
.
The clear()
method will be removed in a future release.source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition
value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted
only when both stdout
and stderr
are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);