16个版本 (5个稳定版)
2.0.1 | 2024年8月11日 |
---|---|
2.0.0 | 2024年5月23日 |
2.0.0-beta.0 | 2024年1月6日 |
1.0.3 | 2023年12月8日 |
0.0.1 | 2020年12月13日 |
在 身份验证 中排名第 149
每月下载量 1,360
在 graph-rs-sdk 中使用
540KB
10K SLoC
微软身份平台Rust SDK客户端
支持
- OpenId,授权码,客户端凭证,设备代码
- 自动令牌刷新
- 交互式身份验证 | 功能 =
interactive-auth
- 设备代码轮询
- 使用证书进行授权 | 功能 =
openssl
作为 graph-rs-sdk 项目的一部分,为微软Graph提供OAuth和Openid客户端。然而,该项目也可以作为OAuth客户端用于微软身份平台,或通过使用 graph-rs-sdk。
目录
异步版本
graph-oauth = "2.0.1"
tokio = { version = "1.25.0", features = ["full"] }
阻塞版本
graph-oauth = "2.0.1"
功能标志
native-tls
: 使用native-tls
TLS后端(*nix上的OpenSSL,Windows上的SChannel,macOS上的Secure Transport)。rustls-tls
: 使用rustls-tls
TLS后端(跨平台后端,仅支持TLS 1.2和1.3)。interactive-auth
: 使用 wry crate进行交互式身份验证,在支持的平台(如桌面)上运行web视图。openssl
: 在OAuth2和Openid Connect流程中使用来自openssl crate的X509证书。
默认功能: default=["native-tls"]
这些功能在reqwest crate中启用native-tls和rustls-tls功能。更多信息请参阅 reqwest crate。
概述
以下示例使用 anyhow
crate 的 Result 类型。还建议使用此 crate 的用户使用 anyhow
crate 以获得更好的错误处理。
该 crate 正在经历重大开发,以支持 Microsoft Identity Platform 中所有或大多数可能支持的场景。GitHub 上的 master 分支可能包含一些不稳定的功能。任何不是该 crate 的预发布版本的版本都被视为稳定版本。
使用应用程序构建器来存储您的身份验证配置,并由客户端为您处理访问令牌请求。
构建您选择的 OAuth 或 OpenId Connect 流程主要有两种类型。
PublicClientApplication
ConfidentialClientApplication
一旦您构建了 ConfidentialClientApplication
或 PublicClientApplication
,您可以将这些传递给图形客户端。
自动令牌刷新也通过将 ConfidentialClientApplication
或 PublicClientApplication
传递给 Graph
客户端来实现。
有关更详细的示例,请参阅 OAuth 示例,位于 GitHub 上的 examples/oauth 目录。
let confidental_client: ConfidentialClientApplication<ClientSecretCredential> = ...
let graph_client = Graph::from(confidential_client);
凭证
授权码
授权代码授予被认为是一个机密客户端(除了混合流程之外),我们可以通过用户执行登录操作后重定向到 URL 查询中返回的授权代码来获取访问令牌。
一旦您有了授权代码,您可以将其传递给客户端,客户端将在您第一次调用图形 API 时执行获取访问令牌的请求。
use graph_rs_sdk::{
Graph,
oauth::ConfidentialClientApplication,
};
async fn build_client(
authorization_code: &str,
client_id: &str,
client_secret: &str,
redirect_uri: url::Url,
scope: Vec<&str>
) -> anyhow::Result<GraphClient> {
let mut confidential_client = ConfidentialClientApplication::builder(client_id)
.with_authorization_code(authorization_code) // returns builder type for AuthorizationCodeCredential
.with_client_secret(client_secret)
.with_scope(scope)
.with_redirect_uri(redirect_uri)?
.build();
let graph_client = Graph::from(&confidential_client);
Ok(graph_client)
}
客户端凭证
OAuth 2.0 客户端凭据授予流程允许网络服务(机密客户端)使用其自己的凭据,而不是模仿用户,在调用其他网络服务时进行身份验证。RFC 6749 中指定的授权,有时称为双脚 OAuth,可以通过使用应用程序的身份来访问托管在 Web 上的资源。这种类型通常用于在后台运行的服务器到服务器交互,无需立即与用户交互,通常称为守护程序或服务帐户。
客户端凭据流需要一次性管理员接受您应用程序作用域的权限。要查看构建登录 URL 并作为管理员接受权限的示例,请参阅 管理员同意示例
客户端密钥凭证
use graph_rs_sdk::{oauth::ConfidentialClientApplication, GraphClient};
pub async fn build_client(client_id: &str, client_secret: &str, tenant: &str) -> GraphClient {
let mut confidential_client_application = ConfidentialClientApplication::builder(client_id)
.with_client_secret(client_secret)
.with_tenant(tenant)
.build();
GraphClient::from(&confidential_client_application)
}
环境凭证
客户端密钥环境凭证
环境变量
- AZURE_TENANT_ID(可选/推荐 - 在授权 URL 中放置租户 ID)
- AZURE_CLIENT_ID(必需)
- AZURE_CLIENT_SECRET(必需)
pub fn client_secret_credential() -> anyhow::Result<GraphClient> {
let confidential_client = EnvironmentCredential::client_secret_credential()?;
Ok(GraphClient::from(&confidential_client))
}
资源所有者密码凭证
环境变量
- AZURE_TENANT_ID(可选 - 在授权 URL 中放置租户 ID)
- AZURE_CLIENT_ID(必需)
- AZURE_USERNAME(必需)
- AZURE_PASSWORD(必需)
pub fn username_password() -> anyhow::Result<GraphClient> {
let public_client = EnvironmentCredential::resource_owner_password_credential()?;
Ok(GraphClient::from(&public_client))
}
自动令牌刷新
使用自动令牌刷新需要在令牌响应中获得刷新令牌。要获取刷新令牌,您必须包含 offline_access
作用域。
自动令牌刷新是通过将 ConfidentialClientApplication
或 PublicClientApplication
传递给 Graph
客户端来实现的。
如果您正在使用 client_credentials
授予,则不需要 offline_access
作用域。令牌仍然会自动刷新,因为这个流程不需要使用刷新令牌来获取新的访问令牌。
async fn authenticate(client_id: &str, tenant: &str, redirect_uri: url::Url) {
let scope = vec!["offline_access"];
let mut credential_builder = ConfidentialClientApplication::builder(client_id)
.auth_code_url_builder()
.with_tenant(tenant)
.with_scope(scope) // Adds offline_access as a scope which is needed to get a refresh token.
.with_redirect_uri(redirect_uri)
.url();
// ... add any other parameters you need
}
交互式身份验证
需要功能 interactive_auth
[dependencies]
graph-rs-sdk = { version = "...", features = ["interactive_auth"] }
交互式身份验证使用 wry crate 在支持其的平台(如桌面)上运行 Web 视图。
use graph_rs_sdk::{
identity::{
interactive::WithInteractiveAuth, AuthorizationCodeCredential, IntoCredentialBuilder,
Secret,
},
GraphClient,
http::Url,
};
async fn authenticate(
tenant_id: &str,
client_id: &str,
client_secret: &str,
redirect_uri: &str,
scope: Vec<&str>,
) -> anyhow::Result<GraphClient> {
std::env::set_var("RUST_LOG", "debug");
pretty_env_logger::init();
let (authorization_response, credential_builder) =
AuthorizationCodeCredential::authorization_url_builder(client_id)
.with_tenant(tenant_id)
.with_scope(scope) // Adds offline_access as a scope which is needed to get a refresh token.
.with_redirect_uri(Url::parse(redirect_uri)?)
.with_interactive_auth(Secret("secret".to_string()), Default::default())
.into_credential_builder()?;
debug!("{authorization_response:#?}");
let confidential_client = credential_builder.build();
Ok(GraphClient::from(&confidential_client))
}
依赖项
22–64MB
~1M SLoC