Skip to content

Commit 2904e7a

Browse files
committed
Fix some identity login issues
1 parent 3d76669 commit 2904e7a

13 files changed

Lines changed: 57 additions & 39 deletions

Gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ gem 'rotp'
8181
gem 'grpc', '~> 1.67'
8282
gem 'tucana', '0.0.76'
8383

84-
gem 'code0-identities', '~> 0.0.3'
84+
gem 'code0-identities', '~> 0.0.6'
8585

8686
gem 'pry', '~> 0.16.0'
8787
gem 'pry-byebug', '~> 3.10'

Gemfile.lock

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ GEM
8989
builder (3.3.0)
9090
byebug (13.0.0)
9191
reline (>= 0.6.0)
92-
code0-identities (0.0.3)
92+
code0-identities (0.0.6)
9393
base64 (~> 0.3.0)
9494
httparty (~> 0.22)
9595
ruby-saml (~> 1.18)
@@ -102,7 +102,7 @@ GEM
102102
concurrent-ruby (1.3.8)
103103
connection_pool (3.0.2)
104104
crass (1.0.7)
105-
csv (3.3.5)
105+
csv (3.3.6)
106106
database_cleaner-active_record (2.2.2)
107107
activerecord (>= 5.a)
108108
database_cleaner-core (~> 2.0)
@@ -151,7 +151,7 @@ GEM
151151
grpc (1.83.0)
152152
google-protobuf (>= 3.25, < 5.0)
153153
googleapis-common-protos-types (~> 1.0)
154-
httparty (0.23.2)
154+
httparty (0.24.2)
155155
csv
156156
mini_mime (>= 1.0.0)
157157
multi_xml (>= 0.5.2)
@@ -196,8 +196,8 @@ GEM
196196
drb (~> 2.0)
197197
prism (~> 1.5)
198198
msgpack (1.8.1)
199-
multi_xml (0.7.2)
200-
bigdecimal (~> 3.1)
199+
multi_xml (0.9.1)
200+
bigdecimal (>= 3.1, < 5)
201201
net-imap (0.6.3)
202202
date
203203
net-protocol
@@ -625,7 +625,7 @@ DEPENDENCIES
625625
bcrypt (~> 3.1.7)
626626
benchmark
627627
bootsnap
628-
code0-identities (~> 0.0.3)
628+
code0-identities (~> 0.0.6)
629629
code0-license (~> 0.3.0)
630630
code0-zero_track (= 0.0.7)
631631
database_cleaner-active_record (~> 2.1)

app/graphql/types/identity_provider_type.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class IdentityProviderType < IdentityProviderBasicType
88
description: 'Configuration details of the identity provider.'
99

1010
def config
11-
object.config.merge(type: object.type)
11+
object[:config].merge(type: object[:type])
1212
end
1313
end
1414
end

app/graphql/types/input/identity_provider_config_input_type.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ class IdentityProviderConfigInputType < Types::BaseInputObject
1111
argument :client_id, String, required: false, description: 'The client ID for the OIDC identity provider'
1212
argument :client_secret, String, required: false, description: 'The client secret for the OIDC identity provider'
1313
argument :redirect_uri, String, required: false, description: 'The redirect URI for the OIDC identity provider'
14+
argument :token_url, String, required: false,
15+
description: 'The token URL for the OIDC identity provider'
1416
argument :user_details_url, String, required: false,
1517
description: 'The user details URL for the OIDC identity provider'
1618

app/graphql/types/oidc_identity_provider_config_type.rb

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,23 @@ class OidcIdentityProviderConfigType < Types::BaseObject
2727
description: 'The name of the OIDC identity provider'
2828

2929
field :user_details_url, String,
30-
null: false,
30+
null: true,
3131
description: 'The user details URL for the OIDC identity provider'
3232

3333
field :authorization_url, String,
34-
null: false,
34+
null: true,
3535
description: 'The authorization URL for the OIDC identity provider'
3636

37+
field :token_url, String,
38+
null: true,
39+
description: 'The token URL for the OIDC identity provider'
40+
3741
field :attribute_statements, GraphQL::Types::JSON,
38-
null: false,
42+
null: true,
3943
description: 'List of attribute statements for the OIDC identity provider'
44+
45+
def provider_name
46+
object[:provider_name] || object[:type].downcase
47+
end
4048
end
4149
end

app/graphql/types/saml_identity_provider_config_type.rb

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,23 @@ class SamlIdentityProviderConfigType < Types::BaseObject
1313
description: 'The name of the SAML identity provider'
1414

1515
field :attribute_statements, GraphQL::Types::JSON,
16-
null: false,
16+
null: true,
1717
description: 'List of attribute statements for the SAML identity provider'
1818

1919
field :settings, GraphQL::Types::JSON,
20-
null: false,
20+
null: true,
2121
description: 'The SAML settings for the identity provider'
2222

2323
field :response_settings, GraphQL::Types::JSON,
24-
null: false,
24+
null: true,
2525
description: 'The SAML response settings for the identity provider'
2626

2727
field :metadata_url, String,
2828
null: true,
2929
description: 'The metadata url to fetch the metadatas (replacement for settings)'
30+
31+
def provider_name
32+
object[:provider_name] || object[:type].downcase
33+
end
3034
end
3135
end

app/models/application_setting.rb

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -65,17 +65,14 @@ def validate_identity_providers
6565
next errors.add(:value, :id_type_or_config_missing)
6666
end
6767

68-
if provider[:type] == 'saml'
69-
allowed_keys = %i[provider_name attribute_statements settings response_settings metadata_url]
70-
errors.add(:value, :invalid_saml_configuration_keys) unless (provider[:config].keys - allowed_keys).empty?
71-
else
72-
required_keys = %i[client_id client_secret redirect_uri user_details_url authorization_url]
73-
allowed_keys = %i[provider_name attribute_statements] + required_keys
74-
75-
required_keys -= %i[user_details_url authorization_url] unless provider[:type] == 'oidc'
76-
77-
errors.add(:value, :invalid_oidc_configuration_keys) unless (provider[:config].keys - allowed_keys).empty?
78-
errors.add(:value, :missing_oidc_configuration_keys) unless (required_keys - provider[:config].keys).empty?
68+
provider_instance = Code0::Identities::IdentityProvider.for_type(provider[:type]).new(provider[:config].compact)
69+
70+
begin
71+
provider_instance.validate_config!
72+
rescue Code0::Identities::MissingConfigurationError
73+
errors.add(:value, :missing_identity_provider_config)
74+
rescue Code0::Identities::InvalidConfigurationError
75+
errors.add(:value, :invalid_identity_provider_config)
7976
end
8077
end
8178
end

app/services/users/identity/base_service.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ def identity_provider
77
identity_provider = Code0::Identities::IdentityProvider.new
88
enabled_providers = ApplicationSetting.current[:identity_providers]
99
enabled_providers.each do |provider|
10-
provider.deep_symbolize_keys!
10+
provider.to_h.deep_symbolize_keys!
1111
identity_provider.add_named_provider(provider[:id], provider[:type], -> { provider[:config] })
1212
end
1313
identity_provider

app/services/users/identity/link_service.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ module Users
44
module Identity
55
class LinkService < BaseService
66
include Sagittarius::Database::Transactional
7+
include Code0::ZeroTrack::Loggable
78

89
attr_reader :current_authentication, :current_user, :provider_id, :args
910

@@ -19,10 +20,13 @@ def execute
1920
begin
2021
identity = identity_provider.load_identity(provider_id, args)
2122
rescue Code0::Identities::Error => e
22-
return ServiceResponse.error(payload: e, message: 'An error occurred while loading external identity')
23+
logger.warn(message: 'Failed to load external identity', provider_id: provider_id, error: e.message,
24+
backtrace: e.backtrace)
25+
return ServiceResponse.error(error_code: :loading_identity_failed,
26+
message: 'An error occurred while loading external identity')
2327
end
2428
if identity.nil?
25-
return ServiceResponse.error(payload: :invalid_external_identity, message: 'External identity is nil')
29+
return ServiceResponse.error(error_code: :invalid_external_identity, message: 'External identity is nil')
2630
end
2731

2832
transactional do |t|

docs/graphql/input_object/identityproviderconfiginput.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,5 @@ Input for identity provider configuration. Contains fields for both OIDC and SAM
1717
| `redirectUri` | [`String`](../scalar/string.md) | The redirect URI for the OIDC identity provider |
1818
| `responseSettings` | [`JSON`](../scalar/json.md) | The SAML response settings for the identity provider |
1919
| `settings` | [`JSON`](../scalar/json.md) | The SAML settings for the identity provider |
20+
| `tokenUrl` | [`String`](../scalar/string.md) | The token URL for the OIDC identity provider |
2021
| `userDetailsUrl` | [`String`](../scalar/string.md) | The user details URL for the OIDC identity provider |

0 commit comments

Comments
 (0)