Sample code for 30+ languages & platforms
PureBasic Requires Chilkat v11.0.0+

Azure OAuth2 Client Credentials Grant Flow

See more OAuth2 Examples

Demonstrates how to get an OAuth2 access token for an Azure Registered App using the Client Credentials Grant Flow.

Note: Your Azure app must be registered as a single-tenant app to use client credentials.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkHttpResponse.pb"
IncludeFile "CkHttp.pb"
IncludeFile "CkJsonObject.pb"
IncludeFile "CkHttpRequest.pb"

Procedure ChilkatExample()

    success.i = 0

    ;  This example requires the Chilkat API to have been previously unlocked.
    ;  See Global Unlock Sample for sample code.

    http.i = CkHttp::ckCreate()
    If http.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    req.i = CkHttpRequest::ckCreate()
    If req.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkHttpRequest::ckAddParam(req,"client_secret","CLIENT_SECRET")
    CkHttpRequest::ckAddParam(req,"client_id","CLIENT_ID")

    ;  See Understanding Scopes in Azure OAuth2 Client Credentials Flow
    CkHttpRequest::ckAddParam(req,"scope","https://graph.microsoft.com/.default")

    CkHttpRequest::ckAddParam(req,"grant_type","client_credentials")

    ;  Note: Your Azure app must be registered as a single-tenant app to use client credentials.
    ;  Use your own tenant ID, for example 4d8fdd66-66d1-43b0-ae5c-e31b4b7de5cd
    url.s = "https://login.microsoftonline.com/TENANT_ID/oauth2/v2.0/token"

    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,url,req,resp)
    If success = 0
        Debug CkHttp::ckLastErrorText(http)
        CkHttp::ckDispose(http)
        CkHttpRequest::ckDispose(req)
        CkHttpResponse::ckDispose(resp)
        ProcedureReturn
    EndIf

    statusCode.i = CkHttpResponse::ckStatusCode(resp)
    Debug "Response status code = " + Str(statusCode)

    json.i = CkJsonObject::ckCreate()
    If json.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkJsonObject::ckLoad(json,CkHttpResponse::ckBodyStr(resp))

    CkJsonObject::setCkEmitCompact(json, 0)
    Debug CkJsonObject::ckEmit(json)

    ;  Sample successful output:

    ;  {
    ;    "token_type": "Bearer",
    ;    "expires_in": 3599,
    ;    "ext_expires_in": 3599,
    ;    "access_token": "eyJ0eX...K0jOERg"
    ;  }

    If statusCode = 200
        CkJsonObject::ckWriteFile(json,"qa_data/tokens/azureClientCredentialsToken.json")
        Debug "Success."
    Else
        Debug "Failed."
    EndIf



    CkHttp::ckDispose(http)
    CkHttpRequest::ckDispose(req)
    CkHttpResponse::ckDispose(resp)
    CkJsonObject::ckDispose(json)


    ProcedureReturn
EndProcedure