SQL Server
SQL Server
Rabobank OAuth2 Access Token
See more OAuth2 Examples
Demonstrates how to get an OAuth 2.0 access token to access Rabobank API'sImportant: This example is for desktop apps only. (It is not for web-based applications.)
Your app defined in the Rabobank portal should look something like this. (Our test app is named "chilkat". You should name your app something else.)
Chilkat SQL Server Downloads
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls.
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
DECLARE @hr int
DECLARE @iTmp0 int
-- Important: Do not use nvarchar(max). See the warning about using nvarchar(max).
DECLARE @sTmp0 nvarchar(4000)
DECLARE @success int
SELECT @success = 0
-- For more information about the OAuth2, see OAuth 2.0 Authorization Flow
DECLARE @oauth2 int
EXEC @hr = sp_OACreate 'Chilkat.OAuth2', @oauth2 OUT
IF @hr <> 0
BEGIN
PRINT 'Failed to create ActiveX component'
RETURN
END
-- This should be the port in the localhost callback URL for your app.
-- The callback URL would look like "http://localhost:3017/" if the port number is 3017.
EXEC sp_OASetProperty @oauth2, 'ListenPort', 3017
-- IMPORTANT: Don't forget to subscribe your Rabobank application to the OAuth 2.0 services in the Rabobank Online Developer Portal.
-- IMPORTANT: Don't forget to subscribe your Rabobank application to the OAuth 2.0 services in the Rabobank Online Developer Portal.
-- IMPORTANT: Don't forget to subscribe your Rabobank application to the OAuth 2.0 services in the Rabobank Online Developer Portal.
-- IMPORTANT: Don't forget to subscribe your Rabobank application to the OAuth 2.0 services in the Rabobank Online Developer Portal.
-- See also https://developer.rabobank.nl/faq
EXEC sp_OASetProperty @oauth2, 'AuthorizationEndpoint', 'https://api-sandbox.rabobank.nl/openapi/sandbox/oauth2/authorize'
EXEC sp_OASetProperty @oauth2, 'TokenEndpoint', 'https://api-sandbox.rabobank.nl/openapi/sandbox/oauth2/token'
-- Replace these with actual values.
EXEC sp_OASetProperty @oauth2, 'ClientId', 'YOUR_APP_CLIENT_ID'
-- This is your app password:
EXEC sp_OASetProperty @oauth2, 'ClientSecret', 'YOUR_APP_CLIENT_SECRET'
EXEC sp_OASetProperty @oauth2, 'CodeChallenge', 0
-- Provide a SPACE separated list of scopes, as defined in the Rabobank API documentation,
-- such as at https://developer-sandbox.rabobank.nl/reference/accounts-ais-sb/3-0-8
-- Important: To get a refresh token in the final response, you have to ask for "offline_access" scope
EXEC sp_OASetProperty @oauth2, 'Scope', 'ais.balances.read ais.transactions.read-90days ais.transactions.read-history'
-- Begin the OAuth2 Authorization code flow. This returns a URL that should be loaded in a browser.
DECLARE @url nvarchar(4000)
EXEC sp_OAMethod @oauth2, 'StartAuth', @url OUT
EXEC sp_OAGetProperty @oauth2, 'LastMethodSuccess', @iTmp0 OUT
IF @iTmp0 <> 1
BEGIN
EXEC sp_OAGetProperty @oauth2, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @oauth2
RETURN
END
PRINT 'url = ' + @url
-- Launch the default browser on the system and navigate to the url.
-- The LaunchBrowser method was added in Chilkat v10.1.2.
EXEC sp_OAMethod @oauth2, 'LaunchBrowser', @success OUT, @url
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @oauth2, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @oauth2
RETURN
END
-- Wait for the user to approve or deny authorization in the browser.
DECLARE @numMsWaited int
SELECT @numMsWaited = 0
EXEC sp_OAGetProperty @oauth2, 'AuthFlowState', @iTmp0 OUT
WHILE (@numMsWaited < 90000) and (@iTmp0 < 3)
BEGIN
EXEC sp_OAMethod @oauth2, 'SleepMs', NULL, 100
SELECT @numMsWaited = @numMsWaited + 100
END
-- If the browser does not respond within the specified time, AuthFlowState will be:
--
-- 1: Waiting for Redirect - The OAuth2 background thread is waiting for the browser's redirect request.
-- 2: Waiting for Final Response - The thread is awaiting the final access token response.
-- In either case, cancel the background task initiated by StartAuth.
EXEC sp_OAGetProperty @oauth2, 'AuthFlowState', @iTmp0 OUT
IF @iTmp0 < 3
BEGIN
EXEC sp_OAMethod @oauth2, 'Cancel', @success OUT
PRINT 'No response from the browser!'
EXEC @hr = sp_OADestroy @oauth2
RETURN
END
-- Check AuthFlowState to determine if authorization was granted, denied, or failed:
--
-- 3: Success - OAuth2 flow completed, the background thread exited, and the successful response is in AccessTokenResponse.
-- 4: Access Denied - OAuth2 flow completed, the background thread exited, and the error response is in AccessTokenResponse.
-- 5: Failure - OAuth2 flow failed before completion, the background thread exited, and error details are in FailureInfo.
EXEC sp_OAGetProperty @oauth2, 'AuthFlowState', @iTmp0 OUT
IF @iTmp0 = 5
BEGIN
PRINT 'OAuth2 failed to complete.'
EXEC sp_OAGetProperty @oauth2, 'FailureInfo', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @oauth2
RETURN
END
EXEC sp_OAGetProperty @oauth2, 'AuthFlowState', @iTmp0 OUT
IF @iTmp0 = 4
BEGIN
PRINT 'OAuth2 authorization was denied.'
EXEC sp_OAGetProperty @oauth2, 'AccessTokenResponse', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @oauth2
RETURN
END
EXEC sp_OAGetProperty @oauth2, 'AuthFlowState', @iTmp0 OUT
IF @iTmp0 <> 3
BEGIN
EXEC sp_OAGetProperty @oauth2, 'AuthFlowState', @iTmp0 OUT
PRINT 'Unexpected AuthFlowState:' + @iTmp0
EXEC @hr = sp_OADestroy @oauth2
RETURN
END
PRINT 'OAuth2 authorization granted!'
EXEC sp_OAGetProperty @oauth2, 'AccessToken', @sTmp0 OUT
PRINT 'Access Token = ' + @sTmp0
-- Get the full JSON response:
DECLARE @json int
EXEC @hr = sp_OACreate 'Chilkat.JsonObject', @json OUT
EXEC sp_OAGetProperty @oauth2, 'AccessTokenResponse', @sTmp0 OUT
EXEC sp_OAMethod @json, 'Load', @success OUT, @sTmp0
EXEC sp_OASetProperty @json, 'EmitCompact', 0
-- The JSON response looks like this:
-- {
-- "token_type": "Bearer",
-- "access_token": "AAIkYTU0ZWM ... sxE0KL0HHWw",
-- "expires_in": 3600,
-- "consented_on": 1584641121,
-- "scope": "ais.balances.read ais.transactions.read-90days ais.transactions.read-history",
-- "refresh_token": "AAJXXSdN ... Uiblz9ILkxNBlytRGA",
-- "refresh_token_expires_in": 157784760,
-- "expires_on": "1584644722"
-- }
EXEC sp_OAMethod @json, 'Emit', @sTmp0 OUT
PRINT @sTmp0
-- Save the JSON to a file to be used in future requests.
DECLARE @fac int
EXEC @hr = sp_OACreate 'Chilkat.FileAccess', @fac OUT
EXEC sp_OAMethod @json, 'Emit', @sTmp0 OUT
EXEC sp_OAMethod @fac, 'WriteEntireTextFile', @success OUT, 'qa_data/tokens/rabobank.json', @sTmp0, 'utf-8', 0
EXEC @hr = sp_OADestroy @oauth2
EXEC @hr = sp_OADestroy @json
EXEC @hr = sp_OADestroy @fac
END
GO