# 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
~~~
- README
- 指南
- 概述
- GET Request
- WebRequest
- 属性
- Resource
- Method
- Body
- Format
- RequestFormat
- ResponseFormat
- CustomRequestFormat
- CustomResponseFormat
- ContentType
- Accept
- ContentLength
- FormattedResource
- Cookies
- Headers
- QuerystringParams
- UrlSegments
- 方法
- AddHeader
- SetHeader
- AddUrlSegment
- AddQuerystringParam
- AddCookie
- AddBodyParameter
- CreateFromOptions
- WebClient
- 属性
- BaseUrl
- Authenticator
- TimeoutMs
- ProxyServer
- ProxyBypassList
- ProxyUsername
- ProxyPassword
- EnableAutoProxy
- Insecure
- FollowRedirects
- 方法
- Execute
- GetJson
- PostJson
- SetProxy
- GetFullUrl
- WebResponse
- 属性
- StatusCode
- StatusDescription
- Content
- Data
- Body
- Headers
- Cookies
- 方法
- Update
- WebHelpers
- 属性
- WebStatusCode
- WebMethod
- WebFormat
- UrlEncodingMode
- EnableLogging
- 方法
- LogDebug
- LogWarning
- LogError
- LogRequest
- LogResponse
- Obfuscate
- ParseJson
- ConvertToJson
- ParseUrlEncoded
- ConvertToUrlEncoded
- ParseXml
- ConvertToXml
- ParseByFormat
- ConvertToFormat
- UrlEncode
- UrlDecode
- Base64Encode
- Base64Decode
- RegisterConverter
- JoinUrl
- UrlParts
- CloneDictionary
- CloneCollection
- CreateKeyValue
- FindInKeyValues
- AddOrReplaceInKeyValues
- FormatToMediaType
- MethodToName
- HMACSHA1
- HMACSHA256
- MD5
- CreateNonce
- IWebAuthenticator
- 方法
- BeforeExecute
- AfterExecute
- PrepareHttp
- PrepareCurl
- WebAsyncWrapper
- 属性
- Client
- 方法
- ExecuteAsync
- 范例
- Salesforce网站
- Google APIs
- Todoist API
- 其他主题
- 调试
- 授权
- 实现自己的IWebAuthenticator
- Url编码