Sample code for 30+ languages & platforms
PureBasic

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