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

Azure Fetch OpenID Connect metadata document

See more OIDC Examples

Downloads the OpenID Connect self-discovery document for an Azure OIDC enabled app.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkHttpResponse.pb"
IncludeFile "CkHttp.pb"
IncludeFile "CkJsonObject.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

    CkHttp::setCkAccept(http, "application/json")

    ;  See the Microsoft Azure OIDC documentation at https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-protocols-oidc
    ;  The "tenant" can take one of four values described in the documentation at the link above.

    success = CkHttp::ckSetUrlVar(http,"tenant","6d8ddd66-68d1-44b0-af5c-e31b4b7ee5cd")
    resp.i = CkHttpResponse::ckCreate()
    If resp.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkHttp::ckHttpNoBody(http,"GET","https://login.microsoftonline.com/{$tenant}/v2.0/.well-known/openid-configuration",resp)
    If success = 0
        Debug CkHttp::ckLastErrorText(http)
        CkHttp::ckDispose(http)
        CkHttpResponse::ckDispose(resp)
        ProcedureReturn
    EndIf

    Debug "Response Status Code: " + Str(CkHttpResponse::ckStatusCode(resp))

    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)

    If CkHttpResponse::ckStatusCode(resp) <> 200
        Debug "Failed."
        CkHttp::ckDispose(http)
        CkHttpResponse::ckDispose(resp)
        CkJsonObject::ckDispose(json)
        ProcedureReturn
    EndIf

    ;  Sample output...
    ;  (See the parsing code below..)
    ;  
    ;  Use the this online tool to generate parsing code from sample JSON: 
    ;  Generate Parsing Code from JSON

    ;  {
    ;    "token_endpoint": "https://login.microsoftonline.com/6d8ddd66-68d1-44b0-af5c-e31b4b7ee5cd/oauth2/v2.0/token",
    ;    "token_endpoint_auth_methods_supported": [
    ;      "client_secret_post",
    ;      "private_key_jwt",
    ;      "client_secret_basic"
    ;    ],
    ;    "jwks_uri": "https://login.microsoftonline.com/6d8ddd66-68d1-44b0-af5c-e31b4b7ee5cd/discovery/v2.0/keys",
    ;    "response_modes_supported": [
    ;      "query",
    ;      "fragment",
    ;      "form_post"
    ;    ],
    ;    "subject_types_supported": [
    ;      "pairwise"
    ;    ],
    ;    "id_token_signing_alg_values_supported": [
    ;      "RS256"
    ;    ],
    ;    "response_types_supported": [
    ;      "code",
    ;      "id_token",
    ;      "code id_token",
    ;      "id_token token"
    ;    ],
    ;    "scopes_supported": [
    ;      "openid",
    ;      "profile",
    ;      "email",
    ;      "offline_access"
    ;    ],
    ;    "issuer": "https://login.microsoftonline.com/6d8ddd66-68d1-44b0-af5c-e31b4b7ee5cd/v2.0",
    ;    "request_uri_parameter_supported": false,
    ;    "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo",
    ;    "authorization_endpoint": "https://login.microsoftonline.com/6d8ddd66-68d1-44b0-af5c-e31b4b7ee5cd/oauth2/v2.0/authorize",
    ;    "device_authorization_endpoint": "https://login.microsoftonline.com/6d8ddd66-68d1-44b0-af5c-e31b4b7ee5cd/oauth2/v2.0/devicecode",
    ;    "http_logout_supported": true,
    ;    "frontchannel_logout_supported": true,
    ;    "end_session_endpoint": "https://login.microsoftonline.com/6d8ddd66-68d1-44b0-af5c-e31b4b7ee5cd/oauth2/v2.0/logout",
    ;    "claims_supported": [
    ;      "sub",
    ;      "iss",
    ;      "cloud_instance_name",
    ;      "cloud_instance_host_name",
    ;      "cloud_graph_host_name",
    ;      "msgraph_host",
    ;      "aud",
    ;      "exp",
    ;      "iat",
    ;      "auth_time",
    ;      "acr",
    ;      "nonce",
    ;      "preferred_username",
    ;      "name",
    ;      "tid",
    ;      "ver",
    ;      "at_hash",
    ;      "c_hash",
    ;      "email"
    ;    ],
    ;    "kerberos_endpoint": "https://login.microsoftonline.com/6d8ddd66-68d1-44b0-af5c-e31b4b7ee5cd/kerberos",
    ;    "tenant_region_scope": "NA",
    ;    "cloud_instance_name": "microsoftonline.com",
    ;    "cloud_graph_host_name": "graph.windows.net",
    ;    "msgraph_host": "graph.microsoft.com",
    ;    "rbac_url": "https://pas.windows.net"
    ;  }

    strVal.s

    token_endpoint.s = CkJsonObject::ckStringOf(json,"token_endpoint")
    jwks_uri.s = CkJsonObject::ckStringOf(json,"jwks_uri")
    issuer.s = CkJsonObject::ckStringOf(json,"issuer")
    request_uri_parameter_supported.i = CkJsonObject::ckBoolOf(json,"request_uri_parameter_supported")
    userinfo_endpoint.s = CkJsonObject::ckStringOf(json,"userinfo_endpoint")
    authorization_endpoint.s = CkJsonObject::ckStringOf(json,"authorization_endpoint")
    device_authorization_endpoint.s = CkJsonObject::ckStringOf(json,"device_authorization_endpoint")
    http_logout_supported.i = CkJsonObject::ckBoolOf(json,"http_logout_supported")
    frontchannel_logout_supported.i = CkJsonObject::ckBoolOf(json,"frontchannel_logout_supported")
    end_session_endpoint.s = CkJsonObject::ckStringOf(json,"end_session_endpoint")
    kerberos_endpoint.s = CkJsonObject::ckStringOf(json,"kerberos_endpoint")
    tenant_region_scope.s = CkJsonObject::ckStringOf(json,"tenant_region_scope")
    cloud_instance_name.s = CkJsonObject::ckStringOf(json,"cloud_instance_name")
    cloud_graph_host_name.s = CkJsonObject::ckStringOf(json,"cloud_graph_host_name")
    msgraph_host.s = CkJsonObject::ckStringOf(json,"msgraph_host")
    rbac_url.s = CkJsonObject::ckStringOf(json,"rbac_url")
    i.i = 0
    count_i.i = CkJsonObject::ckSizeOfArray(json,"token_endpoint_auth_methods_supported")
    While i < count_i
        CkJsonObject::setCkI(json, i)
        strVal = CkJsonObject::ckStringOf(json,"token_endpoint_auth_methods_supported[i]")
        i = i + 1
    Wend
    i = 0
    count_i = CkJsonObject::ckSizeOfArray(json,"response_modes_supported")
    While i < count_i
        CkJsonObject::setCkI(json, i)
        strVal = CkJsonObject::ckStringOf(json,"response_modes_supported[i]")
        i = i + 1
    Wend
    i = 0
    count_i = CkJsonObject::ckSizeOfArray(json,"subject_types_supported")
    While i < count_i
        CkJsonObject::setCkI(json, i)
        strVal = CkJsonObject::ckStringOf(json,"subject_types_supported[i]")
        i = i + 1
    Wend
    i = 0
    count_i = CkJsonObject::ckSizeOfArray(json,"id_token_signing_alg_values_supported")
    While i < count_i
        CkJsonObject::setCkI(json, i)
        strVal = CkJsonObject::ckStringOf(json,"id_token_signing_alg_values_supported[i]")
        i = i + 1
    Wend
    i = 0
    count_i = CkJsonObject::ckSizeOfArray(json,"response_types_supported")
    While i < count_i
        CkJsonObject::setCkI(json, i)
        strVal = CkJsonObject::ckStringOf(json,"response_types_supported[i]")
        i = i + 1
    Wend
    i = 0
    count_i = CkJsonObject::ckSizeOfArray(json,"scopes_supported")
    While i < count_i
        CkJsonObject::setCkI(json, i)
        strVal = CkJsonObject::ckStringOf(json,"scopes_supported[i]")
        i = i + 1
    Wend
    i = 0
    count_i = CkJsonObject::ckSizeOfArray(json,"claims_supported")
    While i < count_i
        CkJsonObject::setCkI(json, i)
        strVal = CkJsonObject::ckStringOf(json,"claims_supported[i]")
        i = i + 1
    Wend


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


    ProcedureReturn
EndProcedure