Step 1: Declare the following global variables.
//Token expiresin Long gl_Expiresin //Refresh token clockskew Long gl_ClockSkew = 3
Step 2: Define a global function and name it f_Authorization().
Select from menu File > New; in the New dialog, select the PB Object tab and then select Function and click OK to add a global function.
This global function uses the HTTP Post method to send the user credentials to the authorization server and then gets the identity token from the HTTP Authorization header.
Add scripts to the f_Authorization() function to implement the following scenario: When the application starts, the application uses the username and password from the login window to get the token, and when the token expires, the login window displays for the user to input the username and password again.
The following scripts hard code the username and password instead of getting them from the login window. You can change the scripts to use the login window after you implement the login window and return the username and password to the f_Authorization() function.
//Integer f_Authorization() for password
//UserName & Password are passed from the login window
RestClient lrc_Client
String ls_url, ls_UserName, ls_UserPass, ls_PostData, ls_Response, ls_expires_in
String ls_TokenType, ls_AccessToken
String ls_type, ls_description, ls_uri, ls_state
Integer li_Return, li_rtn
JsonParser ljson_Parser
li_rtn = -1
ls_url = profilestring("CloudSetting.ini","setup","TokenURL","")
//login window can be implemented to return username & password according to actual needs.
//Open(w_login)
//Return UserName & Password
ls_UserName = "admin@test.com"
ls_UserPass = "appeon123"
If IsNull ( ls_UserName ) Or Len ( ls_UserName ) = 0 Then
MessageBox( "Tips", "UserName is empty!" )
Return li_rtn
End If
If IsNull ( ls_UserPass ) Or Len ( ls_UserPass ) = 0 Then
MessageBox( "Tips", "Password is empty!" )
Return li_rtn
End If
ls_PostData = '{"username":"' + ls_UserName + '", "password":"' + ls_UserPass + '"}';
lrc_Client = Create RestClient
lrc_Client.SetRequestHeader("Content-Type","application/json")
li_Return = lrc_Client.GetJWTToken( ls_Url, ls_PostData, ls_Response )
If li_Return = 1 and Pos ( ls_Response, "access_token" ) > 0 Then
ljson_Parser = Create JsonParser
ljson_Parser.LoadString(ls_Response)
ls_TokenType = ljson_Parser.GetItemString("/token_type")
ls_AccessToken = ljson_Parser.GetItemString("/access_token")
//Application Set Authorization Header
Getapplication().SetHttpRequesTheader("Authorization", ls_TokenType + " " +ls_AccessToken, true)
//Set Global Variables
gl_Expiresin = Long (ljson_Parser.GetItemNumber("/expires_in"))
li_rtn = 1
Else
MessageBox( "AccessToken Falied", "Return :" + String ( li_Return ) )
End If
If IsValid ( ljson_Parser ) Then DesTroy ( ljson_Parser )
If IsValid ( lrc_Client ) Then DesTroy ( lrc_Client )
Return li_rtn
Step 3: Insert a timing object (timing_1) to the application and add the following scripts to the Timer event of timing_1.
1) Open the application object and then select from menu Insert > Object > Timing to add a timing object to the application.
2) Add the following scripts to the Timer event of timing_1.
//Authorization f_Authorization()
When displayed in the source editor, the Timer event looks like this:
event timer;//Authorization f_Authorization() end event
Step 4: Add the following scripts to the application Open event.
Place the scripts before the database connection is established. The scripts get the token from the built-in Cognito server and then start the user session (using the BeginSession function) to include the token information in the session.
Do not call BeginSession more than one time, otherwise, it will return -1 (indicating session already exists).
//Authorization
If f_Authorization() <> 1 Then
Return
End If
//Start Session
long ll_return
Try
ll_return = Beginsession()
If ll_return <> 0 Then
Messagebox("Beginsession Failed:" + String(ll_return), GetHttpResponseStatusText())
End if
Catch ( Throwable ex)
MessageBox( "Throwable", ex.GetMessage())
Return
End Try
//Refresh Token for timing
If gl_Expiresin > 0 And (gl_Expiresin - gl_ClockSkew) > 0 Then
//Timer = Expiresin - ClockSkew
//7200 - 3
timing_1.Start(gl_Expiresin - gl_ClockSkew)
End If
//Connect db
Step 5: Add the following scripts to the SystemError event.
The scripts will trigger the SystemError event when the session or license encounters an error; and if the token is invalid or expires, the scripts will call the f_Authorization function to get the token again.
Choose Case error.Number
Case 220 to 229 //Session Error
MessageBox ("Session Error", "Number:" + String(error.Number) + "~r~nText:" + error.Text )
Case 230 to 239 //License Error
MessageBox ("License Error", "Number:" + String(error.Number) + "~r~nText:" + error.Text )
Case 240 to 249 //Token Error
MessageBox ("Token Error", "Number:" + String(error.Number) + "~r~nText:" + error.Text )
//Authorization
f_Authorization()
Case Else
MessageBox ("SystemError", "Number:" + String(error.Number) + "~r~nText:" + error.Text )
End Choose





