2017-01-07 40 views
0

我已经尝试了很多次,我还是得到了错误使用API​​访问令牌的OAuth 2.0 - 错误“的远程服务器返回错误:(401)未经授权”

The remote server returned an 'error: (401) Unauthorized

请建议给我,我真的很感激它。

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 

地区 “HelperFunctions”

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 

端部区域

末级

回答

0

你的代码看起来一样的东西我用。

获得令牌,你并不需要参考API版本,以便修正行应该是:

Private FullURL As String = "https://" & BaseURL & "/exzact/api/token" 

希望这有助于。

RJ

相关问题