Sample code for 30+ languages & platforms
SQL Server

GeoOp OAuth2 Authorisation Code Grant (Public App)

See more OAuth2 Examples

Demonstrates how to get an access token for a GeoOp Third-Party Public Application using the Authorisation Code Grant flow.

Chilkat SQL Server Downloads

SQL Server
-- 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

    -- It requires the Chilkat API to have been previously unlocked.
    -- See Global Unlock Sample for sample code.

    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 match the Site URL configured for your GeoOp (non-Server) Application, such as "http://localhost:3017/"
    EXEC sp_OASetProperty @oauth2, 'ListenPort', 3017

    EXEC sp_OASetProperty @oauth2, 'AuthorizationEndpoint', 'https://login.geoop.com/oauth2/code'
    EXEC sp_OASetProperty @oauth2, 'TokenEndpoint', 'https://login.geoop.com/oauth2/token'

    -- Replace the client ID with an actual value.
    EXEC sp_OASetProperty @oauth2, 'ClientId', 'GEOOP-APPLICATION-ID'
    -- The ClientSecret should remain empty for a GeoOp public application
    EXEC sp_OASetProperty @oauth2, 'ClientSecret', ''

    -- We need a few special settings for GeoOp
    EXEC sp_OASetProperty @oauth2, 'Scope', 'default'
    EXEC sp_OASetProperty @oauth2, 'CodeChallenge', 0
    -- Setting LocalHost equal to "none" prevents the "redirect_uri" query param from being sent in the initial HTTP request.
    -- Note: The GeoOp Application should still have a redirect URL specified as "http://localhost:3017/", where the port
    -- number matches the ListenPort above.
    EXEC sp_OASetProperty @oauth2, 'LocalHost', 'none'

    -- 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

    -- 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

    -- Save the entire JSON response, which includes the access token, for future calls.
    -- The JSON AccessTokenResponse looks like this:
    -- {"access_token":"e6dqdG....mzjpT04w==","token_type":"Bearer","expires_in":2592000,"owner_id":984236}

    DECLARE @fac int
    EXEC @hr = sp_OACreate 'Chilkat.FileAccess', @fac OUT

    EXEC sp_OAGetProperty @oauth2, 'AccessTokenResponse', @sTmp0 OUT
    EXEC sp_OAMethod @fac, 'WriteEntireTextFile', @success OUT, 'qa_data/tokens/geoop.json', @sTmp0, 'utf-8', 0


    PRINT 'Success.'

    EXEC @hr = sp_OADestroy @oauth2
    EXEC @hr = sp_OADestroy @fac


END
GO