#unix #access-token #user #system #async #requests #oidc-agent

oidc_agent_rs

仅适用于Unix的oidc-agent库,用于Rust

4个版本

新版本 0.2.0 2024年8月16日
0.1.2 2024年7月9日
0.1.1 2024年7月9日
0.1.0 2024年7月5日

#207 in HTTP客户端

Download history 88/week @ 2024-07-01 246/week @ 2024-07-08 1/week @ 2024-07-15 37/week @ 2024-07-29 160/week @ 2024-08-12

197 每月下载次数

MIT/Apache

47KB
910

仅适用于Unix的 oidc-agent 库,用于Rust

描述

此crate是oidc-agent IPC-API的接口。

必须以用户系统运行oidc-agent,并且必须正确导出OIDC_SOCK。

获取access_token

基本用法

要使用帐户简称获取access_token,请在main.rs中运行以下代码

use oidc_agent_rs::{Agent, Error};

fn main() -> Result<(), Error> {
   let agent = Agent::new()?;
   let access_token = agent.get_access_token("profile_shortname")?;

   println!("{}", access_token.secret());
   Ok(())
}

需要使用secret()方法以&str值的形式获取令牌。否则将返回Token伪结构体。

异步用法

对于异步编程,您需要启用async功能并使用crate::async_impl::Agent。以下是一个异步获取access_token的基本示例

use oidc_agent_rs::async_impl::Agent;
use oidc_agent_rs::Error;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
   let agent = Agent::new().await?;

   let at = agent.get_access_token("profile_shortname").await?;
   println!("{}", at.secret());

   Ok(())
}

Cargo.toml

 [dependencies]
 oidc_agent_rs = { version = "0.2.0", features=["async"]}
 tokio = { version = "1.39.2", features = ["net", "io-util", "macros", "rt-multi-thread"] }

高级请求

要使用更高级的选项获取access_token,您必须使用请求构建器。 AccessTokenRequest 有一个方法来轻松构建新的请求。然后您必须直接将请求发送到代理并解析响应。

示例

use oidc_agent_rs::{requests::AccessTokenRequest, Agent, Error};

fn main() -> Result<(), Error> {
    let agent = Agent::new()?;
    
    //obtaining access_token by issuer only (no shortname needed)
    let at_request = AccessTokenRequest::builder()
        .issuer("https://issuer.url")?
        .min_valid_period(60)
        .build()?;

    let at_response = agent.send_request(at_request)?;

    println!("{}", at_response.access_token().secret());
    println!("{}", at_response.issuer());
    println!("{}", at_response.expires_at());

    Ok(())
}

获取mytoken

基本用法

仅使用帐户简称获取mytoken与获取access_token非常相似。

示例

use oidc_agent_rs::{Agent, Error};

fn main() -> Result<(), Error> {
    let agent = Agent::new()?;

    let mytoken = agent.get_mytoken("mytoken")?;

    println!("{}", mytoken.secret());

    Ok(())
}

再次使用secret()方法以&str值的形式获取令牌。

高级请求

如果您想使用特定的Mytoken配置文件获取新的mytoken,您必须创建新的Profile元素。支持所有在Mytoken文档中记录的配置文件对象。您可以将多个CapabilityRestriction元素以及单个Rotation元素添加到Profile中。然后,将Profile元素添加到MyTokenRequest元素中。

示例

 use oidc_agent_rs::mytoken::{Capability, Profile, Restriction, Rotation, TokenInfoPerms};
 use oidc_agent_rs::requests::MyTokenRequest;
 use oidc_agent_rs::{Agent, Error};

 fn main() -> Result<(), Error> {
     let agent = Agent::new()?;
     let mut profile = Profile::new();

     //basic capabilites
     let caps = vec![Capability::AT, Capability::TokenInfo(TokenInfoPerms::All)];

     //new restriction
     let restriction = Restriction::builder()
         .usages_AT(5) //number of mytoken max usages
         .add_geoip_allow(vec!["pl", "de"]) //geoip allowed regions
         .build();

     //basic rotation
     let rotation = Rotation::builder().set_on_AT().set_lifetime(1000).build()?;

     profile.add_capabilities(&caps);
     profile.add_restrictions(&vec![restriction]);
     profile.set_rotation(&rotation);

     let mt_request = MyTokenRequest::builder("mytoken")
         .mytoken_profile(&profile)
         .build()?;

     let mt_response = agent.send_request(mt_request)?;

     println!("{}", mt_response.mytoken().secret());

     Ok(())
 }

依赖关系

~3–13MB
~158K SLoC