Packages
oidcc
3.0.0-alpha.2
3.7.2
3.7.1
3.7.0
3.6.0
3.5.2
3.5.1
3.5.0
retired
3.4.0
3.3.0
3.2.6
3.2.5
3.2.4
3.2.3
3.2.2
3.2.1
3.2.0
3.2.0-beta.3
3.2.0-beta.2
retired
3.2.0-beta.1
retired
3.1.2
3.1.2-beta.1
retired
3.1.1
retired
3.1.0
retired
3.1.0-beta.2
retired
3.1.0-beta.1
retired
3.0.2
3.0.1
retired
3.0.0
retired
3.0.0-rc.6
retired
3.0.0-rc.5
retired
3.0.0-rc.4
retired
3.0.0-rc.3
retired
3.0.0-rc.2
retired
3.0.0-rc.1
retired
3.0.0-alpha.5
retired
3.0.0-alpha.4
retired
3.0.0-alpha.3
retired
3.0.0-alpha.2
retired
3.0.0-alpha.1
retired
2.0.0-alpha.2
retired
2.0.0-alpha.1
retired
1.8.1
retired
1.8.0
retired
1.7.0
retired
1.6.0
retired
1.5.1
retired
1.5.0
retired
1.4.0
retired
1.3.0
retired
1.2.1
retired
1.2.0
retired
1.1.0
retired
1.0.1
retired
1.0.0
retired
OpenID Connect client library for the BEAM.
Retired package: Security issue - DoS Vulnerability, see https://github.com/erlef/oidcc/security/advisories/GHSA-mj35-2rgf-cv8p
Current section
Files
Jump to
Current section
Files
lib/oidcc/client_context.ex
defmodule Oidcc.ClientContext do
@moduledoc """
Client Configuration for authorization, token exchange and userinfo
For most projects, it makes sense to use
`Oidcc.ProviderConfiguration.Worker` and the high-level
interface of `Oidcc`. In that case direct usage of this
module is not needed.
"""
use Oidcc.RecordStruct,
internal_name: :context,
record_name: :oidcc_client_context,
hrl: "include/oidcc_client_context.hrl"
alias Oidcc.ProviderConfiguration
@type t() :: %__MODULE__{
provider_configuration: ProviderConfiguration.t(),
jwks: JOSE.JWK.t(),
client_id: String.t(),
client_secret: String.t()
}
@doc """
Create Client Context from a `Oidcc.ProviderConfiguration.Worker`
## Examples
iex> {:ok, pid} =
...> Oidcc.ProviderConfiguration.Worker.start_link(%{
...> issuer: "https://accounts.google.com/",
...> name: __MODULE__.GoogleConfigProvider
...> })
...>
...> {:ok, %Oidcc.ClientContext{}} =
...> Oidcc.ClientContext.from_configuration_worker(
...> __MODULE__.GoogleConfigProvider,
...> "client_id",
...> "client_Secret"
...> )
...>
...> {:ok, %Oidcc.ClientContext{}} =
...> Oidcc.ClientContext.from_configuration_worker(
...> pid,
...> "client_id",
...> "client_Secret"
...> )
"""
@spec from_configuration_worker(
provider_name :: GenServer.name(),
client_id :: String.t(),
client_secret :: String.t()
) :: {:ok, t()} | {:error, :oidcc_client_context.t()}
def from_configuration_worker(provider_name, client_id, client_secret) do
with {:ok, client_context} <-
:oidcc_client_context.from_configuration_worker(
provider_name,
client_id,
client_secret
) do
{:ok, record_to_struct(client_context)}
end
end
@doc """
Create Client Context manually
## Examples
iex> {:ok, {configuration, _expiry}} =
...> Oidcc.ProviderConfiguration.load_configuration(
...> "https://login.salesforce.com"
...> )
...>
...> {:ok, {jwks, _expiry}} =
...> Oidcc.ProviderConfiguration.load_jwks(
...> configuration.jwks_uri
...> )
...>
...> %Oidcc.ClientContext{} =
...> Oidcc.ClientContext.from_manual(
...> configuration,
...> jwks,
...> "client_id",
...> "client_Secret"
...> )
"""
@spec from_manual(
configuration :: ProviderConfiguration.t(),
jwks :: JOSE.JWK.t(),
client_id :: String.t(),
client_secret :: String.t()
) :: t()
def from_manual(configuration, jwks, client_id, client_secret) do
configuration = ProviderConfiguration.struct_to_record(configuration)
jwks = JOSE.JWK.to_record(jwks)
configuration
|> :oidcc_client_context.from_manual(jwks, client_id, client_secret)
|> record_to_struct()
end
@impl Oidcc.RecordStruct
def record_to_struct(record) do
record
|> super()
|> Map.update!(:provider_configuration, &ProviderConfiguration.record_to_struct/1)
|> Map.update!(:jwks, &JOSE.JWK.from_record/1)
end
@impl Oidcc.RecordStruct
def struct_to_record(struct) do
struct
|> Map.update!(:provider_configuration, &ProviderConfiguration.struct_to_record/1)
|> Map.update!(:jwks, &JOSE.JWK.to_record/1)
|> super()
end
end