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 认证
1,025 每月下载量
在6 个crate中使用了(5 个直接使用)
68KB
1K SLoC
reqwest-oauth1: reqwest ♡ oauth1-request
使用reqwest和oauth1-request为reqwest添加OAuth1签名。
此库提供了与reqwest部分兼容的接口。
您可以使用它几乎与reqwest相同,并通过OAuth1授权协议进行签名。
注意:此crate目前仅支持异步Client(reqwest::Client)。
安装
将reqwest-oauth1
的依赖项添加到您的Cargo.toml
中,如下所示:
[dependencies]
reqwest-oauth1 = "*"
如何使用
快速概览
- 在您的代码中添加crate
reqwest_oauth1
的引用,如下所示:use reqwest_oauth1;
- 准备OAuth密钥:
consumer_key
、consumer_secret
、access_token
和token_secret
。 - 将
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_token
和token_secret
的支持。
请注意,仍然需要consumer_key
和consumer_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_key
、oauth_token
:可以配置为Secrets
。oauth_timestamp
具有非u64
值:OAuth1协议不允许它。oauth_version
既不是"1.0"
也不是空字符串""
:OAuth1协议不允许它。- OAuth1协议未定义的任何
oauth_*
参数:目前不支持。
OAuth身份验证方法的定制
当你在Client
中调用oauth1
方法或在RequestBuilder
中调用sign
方法时,你可以使用一些参数调用*_with_params
方法,而不是原始方法。
许可证
根据以下任一项许可:
- Apache License,版本2.0(《LICENSE-APACHE》或《http://www.apache.org/licenses/LICENSE-2.0》)
- MIT许可证(《LICENSE-MIT》或《http://opensource.org/licenses/MIT》)
任选其一。
注意:此库包含从 seanmonster 的 reqwest
衍生出的作品。它根据 MIT 许可证或 Apache 许可证分发。有关更多信息,请参阅《LICENSE-REQWEST-MIT》和《LICENSE-REQWEST-APACHE》。
贡献
除非你明确说明,否则根据 Apache-2.0 许可证定义,你提交的任何有意包含在作品中的贡献,将按照上述方式双许可,而不附加任何额外条款或条件。
已知问题
此库仍然依赖于较旧版本的0.3.3
的oauth1-request
。这依赖于 oauth1 签名方法的原始实现,然而,较新版本的oauth1-request
隐藏了它们的原始接口。因此,我们无法迁移到它们的较新版本。
目前,这些版本尚未报告严重漏洞,因此我认为我们仍然可以使用旧版本,但你的贡献始终受到欢迎。
依赖项
约5-19MB
约252K SLoC