项目

RestSharp 认证器

RestSharp 包含基本 HTTP、OAuth1 和基于令牌(JWT 和 OAuth2)的认证器。

设置认证器有两种方式:全局或每个请求。

通过将 RestClientOptionsAuthenticator 属性设置为全局认证器:

var options = new RestClientOptions("https://example.com") {
    Authenticator = new HttpBasicAuthenticator("username", "password")
};
var client = new RestClient(options);

要按请求设置认证器,请将 RestRequestAuthenticator 属性设置为:

var request = new RestRequest("/api/users/me") {
    Authenticator = new HttpBasicAuthenticator("username", "password")
};
var response = await client.ExecuteAsync(request, cancellationToken);

基本身份验证

HttpBasicAuthenticator 允许您使用 base64 编码字符串作为 Authorization 头部传递用户名和密码。

var options = new RestClientOptions("https://example.com") {
    Authenticator = new HttpBasicAuthenticator("username", "password")
};
var client = new RestClient(options);

OAuth1

对于 OAuth1 认证,OAuth1Authenticator 类提供了静态方法来帮助生成 OAuth 认证器。 OAuth1 认证器将向请求添加必要的 OAuth 参数,包括签名。

默认情况下,它将使用 HMAC SHA1 生成签名。每个用于创建认证器的静态函数允许您覆盖默认值并使用其他方法生成签名。

请求令牌

获取临时请求令牌通常是 OAuth1 流程的第一步。使用 OAuth1Authenticator.ForRequestToken 函数获取请求令牌认证器。 此方法需要 consumerKeyconsumerSecret 进行身份验证。

var options = new RestClientOptions("https://api.twitter.com") {
    Authenticator = OAuth1Authenticator.ForRequestToken(consumerKey, consumerSecret)
};
var client = new RestClient(options);
var request = new RestRequest("oauth/request_token");

响应应包含令牌和令牌密钥,然后可以用于完成授权过程。如果需要提供回调 URL,请将认证器的 CallbackUrl 属性设置为回调目标。

访问令牌

获取访问令牌是 OAuth1 流程通常的第三步。当提供 consumerKeyconsumerSecretoauthTokenoauthTokenSecret 时,此方法会检索访问令牌。如果您没有此调用所需的令牌,则需要按照上面描述的方式获取请求令牌。

var authenticator = OAuth1Authenticator.ForAccessToken(
    consumerKey, consumerSecret, oauthToken, oauthTokenSecret
);
var options = new RestClientOptions("https://api.twitter.com") {
    Authenticator = authenticator
};
var client = new RestClient(options);
var request = new RestRequest("oauth/access_token");

如果 OAuth1 流程的第二步返回了验证码值,您可以使用另一个重载的 ForAccessToken

var authenticator = OAuth1Authenticator.ForAccessToken(
    consumerKey, consumerSecret, oauthToken, oauthTokenSecret, verifier
);

响应应包含可用于访问受保护资源的访问令牌。

对于刷新访问令牌,请使用接受 sessionHandle 的两个重载之一的 ForAccessToken

受保护的资源

当访问令牌可用时,使用 ForProtectedResource 函数获取访问受保护资源的认证器。

var authenticator = OAuth1Authenticator.ForAccessToken(
    consumerKey, consumerSecret, accessToken, accessTokenSecret
);
var options = new RestClientOptions("https://api.twitter.com/1.1") {
    Authenticator = authenticator
};
var client = new RestClient(options);
var request = new RestRequest("statuses/update.json", Method.Post)
        .AddParameter("status", "Hello Ladies + Gentlemen, a signed OAuth request!")
        .AddParameter("include_entities", "true");

xAuth

xAuth 是 OAuth1 的简化版本。它允许您将用户名和密码作为 x_auth_usernamex_auth_password 请求参数直接获取访问令牌。xAuth 并不广泛支持,但 RestSharp 仍然允许使用它。

使用 OAuth1Authenticator.ForClientAuthentication 函数创建 xAuth 认证器:

var authenticator = OAuth1Authenticator.ForClientAuthentication(
    consumerKey, consumerSecret, username, password
);

无头 OAuth

可以通过将 consumerSecret 设置为 null 来使用访问令牌认证器在无头 OAuth 场景中。

var authenticator = OAuth1Authenticator.ForAccessToken(
    consumerKey, null, oauthToken, oauthTokenSecret
);

OAuth2

RestSharp 有两个非常简单的认证器,它们将访问令牌作为请求的一部分发送。

OAuth2UriQueryParameterAuthenticator 接收一个访问令牌作为唯一构造函数参数,并将其作为查询参数 oauth_token 发送。

OAuth2AuthorizationRequestHeaderAuthenticator 有两个构造函数。一个只接受一个参数,即访问令牌。另一个构造函数还允许您指定令牌类型。然后,认证器将使用指定的令牌类型或默认的 OAuth 令牌类型添加一个 Authorization 头部,以及令牌本身。

例如:

var authenticator = new OAuth2AuthorizationRequestHeaderAuthenticator(
    token, "Bearer"
);
var options = new RestClientOptions("https://example.com") {
    Authenticator = authenticator
};
var client = new RestClient(options);

上面的代码将告诉 RestSharp 在每次请求时都发送带有 Bearer 令牌的头部。基本上,上面的代码与下面的 JwtAuthenticator 示例相同。

由于这些认证器没有做太多事情来获取令牌本身,您可能对我们的 示例 OAuth2 认证器感兴趣,该认证器会自行请求令牌。

JWT

可以通过使用 JwtAuthenticator 支持 JWT 认证。这是一个非常简单的类,可以像这样构造:

var authenticator = new JwtAuthenticator(myToken);
var options = new RestClientOptions("https://example.com") {
    Authenticator = authenticator
};
var client = new RestClient(options);

对于每次请求,它将在 Authorization 头部添加值 Bearer <your token>

由于您可能需要从刷新令牌,可以使用 SetBearerToken 方法更新令牌。

定制认证器

您可以编写自己的实现,通过实现 IAuthenticator 并将其注册到您的 RestClient

var authenticator = new SuperAuthenticator(); // 实现 IAuthenticator
var options = new RestClientOptions("https://example.com") {
    Authenticator = authenticator
};
var client = new RestClient(options);

Authenticate 方法是首次调用 RestClient.ExecuteRestClient.Execute<T> 时调用的第一个方法。它会得到当前正在执行的 RestRequest,从而可以访问请求的所有数据(头部、参数等)。

有关自定义认证器的一个示例,它会自己获取并使用 OAuth2 Bearer 令牌,请参阅 这里

在本文档中