16个版本 (5个稳定版)

2.0.1 2024年8月11日
2.0.0 2024年5月23日
2.0.0-beta.02024年1月6日
1.0.3 2023年12月8日
0.0.1 2020年12月13日

身份验证 中排名第 149

Download history 196/week @ 2024-04-29 356/week @ 2024-05-06 219/week @ 2024-05-13 511/week @ 2024-05-20 346/week @ 2024-05-27 328/week @ 2024-06-03 356/week @ 2024-06-10 337/week @ 2024-06-17 245/week @ 2024-06-24 132/week @ 2024-07-01 222/week @ 2024-07-08 219/week @ 2024-07-15 408/week @ 2024-07-22 264/week @ 2024-07-29 447/week @ 2024-08-05 234/week @ 2024-08-12

每月下载量 1,360
graph-rs-sdk 中使用

MIT 协议

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

一旦您构建了 ConfidentialClientApplicationPublicClientApplication,您可以将这些传递给图形客户端。

自动令牌刷新也通过将 ConfidentialClientApplicationPublicClientApplication 传递给 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 作用域。

自动令牌刷新是通过将 ConfidentialClientApplicationPublicClientApplication 传递给 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