[英]using API access token oauth 2.0 -error “The remote server returned an error: (401) Unauthorized”
我已經嘗試了很多次,但還是出現了錯誤
遠程服務器返回“錯誤:(401)未經授權
請給我建議,我真的很感激。
Public Class iFormAPIMethods
'iFormBuilder API info
Private API_ClientKey As String = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Private API_ClientSecret As String = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Private BaseURL As String = "app.iformbuilder.com"
Private FullURL As String = "https://" & BaseURL & "/exzact/api/v60/token"
'Quotation Mark Character for substitution
Private q As Char = Chr(34)
'JWT Claim Set Parameters
Property iss As String = API_ClientKey
Property aud As String = FullURL
Property AccessToken As String
Public Sub New()
End Sub
Public Sub GetAccessToken()
ServicePointManager.Expect100Continue = True
'ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
'Build web request
Dim uriAddress As New Uri(FullURL)
Dim wRequest As HttpWebRequest = DirectCast(HttpWebRequest.Create(uriAddress), HttpWebRequest)
Dim strPostData As String = ""
Dim bytPostData As Byte()
Dim stJWT As String
'Get JWT
stJWT = CreateJWT()
'Post Data ---
strPostData = "grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=" & stJWT
'Post Data --- to byte()
bytPostData = Encoding.UTF8.GetBytes(strPostData.ToString)
'Set Web Request Properties
With wRequest
.Method = "POST"
.ContentType = "application/x-www-form-urlencoded"
.ContentLength = bytPostData.Length
End With
'Post Request and Get Response
Using postStream As Stream = wRequest.GetRequestStream()
postStream.Write(bytPostData, 0, bytPostData.Length)
Dim rawResponseFromServer = ""
Try
Using response As HttpWebResponse = wRequest.GetResponse()
Dim reader As New StreamReader(response.GetResponseStream())
rawResponseFromServer = reader.ReadToEnd()
Dim o As JObject = JObject.Parse(rawResponseFromServer)
Me.AccessToken = o.Item("access_token").Value(Of String)()
End Using
Catch wex As WebException
If Not wex.Response Is Nothing Then
MsgBox(wex.Message)
Debug.WriteLine("Resulting Error --- " & wex.Message & vbNewLine & wex.StackTrace)
End If
Exit Sub
End Try
End Using
End Sub
Private Function CreateJWT() As String
Dim JWT As String
Dim EncodedJWT As Byte()
'Build Header and Claim Set String
Dim strHeader As String = Strings.Replace("{'alg':'HS256','typ':'JWT'}", "'", q)
'Dim strClaimSet As String = Strings.Replace("{'iss':'" & iss & "', 'aud':'" & aud & "', 'exp':" & exp() & ", 'iat':" & iat() & "}", "'", q)
'Build JWT String
JWT = ToBase64URL(strHeader) & "." & ToBase64URL(strClaimSet)
'Convert Client Secret to UTF8 Byte()
Dim bytKey As Byte() = System.Text.Encoding.UTF8.GetBytes(API_ClientSecret)
'Encode JWT String
Dim hmac_encode As HMACSHA256 = New HMACSHA256(bytKey)
EncodedJWT = hmac_encode.ComputeHash(System.Text.Encoding.UTF8.GetBytes(JWT))
'Sign and return JWT
Dim signature As String = ToBase64URL(EncodedJWT)
Return JWT & "." & signature
End Function
Private Function ToBase64URL(Text As String) As String
Dim b As Byte() = System.Text.Encoding.UTF8.GetBytes(Text)
Return ToBase64URL(b)
End Function
Private Function ToBase64URL(byt As Byte()) As String
Dim result As String
'Convert to base 64 string
result = Convert.ToBase64String(byt)
'Make URL Friendly
result = result.Replace("+", "-").Replace("/", "_")
Do While result.Chars(result.Length - 1) = "="
result = Strings.Left(result, result.Length - 1)
Loop
Return result
End Function
Public ReadOnly Property exp(ExpirationSeconds As Integer) As Long
Get
Dim iats As Long
iats = iat() + ExpirationSeconds
Return iats
End Get
End Property
Public ReadOnly Property iat() As Long
Get
Dim StartDate As Date = CDate("09/01/2016")
Dim EndDate As Date = CDate(Now.ToUniversalTime)
Dim val As Long = DateDiff(DateInterval.Second, StartDate, EndDate)
Return val
End Get
End Property
末級
您的代碼與我使用的代碼相同。
要獲取令牌,您無需引用API版本,因此更正的行應為:
Private FullURL As String = "https://" & BaseURL & "/exzact/api/token"
希望這可以幫助。
RJ
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.