多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# Implementing your own IWebAuthenticator 如果内置身份验证器无法满足您的需求,您可以创建自己的身份验证器。 以下是我在新的V1.1 REST API中为Twitter的仅应用程序身份验证设置新身份验证器的示例。 ## [](#create-iwebauthenticator-implementation)创建IWebAuthenticator实现 将`EmptyAuthenticator`类导入到项目中,并将其重命名为所需的类名。 ~~~vbnet Implements IWebAuthenticator Public Sub Setup() '// 定义身份验证所需的任何特定于用户的变量 End Sub Private Sub IWebAuthenticator_BeforeExecute(ByVal Client As WebClient, ByRef Request As WebRequest) '// 例如 添加 headers, cookies, 等. End Sub Private Sub IWebAuthenticator_AfterExecute(ByVal Client As WebClient, ByVal Request As WebRequest, ByRef Response As WebResponse) '// 例如 处理401未经授权或其他问题 End Sub Private Sub IWebAuthenticator_PrepareHttp(ByVal Client As WebClient, ByVal Request As WebRequest, ByRef Http As Object) '// 例如更新option, headers,等. End Sub Private Sub IWebAuthenticator_PrepareCurl(ByVal Client As WebClient, ByVal Request As WebRequest, ByRef Curl As String) '// 例如添加flags到cURL End Sub ~~~ ## [](#about-this-example)关于本示例 Twitter的仅应用程序身份验证使用OAuth 2.0客户端凭据流的变体,其中应用程序被授予访问权限,并具有将包含在每个请求中的唯一token。 以下流程用于获取token,然后验证请求: 1. Request token: POST Consumer Key和Consumer Secret使用基本身份验证和Twitter指定的请求信息到`https://api.twitter.com/oauth2/token`来接收token 2. 在每个API请求的标头中包含token`Authorization:Bearer{token}` [Twitter Documentation](https://dev.twitter.com/docs/auth/application-only-auth) ## [](#define-setup)定义Setup() `Setup`函数是一种约定,用于定义身份验证所需的任何特定于用户的变量。 获取持有人token需要使用Consumer Key和Consumer Secret,以便在设置期间传递和存储这些token。 ~~~vbnet Public ConsumerKey As String Public ConsumerSecret As String Public Sub Setup(ConsumerKey As String, ConsumerSecret As String) Me.ConsumerKey = ConsumerKey Me.ConsumerSecret = ConsumerSecret End Sub ~~~ ## [](#define-beforeexecute)定义BeforeExecute() `BeforeExecute`函数用于在执行之前向`Request`添加字段。 示例包括向查询字符串添加参数,向请求添加标头或更新资源以指向安全路由。 `Request`在`ByRef`中传递,因此可以直接添加字段。 将`BeforeExecute`函数留空以通过`Request`未修改) 在此示例中,我们将请求承载token,然后将其作为“Authorization”标头附加到请求。 几点说明: * 使用传递给`BeforeExecute`的`WebClient`来获取token,以便任何代理值用于token请求 * 克隆`WebClient`,以便与传递给`BeforeExecute`的原始文件没有无法预料的交互 ### [](#get-a-token)获取Token ~~~vbnet Public Function GetToken(Client As WebClient) As String On Error GoTo Cleanup Dim TokenClient As WebClient Dim Request As New WebRequest Dim Response As WebResponse ' Clone client (to avoid accidental interactions) Set TokenClient = auth_Client.Clone Set TokenClient.Authenticator = Nothing TokenClient.BaseUrl = "https://api.twitter.com/" ' Prepare token request Request.Resource = "oauth2/token" Request.Method = WebMethod.HttpPost Request.RequestFormat = WebFormat.FormUrlEncoded Request.ResponseFormat = WebFormat.Json ' Request a token using Basic authentication Request.AddHeader "Authorization", _ "Basic " & WebHelpers.Base64Encode(Me.ConsumerKey & ":" & Me.ConsumerSecret) Request.AddBodyParameter "grant_type", "client_credentials" Set Response = TokenClient.Execute(auth_Request) If Response.StatusCode = WebStatusCode.Ok Then GetToken = Response.Data("access_token") Else Err.Raise 11041 + vbObjectError, Description:=Response.StatusCode & ": " & Response.Content End If Cleanup: Set TokenClient = Nothing Set Request = Nothing Set Response = Nothing ' Rethrow error If Err.Number <> 0 Then ' Error handling... End If End Function ~~~ ### [](#add-token-to-header)添加Token到Header ~~~vbnet Private Sub IWebAuthenticator_BeforeExecute(ByVal Client As RestClient, ByRef Request As RestRequest) If Me.Token = "" Then Me.Token = Me.GetToken(Client) End If Request.AddHeader "Authorization", "Bearer " & Me.Token End Sub ~~~ 就是这样! 现在您可以使用任何您想要的身份验证方案,尽管主要的(Basic和OAuth 1.0)已经创建并且可以在authenticators /目录中找到。 这里创建的`TwitterAuthenticator`位于那里,包括一些小的更改,用于在请求之间缓存Token。 ## [](#define-afterexecute)定义AfterExecute() `AfterExecute`函数用于处理Unauthorized或Forbidden响应,并使用添加的凭据或其他行为重试。 在此示例中,不需要执行后行为并且该方法保留为空,但是有关如何使用它的示例,请参阅`DigestAuthenticator`。 ## [](#define-preparehttp--preparecurl)定义PrepareHttp() / PrepareCurl() `PrepareHttp`和`PrepareCurl`可用于更新将用于执行请求的基础`WinHttpRequest`或cURL命令。 有关如何使用它的示例,请参阅`HttpBasicAuthenticator`。 ## [](#finally-use-the-new-authenticator)最后,使用新的身份验证器 ~~~vbnet Dim TwitterClient As New WebClient Dim Auth As New TwitterAuthenticator Auth.Setup _ ConsumerKey:="Your consumer key", _ ConsumerSecret:="Your consumer secret" Set TwitterClient.Authenticator = Auth ~~~