#actix-web #oauth #google #v2

service-authenticator

OAuth2实现,提供使用actix-web进行通信的'service account'授权流程

2个版本

0.1.1 2020年10月2日
0.1.0 2020年10月2日

#988 in 认证

MIT/Apache

44KB
1K SLoC

此库基于yup-oauth2开发。许多文档注释仍然引用原始库。

此库可用于获取服务的OAuth2.0认证。

为了使您的应用程序使用此库,您需要通过遵循此指南(适用于Google服务)或连接到的API提供者的文档来获取应用程序ID和密钥。

服务帐户"流程"

在使用服务帐户凭据时,无需用户交互。可以通过客户端的私钥(您可以从API提供者处下载)自动获取访问令牌。请参阅service_account以获取如何使用服务帐户凭据的示例。请参阅developers.google.com以获取协议的详细描述。此crate基于Google API实现OAuth for Service Accounts;它可能与其他提供者不兼容。

返回的Token将存储在内存中,以授权对相同作用域的将来API请求。在创建认证器时,可以通过使用persist_tokens_to_disk将令牌可选地持久化到磁盘。

以下示例展示了如何使用此crate的基本方法

use service_authenticator::parse_service_key;
use service_authenticator::AuthenticatorBuilder as AB;

static SERVICE_CREDENTIALS:&[u8] = include_bytes!("path to jour credentials.json");
// The clientsecret file contains JSON like `{"type":"service_account", "project_id":"my-super-project", ...}`
#[tokio::main]
async fn main() {
    let service_key = parse_service_key(SERVICE_CREDENTIALS)
       .expect("bad gmail credentials");
    let authenticator = AB::with_service_key(service_key, ACCOUNT_EMAIL)
      .build()
      .await
      .expect("failed to create authenticator");
    // once you have authenticator, you can ask for the authorization header
    // for any scopes your service account is approved
    let scopes = &["https://www.googleapis.com/auth/gmail.send"];
    let authorization_header = authenticator
      .header(GMAIL_SCOPES)
      .await
      .expect("Failed to get authorization token");
    // now with the authorization header you can send api requests
    let mut resp = authenticator
      .client
      .post("https:://gmail.googleapis.com/gmail/v1/users/USEREMAIL/messages/send")
      .header("Content-Type", "application/json")
      .header("Authorization", authorization_header.as_str())
      .send_body(r#"{"raw": "base64 encoded email message"}"#)
      .await
      .expect("response error");
    println!("Status:{}", resp.status());
    match resp.body().await {
      Ok(b) => println!("Body:{:?}", &b),
      Err(e) => println!("Err:{:?}", e),
    }
    Ok(())
}

依赖关系

~37MB
~849K SLoC