#oauth #request #authorization-header #client #string #hmac-sha256

不依赖std oauth1-request-ios

支持HMAC-SHA256的Rust OAuth 1.0客户端库

1个不稳定版本

0.0.1 2024年8月2日

#13 in #authorization-header

Download history 83/week @ 2024-07-29 13/week @ 2024-08-05

96 每月下载量

MIT/Apache

150KB
3K SLoC

OAuth 1.0

这是一个从OAuth 1.0派生的分支。所有荣誉归原作者所有。

主要区别在于,这个分支不严格遵循OAuth 1.0规范,而是在请求签名过程中提供了更多的灵活性,即允许使用HMAC-SHA256(以及更多)哈希算法。


lib.rs:

又一个OAuth 1.0客户端库。

用法

将此添加到您的Cargo.toml

[dependencies]
oauth = { version = "0.0.1", package = "oauth1-request-ios" }

为了简洁,我们在整个文档中都将crate名称称为oauth,因为API设计有利于使用像oauth::get这样的限定路径。

创建请求

典型的授权流程看起来像这样

extern crate oauth1_request_ios as oauth;

// 定义一个类型来表示您的请求。 #[derive(oauth::Request)] struct CreateComment<'a> { article_id: u64, text: &'a str, }

let uri = "https://example.com/api/v1/comments/create.json";

let request = CreateComment { article_id: 123456789, text: "使用OAuth & Rust签署的请求 🦀 🔏", };

// 准备您的凭证。 let token = oauth::Token::from_parts("consumer_key", "consumer_secret", "token", "token_secret");

// 创建Authorization头部。 let authorization_header = oauth::post(uri, &request, &token, oauth::HMAC_SHA1);

// 覆盖上面的值以固定nonce和timestamp值。

let mut builder = oauth::Builder::new(token.client, oauth::HMAC_SHA1);

builder.token(token.token);

builder.nonce("Dk-OGluFEQ4f").timestamp(std::num::NonZeroU64::new(1234567890));

let authorization_header = builder.post(uri, &request);

// oauth_nonceoauth_timestamp在每个执行中都会变化。 assert_eq!( authorization_header, "OAuth
oauth_consumer_key="consumer_key",
oauth_nonce="Dk-OGluFEQ4f",
oauth_signature_method="HMAC-SHA1",
oauth_timestamp="1234567890",
oauth_token="token",
oauth_signature="n%2FrUgos4CFFZbZK8Z8wFR7drU4c%3D"", );

可以从请求中创建一个 x-www-form-urlencoded 字符串或包含查询对的 URI。

let form = oauth::to_form(&request); assert_eq!( form, "article_id=123456789&text=A%20request%20signed%20with%20OAuth%20%26%20Rust%20%F0%9F%A6%80%20%F0%9F%94%8F", );

let uri = oauth::to_query(uri.to_owned(), &request); assert_eq!( uri, "https://example.com/api/v1/comments/create.json?article_id=123456789&text=A%20request%20signed%20with%20OAuth%20%26%20Rust%20%F0%9F%A6%80%20%F0%9F%94%8F", );


See [`Request`][oauth1_request_derive_ios::Request] for more details on the derive macro.

If you want to authorize a request with dynamic keys, use
[`oauth::ParameterList`][ParameterList].

#
use std::fmt::Display;

let request = oauth::ParameterList::new([
    ("article_id", &123456789 as &dyn Display),
    ("text", &"A request signed with OAuth & Rust 🦀 🔏"),
]);

let form = oauth::to_form(&request);
assert_eq!(
    form,
    "article_id=123456789&text=A%20request%20signed%20with%20OAuth%20%26%20Rust%20%F0%9F%A6%80%20%F0%9F%94%8F",
);

如果需要指定回调 URI 或验证器,请使用 [oauth::Builder][Builder]

extern crate oauth1_request_ios as oauth;

let uri = "https://example.com/oauth/request_temp_credentials"; let callback = "https://client.example.net/oauth/callback";

let client = oauth::Credentials::new("consumer_key", "consumer_secret");

let authorization_header = oauth::Builder::<_, _>::new(client, oauth::HmacSha1::new()) .callback(callback) .post(uri, &());

依赖项

~0.6–2MB
~38K SLoC