PureBasic
PureBasic
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 PureBasic Downloads
IncludeFile "CkJsonObject.pb"
IncludeFile "CkDateTime.pb"
IncludeFile "CkHttp.pb"
IncludeFile "CkFileAccess.pb"
IncludeFile "CkHttpRequest.pb"
IncludeFile "CkHttpResponse.pb"
Procedure ChilkatExample()
success.i = 0
; 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.
json.i = CkJsonObject::ckCreate()
If json.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkJsonObject::ckLoadFile(json,"qa_data/tokens/dynamicsCrm.json")
If success <> 1
CkJsonObject::ckDispose(json)
ProcedureReturn
EndIf
; 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.
dtExpire.i = CkDateTime::ckCreate()
If dtExpire.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkDateTime::ckSetFromUnixTime(dtExpire,0,CkJsonObject::ckIntOf(json,"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...
;
req.i = CkHttpRequest::ckCreate()
If req.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkHttpRequest::ckAddParam(req,"grant_type","refresh_token")
CkHttpRequest::ckAddParam(req,"redirect_uri","http://localhost:3017/")
CkHttpRequest::ckAddParam(req,"client_id","DYNAMICS-CRM-CLIENT-ID")
CkHttpRequest::ckAddParam(req,"client_secret","DYNAMICS-CRM-SECRET-KEY")
CkHttpRequest::ckAddParam(req,"refresh_token",CkJsonObject::ckStringOf(json,"refresh_token"))
CkHttpRequest::ckAddParam(req,"resource","https://mydynamicsdomain.api.crm.dynamics.com")
http.i = CkHttp::ckCreate()
If http.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkHttpRequest::setCkHttpVerb(req, "POST")
CkHttpRequest::setCkContentType(req, "application/x-www-form-urlencoded")
resp.i = CkHttpResponse::ckCreate()
If resp.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkHttp::ckHttpReq(http,"https://login.microsoftonline.com/DYNAMICS-ENDPOINT-GUID/oauth2/token",req,resp)
If success = 0
Debug CkHttp::ckLastErrorText(http)
CkJsonObject::ckDispose(json)
CkDateTime::ckDispose(dtExpire)
CkHttpRequest::ckDispose(req)
CkHttp::ckDispose(http)
CkHttpResponse::ckDispose(resp)
ProcedureReturn
EndIf
; Load the JSON response.
CkJsonObject::ckLoad(json,CkHttpResponse::ckBodyStr(resp))
CkJsonObject::setCkEmitCompact(json, 0)
; Show the JSON response.
Debug CkJsonObject::ckEmit(json)
Debug "Response status code: " + Str(CkHttpResponse::ckStatusCode(resp))
; If the response status code is not 200, then it's an error.
If CkHttpResponse::ckStatusCode(resp) <> 200
CkJsonObject::ckDispose(json)
CkDateTime::ckDispose(dtExpire)
CkHttpRequest::ckDispose(req)
CkHttp::ckDispose(http)
CkHttpResponse::ckDispose(resp)
ProcedureReturn
EndIf
; 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 CkJsonObject::ckHasMember(json,"expires_on") <> 1
CkDateTime::ckSetFromCurrentSystemTime(dtExpire)
CkDateTime::ckAddSeconds(dtExpire,CkJsonObject::ckIntOf(json,"expires_in"))
CkJsonObject::ckAppendString(json,"expires_on",CkDateTime::ckGetAsUnixTimeStr(dtExpire,0))
EndIf
; Save the refreshed access token JSON to a file for future requests.
fac.i = CkFileAccess::ckCreate()
If fac.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkFileAccess::ckWriteEntireTextFile(fac,"qa_data/tokens/dynamicsCrm.json",CkJsonObject::ckEmit(json),"utf-8",0)
CkJsonObject::ckDispose(json)
CkDateTime::ckDispose(dtExpire)
CkHttpRequest::ckDispose(req)
CkHttp::ckDispose(http)
CkHttpResponse::ckDispose(resp)
CkFileAccess::ckDispose(fac)
ProcedureReturn
EndProcedure