The project is in a healthy, maintained state
Library to manage external identities
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
 Dependencies

Development

~> 13.0
~> 3.0
~> 1.21
~> 3.23.1

Runtime

~> 0.22
 Project Readme

Code0::Identities Build Status GitHub Release Discord

This gem can load and validate external identities

Supported platforms

OAuth:

  • Google
  • Discord
  • Microsoft
  • Github
  • Gitlab
  • OIDC / oAuth2
  • SAML

Installation

Install the gem and add to the application's Gemfile by executing:

$ bundle add code0-identities

If bundler is not being used to manage dependencies, install the gem by executing:

$ gem install code0-identities

Usage

You can use predefined Providers to load an identity from for example Discord:

require "code0/identities"

begin

  identity = Code0::Identities::Provider::Discord.new(
    {
      redirect_uri: "http://localhost:8080/redirect",
      client_id: "id",
      client_secret: "xxxx"
    }).load_identity({ code: "a_valid_code" })

rescue Code0::Error => e
  puts "Error occurred while loading the identity", e
  exit!
end

# Then you can use the details from the user
puts identity.provider # = :discord
puts identity.username
puts identity.identifier
# ...

Or you can use a provider with multiple configured providers:

require "code0/identities"

identity_provider = Code0::Identities::IdentityProvider.new

identity_provider.add_provider(:gitlab, my_gitlab_configuration)
identity_provider.add_named_provider(:my_custom_gitlab_provider, :gitlab, my_custom_gitlab_provider_configuration)

# Now you can either use the custom "my_custom_gitlab_provider" provider
# or the "gitlab" provider

identity_provider.load_identity(:gitlab, params)

# or

identity_provider.load_identity(:my_custom_gitlab_provider, params)

We also support passing in a function as a configuration instead of a hash

def get_identity
  provider = Code0::Identities::Provider::Discord.new(-> { fetch_configuration })

  provider.load_identity(params)
end

def fetch_configuration
  # Do some database action, to dynamicly load the configuration
  {
    redirect_uri: "http://localhost:8080/redirect",
    client_id: "some dynamic value",
    client_secret: "xxxx"
  }
end

Configuration

As you already know, we allow / require to pass in a configuration. Here are all avaiable configuration keys:

Oauth Based:

Here is the updated table where each key in the JSON (identifier, username, etc.) is explicitly labeled:

Name Description Default
client_id The client id of the application (needs to be set) (no default specified)
client_secret The client secret of the application (needs to be set) (no default specified)
redirect_uri The redirect URL of the application (needs to be set) (no default specified)
provider_name The provider name (not necessarily) depends on the provider (e.g., discord, github)
user_details_url The user details URL to gather user information (only for OIDC) (no default specified)
authorization_url The URL which the user has to access to authorize (only for OIDC) (no default specified)
attribute_statements The keys which the response of the user details has (id, name, email, ...) (only for OIDC) {} (see below for more)
attribute_statements.identifier The identifier of the user to identify (only for OIDC) ["id", "sub", "identifier"]
attribute_statements.username The username of the user (only for OIDC) ["username", "name", "login"]
attribute_statements.email The email address of the user (only for OIDC) ["email", "mail"]
attribute_statements.firstname The first name of the user (only for OIDC) ["first_name", "firstname", ...]
attribute_statements.lastname The last name of the user (only for OIDC) ["last_name", "lastname", ...]

SAML

Name Description Default
provider_name The provider name (not necessarily) saml
attribute_statements The keys which the response of the user details has (id, name, email, ...) (only for OIDC) {} (see below for more)
attribute_statements.username The username of the user ["username", "name", ...]
attribute_statements.email The email address of the user ["email", "mail", ...]
attribute_statements.firstname The first name of the user ["first_name", "firstname", ...]
attribute_statements.lastname The last name of the user ["last_name", "lastname", ...]
settings The settings to configure the saml response/requests (see SAML-Toolkits#L200) {}
response_settings The response settings to disable some checks if you want (see SAML-Toolkits#L234) {}
metadata_url The metadata url to fetch the metadatas (replacement for settings) (no default specified)