Sample code for 30+ languages & platforms
B4X

Refresh a Dynamics CRM OAuth2 Access Token

See more OAuth2 Examples

Demonstrates how to refresh an expiring Dynamics CRM access token using the refresh token. endpoint.

(If a REST API call fails with a 401 unauthorized error, an application can auto-recover by refreshing the access token, and then re-send the request using the new token.)

Chilkat B4X Downloads

B4X
Dim success As Boolean = False

'  This example requires the Chilkat API to have been previously unlocked.
'  See Global Unlock Sample for sample code.

'  We previously obtained an access token and saved the JSON to a file using this example:
'  Get Dynamics CRM OAuth2 Access Token

'  This example will examine the JSON and expiration date, and if near expiration will
'  refresh the access token.

Dim json As ChilkatJsonObject
json.Initialize
success = json.LoadFile("qa_data/tokens/dynamicsCrm.json")
If success <> True Then
    Return
End If


'  The contents of the JSON look like this:
'  {
'    "token_type": "Bearer",
'    "scope": "user_impersonation",
'    "expires_in": "3599",
'    "ext_expires_in": "0",
'    "expires_on": "1524783438",
'    "not_before": "1524779538",
'    "resource": "https://mydomain.api.crm.dynamics.com",
'    "access_token": "...",
'    "refresh_token": "...",
'    "id_token": "..."
'  }

'  The "expires_on" value is a Unix time.
Dim dtExpire As ChilkatDateTime
dtExpire.Initialize
dtExpire.SetFromUnixTime(False, json.IntOf("expires_on"))

'  If this date/time expires within 10 minutes of the current system time, refresh the token.

'  OK, we need to refresh the access token by sending a POST...
'  

Dim req As ChilkatHttpRequest
req.Initialize
req.AddParam("grant_type", "refresh_token")
req.AddParam("redirect_uri", "http://localhost:3017/")
req.AddParam("client_id", "DYNAMICS-CRM-CLIENT-ID")
req.AddParam("client_secret", "DYNAMICS-CRM-SECRET-KEY")
req.AddParam("refresh_token", json.StringOf("refresh_token"))
req.AddParam("resource", "https://mydynamicsdomain.api.crm.dynamics.com")

Dim http As ChilkatHttp
http.Initialize("http")

req.HttpVerb = "POST"
req.ContentType = "application/x-www-form-urlencoded"

Dim resp As ChilkatHttpResponse
resp.Initialize
success = http.HttpReq("https://login.microsoftonline.com/DYNAMICS-ENDPOINT-GUID/oauth2/token", req, resp)
If success = False Then
    Log(http.LastErrorText)
    Return
End If


'  Load the JSON response.
json.Load(resp.BodyStr)
json.EmitCompact = False

'  Show the JSON response.
Log(json.Emit)

Log("Response status code: " & resp.StatusCode)

'  If the response status code is not 200, then it's an error.
If resp.StatusCode <> 200 Then
    Return
End If


'  If an "expires_on" member does not exist, then add the JSON member by
'  getting the current system date/time and adding the "expires_in" seconds.
'  This way we'll know when the token expires.
If json.HasMember("expires_on") <> True Then
    dtExpire.SetFromCurrentSystemTime
    dtExpire.AddSeconds(json.IntOf("expires_in"))
    json.AppendString("expires_on", dtExpire.GetAsUnixTimeStr(False))
End If


'  Save the refreshed access token JSON to a file for future requests.
Dim fac As ChilkatFileAccess
fac.Initialize
fac.WriteEntireTextFile("qa_data/tokens/dynamicsCrm.json", json.Emit, "utf-8", False)