---
title: Charmhub | Deploy Kratos External Idp Integrator using Charmhub - The Open
  Operator Collection
description: Deploy the latest version of Kratos External Idp Integrator on any cloud.
url: https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider
---

# Kratos External Idp Integrator

[Identity Charmers](https://charmhub.io/publisher/identity-charmers "View all packages from Identity Charmers")

* [Identity Charmers](https://charmhub.io/publisher/identity-charmers "View all packages from Identity Charmers")

Platform:

22.04

stable 299

```
juju deploy kratos-external-idp-integrator
```

[Learn to deploy on juju >](https://juju.is/docs/juju/manage-applications)

[Toggle side navigation](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#drawer)

## charms.kratos\_external\_idp\_integrator.v1.kratos\_external\_provider

* [*Docstrings*Docstrings](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider)
  [*Code*Source code](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider/source-code)
* + Download

    Fetch library

    ```
    charmcraft fetch-lib charms.kratos_external_idp_integrator.v1.kratos_external_provider
    ```

    [Download kratos\_external\_provider.py](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider/download)
  + *Last updated* 01 Aug 2025
  + *Revision* Library version 1.0

#### Interface library for Kratos external OIDC providers.

This library wraps relation endpoints using the `kratos-external-idp` interface
and provides a Python API for both requesting Kratos to register the client credentials
and for communicating with an external provider.

##### Getting Started

To get started using the library, you need to fetch the library using `charmcraft`.

```
cd some-charm
charmcraft fetch-lib charms.kratos_external_idp_integrator.v1.kratos_external_provider
```

To use the library from the provider side (KratosExternalIdpIntegrator):

In the `metadata.yaml` of the charm, add the following:

```
provides:
    kratos-external-idp:
        interface: external_provider
        limit: 1
```

Then, to initialize the library:

```
from charms.kratos_external_idp_integrator.v1.kratos_external_provider import (
    ExternalIdpProvider,
)
from ops.model import BlockedStatus

class SomeCharm(CharmBase):
  def __init__(self, *args):
    # ...
    self.external_idp_provider = ExternalIdpProvider(self, self.config)

    self.framework.observe(self.on.config_changed, self._on_config_changed)
    self.framework.observe(self.external_idp_provider.on.ready, self._on_ready)
    self.framework.observe(
        self.external_idp_provider.on.redirect_uri_changed, self._on_redirect_uri_changed
    )

    def _on_config_changed(self, event):
        # ...
        providers = self.external_idp_provider.validate_provider_config([self.config])
        if not providers:
            self.unit.status = BlockedStatus("Invalid configuration")
        # ...

    def _on_redirect_uri_changed(self, event):
        logger.info(f"The client's redirect_uri changed to {event.redirect_uri}")

    def _on_ready(self, event):
        if not isinstance(self.unit.status, BlockedStatus):
            self.external_idp_provider.create_providers(providers)
```

To use the library from the requirer side (Kratos):

In the `metadata.yaml` of the charm, add the following:

```
requires:
    kratos-external-idp:
        interface: external_provider
```

Then, to initialize the library:

```
from charms.kratos_external_idp_integrator.v1.kratos_external_provider import (
    ExternalIdpRequirer
)

class KratosCharm(CharmBase):
  def __init__(self, *args):
    # ...
    self.external_idp_requirer = ExternalIdpRequirer(self)

    self.framework.observe(
        self.external_idp_provider.on.client_config_changed, self._on_client_config_changed
    )

    def _on_client_config_changed(self, event):
        self._configure(event)

        self.external_provider.update_registered_provider(
            providers,
            event.relation_id,
        )
```

---

Index

* [def dump\_secret(
  v,
  \_
  )](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#dump_secret)
* [class BaseProvider](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#baseprovider)
* + [def validate\_provider(
    cls,
    v)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#baseprovider-validate_provider)
* + [def serialize\_scope(
    self,
    v)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#baseprovider-serialize_scope)
* + [def deserialize\_scope(
    cls,
    v)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#baseprovider-deserialize_scope)
* + [def deserialize\_mapper\_url(
    self)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#baseprovider-deserialize_mapper_url)
* + [def deserialize\_id(
    self)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#baseprovider-deserialize_id)
* + [def deserialize\_label(
    self)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#baseprovider-deserialize_label)
* [class GenericProvider](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#genericprovider)
* + [def deserialize\_id(
    self)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#genericprovider-deserialize_id)
* [class SocialProvider](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#socialprovider)
* [class GithubProvider](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#githubprovider)
* + [def deserialize\_scope(
    cls,
    v)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#githubprovider-deserialize_scope)
* [class MicrosoftProvider](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#microsoftprovider)
* + [def deserialize\_id(
    self)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#microsoftprovider-deserialize_id)
* [class AppleProvider](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#appleprovider)
* [class Providers](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#providers)
* + [def \_\_iter\_\_(
    self)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#providers-__iter__)
* + [def \_\_getitem\_\_(
    self,
    idx)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#providers-__getitem__)
* + [def \_\_len\_\_(
    self)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#providers-__len__)
* [class RequirerProvider](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#requirerprovider)
* [class RequirerProviders](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#requirerproviders)
* + [def \_\_iter\_\_(
    self)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#requirerproviders-__iter__)
* + [def \_\_getitem\_\_(
    self,
    idx)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#requirerproviders-__getitem__)
* + [def \_\_len\_\_(
    self)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#requirerproviders-__len__)
* [class RelationReadyEvent](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#relationreadyevent)
* + [def snapshot(
    self)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#relationreadyevent-snapshot)
* + [def restore(
    self,
    snapshot)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#relationreadyevent-restore)
* [class RedirectURIChangedEvent](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#redirecturichangedevent)
* + [def \_\_init\_\_(
    self,
    handle,
    redirect\_uri)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#redirecturichangedevent-__init__)
* + [def snapshot(
    self)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#redirecturichangedevent-snapshot)
* + [def restore(
    self,
    snapshot)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#redirecturichangedevent-restore)
* [class ExternalIdpProviderEvents](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#externalidpproviderevents)
* [class ExternalIdpProvider](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#externalidpprovider)
* + [def \_\_init\_\_(
    self,
    charm,
    relation\_name)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#externalidpprovider-__init__)
* + [def is\_ready(
    self)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#externalidpprovider-is_ready)
* + [def create\_providers(
    self,
    providers)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#externalidpprovider-create_providers)
* + [def remove\_provider(
    self)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#externalidpprovider-remove_provider)
* + [def get\_redirect\_uri(
    self,
    relation\_id)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#externalidpprovider-get_redirect_uri)
* + [def validate\_provider\_config(
    configurations)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#externalidpprovider-validate_provider_config)
* [class ClientConfigChangedEvent](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#clientconfigchangedevent)
* + [def \_\_init\_\_(
    self,
    handle,
    provider)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#clientconfigchangedevent-__init__)
* + [def snapshot(
    self)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#clientconfigchangedevent-snapshot)
* + [def restore(
    self,
    snapshot)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#clientconfigchangedevent-restore)
* [class ClientConfigRemovedEvent](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#clientconfigremovedevent)
* + [def \_\_init\_\_(
    self,
    handle,
    relation\_id)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#clientconfigremovedevent-__init__)
* + [def snapshot(
    self)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#clientconfigremovedevent-snapshot)
* + [def restore(
    self,
    snapshot)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#clientconfigremovedevent-restore)
* [class ExternalIdpRequirerEvents](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#externalidprequirerevents)
* [class ExternalIdpRequirer](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#externalidprequirer)
* + [def \_\_init\_\_(
    self,
    charm,
    relation\_name)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#externalidprequirer-__init__)
* + [def relations(
    self)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#externalidprequirer-relations)
* + [def update\_registered\_provider(
    self,
    providers,
    relation\_id)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#externalidprequirer-update_registered_provider)
* + [def remove\_registered\_provider(
    self,
    relation\_id)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#externalidprequirer-remove_registered_provider)
* + [def get\_providers\_from\_relation(
    self,
    relation)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#externalidprequirer-get_providers_from_relation)
* + [def get\_providers(
    self)](https://charmhub.io/kratos-external-idp-integrator/libraries/kratos_external_provider#externalidprequirer-get_providers)

#### def dump\_secret(     v: SecretStr,     \_: SerializerFunctionWrapHandler )

#### class BaseProvider

Methods

BaseProvider.
validate\_provider(

cls

,
v: str
)

BaseProvider.
serialize\_scope(

*self*

,
v
)

BaseProvider.
deserialize\_scope(

cls

,
v
)

BaseProvider.
deserialize\_mapper\_url(

*self*
)

BaseProvider.
deserialize\_id(

*self*
)

BaseProvider.
deserialize\_label(

*self*
)

#### class GenericProvider

Methods

GenericProvider.
deserialize\_id(

*self*
)

#### class SocialProvider

#### class GithubProvider

Methods

GithubProvider.
deserialize\_scope(

cls

,
v
)

#### class MicrosoftProvider

Methods

MicrosoftProvider.
deserialize\_id(

*self*
)

#### class AppleProvider

#### class Providers

Methods

Providers.
\_\_iter\_\_(

*self*
)

Providers.
\_\_getitem\_\_(

*self*

,
idx: int
)

Providers.
\_\_len\_\_(

*self*
)

#### class RequirerProvider

#### class RequirerProviders

Methods

RequirerProviders.
\_\_iter\_\_(

*self*
)

RequirerProviders.
\_\_getitem\_\_(

*self*

,
idx: int
)

RequirerProviders.
\_\_len\_\_(

*self*
)

#### class RelationReadyEvent

Description

Event to notify the charm that the relation is ready. None

Methods

RelationReadyEvent.
snapshot(

*self*
)

Description

Save event. None

RelationReadyEvent.
restore(

*self*

,
snapshot: dict
)

Description

Restore event. None

#### class RedirectURIChangedEvent

Description

Event to notify the charm that the redirect\_uri changed. None

Methods

RedirectURIChangedEvent.
\_\_init\_\_(

*self*

,
handle: Handle

,
redirect\_uri: str
)

RedirectURIChangedEvent.
snapshot(

*self*
)

Description

Save redirect\_uri. None

RedirectURIChangedEvent.
restore(

*self*

,
snapshot: dict
)

Description

Restore redirect\_uri. None

#### class ExternalIdpProviderEvents

Description

Event descriptor for events raised by `ExternalIdpProvider`. None

#### class ExternalIdpProvider

Description

Forward client configurations to Identity Broker. None

Methods

ExternalIdpProvider.
\_\_init\_\_(

*self*

,
charm: CharmBase

,
relation\_name: str
)

ExternalIdpProvider.
is\_ready(

*self*
)

Description

Checks if the relation is ready. None

ExternalIdpProvider.
create\_providers(

*self*

,
providers: Providers
)

ExternalIdpProvider.
remove\_provider(

*self*
)

ExternalIdpProvider.
get\_redirect\_uri(

*self*

,
relation\_id
)

Description

Get the kratos client's redirect\_uri. None

ExternalIdpProvider.
validate\_provider\_config(

configurations
)

Description

Validate the OIDC provider configuration. None

#### class ClientConfigChangedEvent

Description

Event to notify the charm that a provider's client config changed. None

Methods

ClientConfigChangedEvent.
\_\_init\_\_(

*self*

,
handle: Handle

,
provider: Provider
)

ClientConfigChangedEvent.
snapshot(

*self*
)

Description

Save event. None

ClientConfigChangedEvent.
restore(

*self*

,
snapshot: dict
)

Description

Restore event. None

#### class ClientConfigRemovedEvent

Description

Event to notify the charm that a provider's client config was removed. None

Methods

ClientConfigRemovedEvent.
\_\_init\_\_(

*self*

,
handle: Handle

,
relation\_id: str
)

ClientConfigRemovedEvent.
snapshot(

*self*
)

Description

Save event. None

ClientConfigRemovedEvent.
restore(

*self*

,
snapshot: dict
)

Description

Restore event. None

#### class ExternalIdpRequirerEvents

Description

Event descriptor for events raised by `ExternalIdpRequirerEvents`. None

#### class ExternalIdpRequirer

Description

Receive the External Idp configurations for Kratos. None

Methods

ExternalIdpRequirer.
\_\_init\_\_(

*self*

,
charm: CharmBase

,
relation\_name: str
)

ExternalIdpRequirer.
relations(

*self*
)

ExternalIdpRequirer.
update\_registered\_provider(

*self*

,
providers: RequirerProviders

,
relation\_id: int
)

ExternalIdpRequirer.
remove\_registered\_provider(

*self*

,
relation\_id: int
)

ExternalIdpRequirer.
get\_providers\_from\_relation(

*self*

,
relation: Relation
)

ExternalIdpRequirer.
get\_providers(

*self*
)
