use crate::client::{Client, DEFAULT_BASE_URL};
use crate::error::Error;
use crate::helpers::authkit::{
AuthKitAuthorizationUrlParams, AuthKitHelper, AuthKitPkceAuthorizationUrl,
};
use crate::helpers::sso_helpers::{SsoAuthorizationUrlParams, SsoHelper, SsoPkceAuthorizationUrl};
pub struct PublicClient {
client: Client,
}
impl PublicClient {
pub fn new(client_id: impl Into<String>) -> Self {
Self::with_base_url(client_id, DEFAULT_BASE_URL)
}
pub fn with_base_url(client_id: impl Into<String>, base_url: impl Into<String>) -> Self {
let client = Client::builder()
.client_id(client_id)
.base_url(base_url)
.build();
Self { client }
}
pub fn authkit_authorization_url(
&self,
params: AuthKitAuthorizationUrlParams,
) -> Result<AuthKitPkceAuthorizationUrl, Error> {
AuthKitHelper::new(&self.client).pkce_authorization_url(params)
}
pub fn sso_authorization_url(
&self,
params: SsoAuthorizationUrlParams,
) -> Result<SsoPkceAuthorizationUrl, Error> {
SsoHelper::new(&self.client).pkce_authorization_url(params)
}
pub fn client(&self) -> &Client {
&self.client
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn builds_authkit_url_with_pkce() {
let pc = PublicClient::with_base_url("client_123", "https://api.workos.com");
let result = pc
.authkit_authorization_url(AuthKitAuthorizationUrlParams {
redirect_uri: "https://app.example/cb".to_string(),
..Default::default()
})
.unwrap();
assert!(result.url.contains("code_challenge_method=S256"));
assert!(result.url.contains("client_id=client_123"));
}
#[test]
fn builds_sso_url_with_pkce() {
let pc = PublicClient::with_base_url("client_123", "https://api.workos.com");
let result = pc
.sso_authorization_url(SsoAuthorizationUrlParams {
redirect_uri: "https://app.example/cb".to_string(),
..Default::default()
})
.unwrap();
assert!(result.url.contains("code_challenge_method=S256"));
}
}