SQL Server
SQL Server
Refresh Access Token on 401 Unauthorized and Retry (Service Account)
See more Google Cloud Storage Examples
Demonstrates how to handle an expired access token error, refresh the token, and retry the request. (In this case, the request is to download an object from Google Cloud Storage.)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
-- This example requires the Chilkat API to have been previously unlocked.
-- See Global Unlock Sample for sample code.
-- This example uses a previously obtained access token having permission for the
-- scope "https://www.googleapis.com/auth/cloud-platform"
-- In this example, Get Google Cloud Storage OAuth2 Access Token,
-- the service account access token was saved to a text file. This example fetches the access token from the file..
DECLARE @sbToken int
EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @sbToken OUT
IF @hr <> 0
BEGIN
PRINT 'Failed to create ActiveX component'
RETURN
END
EXEC sp_OAMethod @sbToken, 'LoadFile', @success OUT, 'qa_data/tokens/googleCloudStorageAccessToken.txt', 'utf-8'
IF @success = 0
BEGIN
PRINT 'Failed to load access token.'
EXEC @hr = sp_OADestroy @sbToken
RETURN
END
DECLARE @http int
EXEC @hr = sp_OACreate 'Chilkat.Http', @http OUT
EXEC sp_OAMethod @sbToken, 'GetAsString', @sTmp0 OUT
EXEC sp_OASetProperty @http, 'AuthToken', @sTmp0
-- Construct a URL to download an object named "starfish.jpg" from the "chilkat-ocean" bucket.
EXEC sp_OAMethod @http, 'SetUrlVar', @success OUT, 'bucket_name', 'chilkat-ocean'
EXEC sp_OAMethod @http, 'SetUrlVar', @success OUT, 'object_name', 'starfish.jpg'
DECLARE @url nvarchar(4000)
SELECT @url = 'https://www.googleapis.com/storage/v1/b/{$bucket_name}/o/{$object_name}?alt=media'
-- If there is an error response, then we didn't actually download the file data,
-- but instead we downloaded an error response..
DECLARE @fileData int
EXEC @hr = sp_OACreate 'Chilkat.BinData', @fileData OUT
EXEC sp_OAMethod @http, 'DownloadBd', @success OUT, @url, @fileData
DECLARE @responseCode int
EXEC sp_OAGetProperty @http, 'LastStatus', @responseCode OUT
IF (@success = 0) and (@responseCode <> 401)
BEGIN
EXEC sp_OAGetProperty @http, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @sbToken
EXEC @hr = sp_OADestroy @http
EXEC @hr = sp_OADestroy @fileData
RETURN
END
IF @responseCode = 401
BEGIN
PRINT 'Received 401 Unauthorized response. Attempting to refresh the access token...'
-- May be that the access token expired.
-- Load our JSON key and request a new access token, then retry the original request.
DECLARE @fac int
EXEC @hr = sp_OACreate 'Chilkat.FileAccess', @fac OUT
DECLARE @jsonKey nvarchar(4000)
EXEC sp_OAMethod @fac, 'ReadEntireTextFile', @jsonKey OUT, 'qa_data/googleApi/ChilkatCloud-13a07a2e8b3f.json', 'utf-8'
EXEC sp_OAGetProperty @fac, 'LastMethodSuccess', @iTmp0 OUT
IF @iTmp0 <> 1
BEGIN
EXEC sp_OAGetProperty @fac, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @sbToken
EXEC @hr = sp_OADestroy @http
EXEC @hr = sp_OADestroy @fileData
EXEC @hr = sp_OADestroy @fac
RETURN
END
DECLARE @gAuth int
EXEC @hr = sp_OACreate 'Chilkat.AuthGoogle', @gAuth OUT
EXEC sp_OASetProperty @gAuth, 'JsonKey', @jsonKey
EXEC sp_OASetProperty @gAuth, 'Scope', 'https://www.googleapis.com/auth/cloud-platform'
EXEC sp_OASetProperty @gAuth, 'ExpireNumSeconds', 3600
EXEC sp_OASetProperty @gAuth, 'SubEmailAddress', ''
DECLARE @tlsSock int
EXEC @hr = sp_OACreate 'Chilkat.Socket', @tlsSock OUT
EXEC sp_OAMethod @tlsSock, 'Connect', @success OUT, 'www.googleapis.com', 443, 1, 5000
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @tlsSock, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @sbToken
EXEC @hr = sp_OADestroy @http
EXEC @hr = sp_OADestroy @fileData
EXEC @hr = sp_OADestroy @fac
EXEC @hr = sp_OADestroy @gAuth
EXEC @hr = sp_OADestroy @tlsSock
RETURN
END
EXEC sp_OAMethod @gAuth, 'ObtainAccessToken', @success OUT, @tlsSock
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @gAuth, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @sbToken
EXEC @hr = sp_OADestroy @http
EXEC @hr = sp_OADestroy @fileData
EXEC @hr = sp_OADestroy @fac
EXEC @hr = sp_OADestroy @gAuth
EXEC @hr = sp_OADestroy @tlsSock
RETURN
END
EXEC sp_OAGetProperty @gAuth, 'AccessToken', @sTmp0 OUT
EXEC sp_OAMethod @fac, 'WriteEntireTextFile', @success OUT, 'qa_data/tokens/googleCloudStorageAccessToken.txt', @sTmp0, 'utf-8', 0
-- Retry the original request.
EXEC sp_OAGetProperty @gAuth, 'AccessToken', @sTmp0 OUT
EXEC sp_OASetProperty @http, 'AuthToken', @sTmp0
EXEC sp_OAMethod @http, 'DownloadBd', @success OUT, @url, @fileData
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @http, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @sbToken
EXEC @hr = sp_OADestroy @http
EXEC @hr = sp_OADestroy @fileData
EXEC @hr = sp_OADestroy @fac
EXEC @hr = sp_OADestroy @gAuth
EXEC @hr = sp_OADestroy @tlsSock
RETURN
END
END
IF @responseCode <> 200
BEGIN
-- Get the error response
DECLARE @sbErrorResponse int
EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @sbErrorResponse OUT
EXEC sp_OAMethod @sbErrorResponse, 'AppendBd', @success OUT, @fileData, 'utf-8', 0, 0
PRINT 'Error response code = ' + @responseCode
PRINT 'Error:'
EXEC sp_OAMethod @sbErrorResponse, 'GetAsString', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @sbToken
EXEC @hr = sp_OADestroy @http
EXEC @hr = sp_OADestroy @fileData
EXEC @hr = sp_OADestroy @fac
EXEC @hr = sp_OADestroy @gAuth
EXEC @hr = sp_OADestroy @tlsSock
EXEC @hr = sp_OADestroy @sbErrorResponse
RETURN
END
PRINT 'Success.'
-- Save the downloaded data to a file.
EXEC sp_OAMethod @fileData, 'WriteFile', @success OUT, 'qa_output/starfish.jpg'
EXEC @hr = sp_OADestroy @sbToken
EXEC @hr = sp_OADestroy @http
EXEC @hr = sp_OADestroy @fileData
EXEC @hr = sp_OADestroy @fac
EXEC @hr = sp_OADestroy @gAuth
EXEC @hr = sp_OADestroy @tlsSock
EXEC @hr = sp_OADestroy @sbErrorResponse
END
GO