RestSharp 认证器
RestSharp 包含基本 HTTP、OAuth1 和基于令牌(JWT 和 OAuth2)的认证器。
设置认证器有两种方式:全局或每个请求。
通过将 RestClientOptions
的 Authenticator
属性设置为全局认证器:
var options = new RestClientOptions("https://example.com") {
Authenticator = new HttpBasicAuthenticator("username", "password")
};
var client = new RestClient(options);
要按请求设置认证器,请将 RestRequest
的 Authenticator
属性设置为:
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
函数获取请求令牌认证器。
此方法需要 consumerKey
和 consumerSecret
进行身份验证。
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 流程通常的第三步。当提供 consumerKey
、consumerSecret
、oauthToken
和 oauthTokenSecret
时,此方法会检索访问令牌。如果您没有此调用所需的令牌,则需要按照上面描述的方式获取请求令牌。
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_username
和 x_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.Execute
或 RestClient.Execute<T>
时调用的第一个方法。它会得到当前正在执行的 RestRequest
,从而可以访问请求的所有数据(头部、参数等)。
有关自定义认证器的一个示例,它会自己获取并使用 OAuth2 Bearer 令牌,请参阅 这里。