#oauth #reqwest #http #request

reqwest-oauth1

使用oauth1-request为reqwest添加OAuth1签名

5个版本

0.2.4 2023年11月19日
0.2.3 2022年10月30日
0.2.2 2022年7月26日
0.2.1 2022年5月29日
0.1.0 2020年10月9日

#48 in 认证

Download history 366/week @ 2024-04-23 216/week @ 2024-04-30 76/week @ 2024-05-07 329/week @ 2024-05-14 657/week @ 2024-05-21 681/week @ 2024-05-28 392/week @ 2024-06-04 143/week @ 2024-06-11 330/week @ 2024-06-18 270/week @ 2024-06-25 383/week @ 2024-07-02 187/week @ 2024-07-09 234/week @ 2024-07-16 235/week @ 2024-07-23 356/week @ 2024-07-30 189/week @ 2024-08-06

1,025 每月下载量
6 个crate中使用了(5 个直接使用)

MIT/Apache

68KB
1K SLoC

reqwest-oauth1: reqwest ♡ oauth1-request

使用reqwestoauth1-request为reqwest添加OAuth1签名。

此库提供了与reqwest部分兼容的接口。

您可以使用它几乎与reqwest相同,并通过OAuth1授权协议进行签名。

注意:此crate目前仅支持异步Client(reqwest::Client)。

安装

reqwest-oauth1的依赖项添加到您的Cargo.toml中,如下所示:

[dependencies]
reqwest-oauth1 = "*"

如何使用

快速概览

  1. 在您的代码中添加crate reqwest_oauth1的引用,如下所示:use reqwest_oauth1;
  2. 准备OAuth密钥:consumer_keyconsumer_secretaccess_tokentoken_secret
  3. oauth1方法添加到reqwest的方法链中。
use reqwest;
use reqwest::multipart;
use reqwest_oauth1::OAuthClientProvider;

// prepare authorization info
let consumer_key = "[CONSUMER_KEY]";
let consumer_secret = "[CONSUMER_SECRET]";
let access_token = "[ACCESS_TOKEN]";
let token_secret = "[TOKEN_SECRET]";

let secrets = reqwest_oauth1::Secrets::new(consumer_key, consumer_secret)
  .token(access_token, token_secret);

// sample: send new tweet to twitter
let endpoint = "https://api.twitter.com/1.1/statuses/update.json";

let content = multipart::Form::new()
    .text("status", "Hello, Twitter!");

let client = reqwest::Client::new();
let resp = client
    // enable OAuth1 request
    .oauth1(secrets)
    .post(endpoint)
    .multipart(content)
    .send()
    .await?;

OAuth密钥获取

此库还包括获取access_tokentoken_secret的支持。

请注意,仍然需要consumer_keyconsumer_secret,并且您必须以某种方式获取这些密钥。

use std::io;
use reqwest;
use reqwest_oauth1::{OAuthClientProvider, TokenReaderFuture};

// prepare authorization info
let consumer_key = "[CONSUMER_KEY]";
let consumer_secret = "[CONSUMER_SECRET]";

let secrets = reqwest_oauth1::Secrets::new(consumer_key, consumer_secret);

// sample: request access token to twitter

// step 1: acquire request token & token secret
let endpoint_reqtoken = "https://api.twitter.com/oauth/request_token";

let client = reqwest::Client::new();
let resp = client
    .oauth1(secrets)
    .post(endpoint_reqtoken)
    .query(&[("oauth_callback", "oob")])
    .send()
    .parse_oauth_token()
    .await?;

// step 2. acquire user pin
let endpoint_authorize = "https://api.twitter.com/oauth/authorize?oauth_token=";
println!("please access to: {}{}", endpoint_authorize, resp.oauth_token);

println!("input pin: ");
let mut user_input = String::new();
io::stdin().read_line(&mut user_input)?;
let pin = user_input.trim();

// step 3. acquire access token
let secrets = reqwest_oauth1::Secrets::new(consumer_key, consumer_secret)
    .token(resp.oauth_token, resp.oauth_token_secret);
let endpoint_acctoken = "https://api.twitter.com/oauth/access_token";

let client = reqwest::Client::new();
let resp = client
    .oauth1(secrets)
    .get(endpoint_acctoken)
    .query(&[("oauth_verifier", pin)])
    .send()
    .parse_oauth_token()
    .await?;
println!(
    "your token and secret is: \n token: {}\n secret: {}",
    resp.oauth_token, resp.oauth_token_secret
);
println!("other attributes: {:#?}", resp.remain);

另一个选项

您可以使用sign方法,而不是使用oauth1方法。

// instantiate our wrapper Client directly
let client = reqwest::Client::new();
let resp = client
    .post(endpoint)
    .multipart(form)
    // ... and add secrets to generate signature
    .sign(secrets)
    .send()
    .await?;

详细行为

您可以在OAuthParameters或get/post查询中指定oauth_*参数。

如果您同时指定这两个参数,则get/post查询中指定的参数将覆盖通过OAuthParameters传递的参数。

let params = reqwest_oauth1::OAuthParameters::new()
    .nonce("ThisNonceWillBeSuperseded");
let req = reqwest::Client::new()
    .oauth1_with_params(secrets, paras)
    .get(endpoint)
    .query(&[("nonce", "ThisNonceWillSupersedeTheOldOne")])
    ...

但是,这些参数不能作为get/post查询指定。

  • oauth_signature_method:只能通过OAuthParameters配置。
  • oauth_consumer_keyoauth_token:可以配置为Secrets
  • oauth_timestamp具有非u64值:OAuth1协议不允许它。
  • oauth_version既不是"1.0"也不是空字符串"":OAuth1协议不允许它。
  • OAuth1协议未定义的任何oauth_*参数:目前不支持。

OAuth身份验证方法的定制

当你在Client中调用oauth1方法或在RequestBuilder中调用sign方法时,你可以使用一些参数调用*_with_params方法,而不是原始方法。

许可证

根据以下任一项许可:

任选其一。

注意:此库包含从 seanmonster 的 reqwest 衍生出的作品。它根据 MIT 许可证或 Apache 许可证分发。有关更多信息,请参阅《LICENSE-REQWEST-MIT》和《LICENSE-REQWEST-APACHE》。

贡献

除非你明确说明,否则根据 Apache-2.0 许可证定义,你提交的任何有意包含在作品中的贡献,将按照上述方式双许可,而不附加任何额外条款或条件。

已知问题

此库仍然依赖于较旧版本的0.3.3oauth1-request。这依赖于 oauth1 签名方法的原始实现,然而,较新版本的oauth1-request隐藏了它们的原始接口。因此,我们无法迁移到它们的较新版本。

目前,这些版本尚未报告严重漏洞,因此我认为我们仍然可以使用旧版本,但你的贡献始终受到欢迎。

依赖项

约5-19MB
约252K SLoC