Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Implementatie

Single Sign-on vanuit een applicatie begint door het verkrijgen van een OpenID Connect Access Token (OIDC Access Token) via de authorization code grant.

Zodra de applicatie het OIDC Access Token heeft, kan de uitwisseling via de Token Exchange beginnen om een OAuth Access Token te generen dat de Mijn Burgerprofiel-applicatie kan verwerken.

Opmerking: de maximale duur van de Mijn Burgerprofiel applicatieve sessie is gekoppeld aan de resterende tijdsduur van het OIDC Access Token. Om ervoor te zorgen dat een gebruiker zo lang mogelijk kan aangemeld blijven, is het aangeraden om eerst een refresh uitvoeren.

Token Exchange

Zodra de applicatie een OIDC Access Token heeft, kan er een OAuth Access Token worden aangevraagd via delegatie volgens de Token Exchange RFC. Dit betekent dat subject en actor token moeten meegegeven worden tijdens de Token Exchange.

Code Block
POST /op/v1/token HTTP/1.1
Host: authenticatie-ti.vlaanderen.be
Content-Type: application/x-www-form-urlencoded

grant_type=urn:ietf:params:oauth:grant-type:token-exchange
&audience=<MBP-CLIENT-ID>
&subject_token=<OIDC-ACCESS-TOKEN>
&subject_token_type=urn:ietf:params:oauth:token-type:access_token
&actor_token=<OIDC-ACCESS-TOKEN>
&actor_token_type=urn:ietf:params:oauth:token-type:access_token
&client_id=<APP-CLIENT-ID>
&client_secret=<APP-CLIENT-SECRET>

...

Naam

...

Beschrijving

...

<MBP-CLIENT-ID>

...

Bevat de Mijn Burgerprofiel Client-ID (zie Bijlage - Mijn Burgerprofiel Client-ID)

...

<OIDC-ACCESS-TOKEN>

...

OpenID Connect Access Token verkregen door gebruik te maken van authorization code grant of via uitvoeren van refresh

...

<APP-CLIENT-ID>

...

Client-ID van de applicatie (zie Client Authenticatie voor alternatieven)

...

<APP-CLIENT-SECRET>

...

Client Secret van de applicatie (zie Client Authenticatie voor alternatieven).

Info

Opmerking: in het codevoorbeeld gebruiken we een Client-ID en Secret. Deze informatie kan ook als Basic Authentication toegevoegd worden.

Bij een asymmetrisch sleutelpaar is client assertion nodig. Zie ook Client Authenticatie voor meer informatie en voorbeelden.

Wanneer de Token Exchange met succes is uitgevoerd, krijgt de applicatie het onderstaande antwoord:

Code Block
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache, no-store

{
  "issued_token_type":"urn:ietf:params:oauth:token-type:access_token",
  "access_token": "ZC5-A1AkXUzXRKb71sAIHBl9F87F18anzEaQy6G6KFD",
  "expires_in": 3600,
  "scope": "profile rrn",
  "token_type": "Bearer"
}

...

Standaard zal een aanvraagmodule gebruik maken van OpenId Connect (op basis van authorization code grant) in kader van geauthenticeerde formulieren. Hoewel dit geen probleem vormt voor een formulier dat in stand-alone modus getoond wordt kan dit problemen veroorzaken in embedded modus.

Om Single Sign-on vanuit Mijn Burgerprofiel naar een formulier via een aangesloten aanvraagmodule te garanderen maken we gebruik van Token Exchange. Op deze manier zal Mijn Burgerprofiel de beschikbare gebruikerscontext beschikbaar stellen via een OAuth Access Token specifiek gescoped voor de aanvraagmodule.

Gebruikerscontext doorgeven aan een aanvraagmodule

Om de gebruikerscontext door te geven aan Mijn Burgerprofiel een aanvraagmodule moet het OAuth Access Token - verkregen via de voorgaande Token Exchange - worden doorgegeven vanuit Mijn Burgerprofiel. Gezien de gevoeligheid van het OAuth Access Token moet dit altijd via een server-to-server operatie verlopen. De server-to-server operatie verloopt volgens onderstaande API specificatie en moet resulteren in een tijdelijk, éénmalig te gebruiken token.

Swagger integration
docExpansionlist
{
  "openapi": "3.0.2",
  "info": {
    "title": "Mijn BurgerprofielAanvraagmodule - SSO Token",
    "version": "1.0"
  },
  "components": {
    "schemas": {
      "RequestToken": {
        "type": "object",
        "required": [
          "token",
          "token_type"
        ],
        "properties": {
          "token": {
            "type": "string",
            "description": "Token ontvangen via IdP Token Exchange"
          },
          "token_type": {
            "type": "string",
            "description": "Type token ontvangen via IdP Token Exchange",
            "enum": [
              "urn:ietf:params:oauth:token-type:access_token"
            ]
          }
        }
      },
      "ResponseTempToken": {
        "type": "object",
        "required": [
          "token"
        ],
        "properties": {
          "token": {
            "type": "string",
            "description": "Tijdelijk SSO Token"
          }
        }
      },
      "ClientError": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "string",
            "description": "Foutmelding"
          }
        }
      },
      "ServerError": {
        "type": "string"
      }
    }
  },
  "servers": [
    {
      "description": "TNI",
      "url": "https://burgerprofiel.tni-vlaanderen.be"
    },
    {
      "description": "Productie",
      "url": "https://www.burgerprofiel.be"
    }
  ],
  "paths": {
    "/auth/v1/token": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RequestToken"
              }
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/RequestToken"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Vraagstelling is geaccepteerd en een tijdelijk token werd gegenereerd",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResponseTempToken"
                }
              }
            }
          },
          "400": {
            "description": "Vraagstelling ontbreekt verplichte velden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClientError"
                }
              }
            }
          },
          "401": {
            "description": "Ongeldig of vervallen token in de vraagstelling",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClientError"
                }
              }
            }
          },
          "500": {
            "description": "Onverwacht probleem opgetreden in de applicatie bij het verwerken van het token",
            "content": {
              "text/html": {
                "schema": {
                  "$ref": "#/components/schemas/ServerError"
                }
              }
            }
          }
        }
      }
    }
  }
}

Info

Opmerking: het tijdelijk token via de API-endpoint kan maar één keer gebruikt worden. Bovendien vervalt het na ongeveer 2 min. we raden aan om de geldigheidsduur onder de 5 minuten te behouden.

Tot slot moet het tijdelijk token worden doorgegeven als query parameters van via de Mijn Burgerprofiel-formulier URL. Een aantal voorbeelden van dit type URL's:

  • TNIVoorbeelden:

    • https://burgerprofielformulier.tni-vlaanderen.be/?token=<MBP-TEMP-TOKEN>

    • https://burgerprofiel.tni-vlaanderen.be/meldingen?token=<MBP-TEMP-TOKEN>

    Productie:

    • https://www.burgerprofiel.be/?token=<MBP-TEMP-TOKEN>

    • https://www.burgerprofiel.be/meldingen?token=<MBP-TEMPf6d35977-f45d-4710-befc-21e2812d83ea?token=<TEMP-TOKEN>

Anchor
bijlage-mbp-client-id
bijlage-mbp-client-id
Bijlage - Mijn Burgerprofiel Client-ID

...