keycloak-connect-ruby 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 180d60b0cea5a62dc228132572cc72eceb89002f0a232c017b38368730b66983
4
+ data.tar.gz: f3fa190ce0dae9fa402cc00f9e4630411c83fe0706691f081b20179feaa68c2a
5
+ SHA512:
6
+ metadata.gz: 8bd82583a660c35b2eecb5a973d02a04d0f3900ba05925c8394cbe78c2d75bd45838a1991eb319cfcd038523e8e2474c45197ef3a86149cb2ac42087ea9f0ac9
7
+ data.tar.gz: 3534faedd7a25d73d5f44ce878b16f3556cda531a1e3c9727445f89278004b70732718a0a5fe81447703a8c139818fbb391d066a674c7d95fda25efaf6da7048
@@ -0,0 +1,34 @@
1
+ name: CI
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ dockerfile:
7
+ runs-on: ubuntu-latest
8
+ steps:
9
+ - uses: actions/checkout@v2
10
+
11
+ - name: Build Dockerfile
12
+ run: docker build -t keycloak_connect_ruby_specs .
13
+
14
+ - name: Run tests inside Docker container
15
+ run: docker run -v $(pwd):/app/ -i keycloak_connect_ruby_specs
16
+
17
+ tests:
18
+ runs-on: ubuntu-latest
19
+ strategy:
20
+ matrix:
21
+ ruby-version: [2.7, 3.0]
22
+ steps:
23
+ - uses: actions/checkout@v2
24
+
25
+ - name: Install Ruby ${{ matrix.ruby-version }}
26
+ uses: ruby/setup-ruby@v1
27
+ with:
28
+ ruby-version: ${{ matrix.ruby-version }}
29
+
30
+ - name: Install dependencies
31
+ run: bundle install
32
+
33
+ - name: Run tests with Ruby ${{ matrix.ruby-version }}
34
+ run: bundle exec rake
@@ -0,0 +1,30 @@
1
+ name: Publish to Rubygems
2
+
3
+ on:
4
+ release:
5
+ types: [created]
6
+
7
+ jobs:
8
+ deploy:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@v2
12
+
13
+ - name: Install Ruby
14
+ uses: ruby/setup-ruby@v1
15
+ with:
16
+ ruby-version: 3.0
17
+
18
+ - name: Install dependencies
19
+ run: bundle install
20
+
21
+ - name: Publish to Rubygems
22
+ run: |
23
+ mkdir -p $HOME/.gem
24
+ touch $HOME/.gem/credentials
25
+ chmod 0600 $HOME/.gem/credentials
26
+ printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
27
+ gem build *.gemspec
28
+ gem push *.gem
29
+ env:
30
+ GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+ .rspec_status
10
+ /Gemfile.lock
11
+ *.gem
12
+ *.log
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,54 @@
1
+ AllCops:
2
+ NewCops: enable
3
+ SuggestExtensions: false
4
+ Exclude:
5
+ - spec/*
6
+ - keycloak-connect-ruby.gemspec
7
+
8
+ Gemspec/RequiredRubyVersion:
9
+ Enabled: false
10
+
11
+ Style/OpenStructUse:
12
+ Enabled: false
13
+
14
+ Style/Documentation:
15
+ Enabled: false
16
+
17
+ Lint/UnusedMethodArgument:
18
+ Enabled: false
19
+
20
+ Style/WordArray:
21
+ Enabled: false
22
+
23
+ Style/MutableConstant:
24
+ Enabled: false
25
+
26
+ Layout/EmptyLineBetweenDefs:
27
+ Enabled: false
28
+
29
+ Style/SymbolArray:
30
+ Enabled: false
31
+
32
+ Lint/ScriptPermission:
33
+ Enabled: false
34
+
35
+ Layout/LineLength:
36
+ Enabled: false
37
+
38
+ Style/StringLiterals:
39
+ EnforcedStyle: single_quotes
40
+
41
+ Style/FrozenStringLiteralComment:
42
+ Enabled: false
43
+
44
+ Naming/FileName:
45
+ Enabled: false
46
+
47
+ Naming/MemoizedInstanceVariableName:
48
+ Enabled: false
49
+
50
+ Style/IfUnlessModifier:
51
+ Enabled: false
52
+
53
+ Style/GuardClause:
54
+ Enabled: false
data/Dockerfile ADDED
@@ -0,0 +1,6 @@
1
+ FROM ruby:3.0.0-alpine
2
+ RUN apk update && apk add git build-base
3
+ WORKDIR /app/
4
+ COPY . .
5
+ RUN bundle install
6
+ CMD bundle exec rake
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,52 @@
1
+ # Keycloak connect ruby
2
+
3
+ ```ruby
4
+ require 'logger'
5
+
6
+ KeycloakConnectRuby.configure do |c|
7
+ c.url = 'http://keycloak_server:8080'
8
+ c.realm = 'my-company'
9
+ c.client_id = 'my-sinatra-app'
10
+ c.client_secret = 'dsfgfdgfdgfd'
11
+ c.logger = Logger.new(STDOUT) # Or Rails.logger
12
+ c.proxy = nil
13
+ end
14
+
15
+ class MyApiController < ApplicationController
16
+ before_action :keycloak_authenticate_and_check_role!
17
+
18
+ def current_user
19
+ KeycloakConnectRuby::User.from_token(keycloak_token)
20
+ end
21
+
22
+ private
23
+
24
+ def keycloak_token
25
+ KeycloakConnectRuby::Token.validate_and_decode(bearer_token)
26
+ end
27
+
28
+ def bearer_token
29
+ request.authorization&.to_s&.gsub(/^Bearer /, "")
30
+ end
31
+
32
+ def keycloak_authenticate_and_check_role!
33
+ unless current_user.has_role?('my-role-name')
34
+ render json: { error: 'your message here' }, status: :unauthorized
35
+ end
36
+ rescue KeycloakConnectRuby::Errors::Token::ExpiredError => e
37
+ # ...
38
+ rescue KeycloakConnectRuby::Errors::Token::NoProvidedError => e
39
+ # ...
40
+ rescue KeycloakConnectRuby::Errors::Token::InvalidFormatError => e
41
+ # ...
42
+ end
43
+
44
+ def generate_keycloak_token_for_api_calls
45
+ # Client Credentials Grant flow
46
+ KeycloakConnectRuby::Token.generate_from_client_credentials
47
+
48
+ # Resource Owner Password Credentials flow (or Direct Grant flow)
49
+ KeycloakConnectRuby::Token.generate_from_password_credentials('username here', 'password here')
50
+ end
51
+ end
52
+ ```
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
+ require 'rubocop/rake_task'
6
+
7
+ RSpec::Core::RakeTask.new(:spec)
8
+ RuboCop::RakeTask.new
9
+
10
+ task default: [:spec, :rubocop]
data/bin/console ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'keycloak-connect-ruby'
6
+ require 'irb'
7
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env bash
2
+ # frozen_string_literal: true
3
+
4
+ set -euo pipefail
5
+ IFS=$'\n\t'
6
+ set -vx
7
+ bundle install
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/keycloak-connect-ruby/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'keycloak-connect-ruby'
7
+ spec.version = KeycloakConnectRuby::VERSION
8
+ spec.authors = ['Pedro Furtado']
9
+ spec.email = ['pedro.felipe.azevedo.furtado@gmail.com']
10
+ spec.summary = 'Ruby gem for integration with Keycloak API'
11
+ spec.description = 'Ruby gem for integration with Keycloak API'
12
+ spec.homepage = 'https://github.com/pedrofurtado/keycloak-connect-ruby'
13
+ spec.license = 'MIT'
14
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.0.0')
15
+ spec.metadata["homepage_uri"] = spec.homepage
16
+ spec.metadata["source_code_uri"] = spec.homepage
17
+ spec.metadata["changelog_uri"] = "#{spec.homepage}/blob/master/CHANGELOG.md"
18
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) { `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } }
19
+ spec.bindir = 'exe'
20
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
+ spec.require_paths = ['lib']
22
+
23
+ spec.add_development_dependency 'rake'
24
+ spec.add_development_dependency 'rspec'
25
+ spec.add_development_dependency 'webmock'
26
+ spec.add_development_dependency 'rubocop'
27
+ spec.add_development_dependency 'codecov'
28
+ end
@@ -0,0 +1,43 @@
1
+ require 'ostruct'
2
+
3
+ module KeycloakConnectRuby
4
+ CONFIG_OPTIONS = [
5
+ 'url',
6
+ 'realm',
7
+ 'client_id',
8
+ 'client_secret',
9
+ 'logger',
10
+ 'proxy'
11
+ ]
12
+
13
+ def self.configure
14
+ options = OpenStruct.new
15
+ yield options
16
+ validate_options(options)
17
+ @configuration ||= options
18
+ end
19
+
20
+ def self.config
21
+ @configuration
22
+ end
23
+
24
+ def self.logger
25
+ config.logger
26
+ end
27
+
28
+ def self.validate_options(options)
29
+ keys = options.each_pair.to_a.map { |p| p[0].to_s }
30
+
31
+ keys.each do |key|
32
+ unless CONFIG_OPTIONS.include?(key)
33
+ raise KeycloakConnectRuby::Errors::Configuration::UnknownOptionError, "Unknown option: #{key}. The config options are: #{CONFIG_OPTIONS.join(', ')}"
34
+ end
35
+ end
36
+
37
+ missing_options = CONFIG_OPTIONS - keys
38
+
39
+ if missing_options.any?
40
+ raise KeycloakConnectRuby::Errors::Configuration::MissingOptionsError, "Missing options: #{missing_options.join(', ')}. The config options are: #{CONFIG_OPTIONS.join(', ')}"
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,16 @@
1
+ module KeycloakConnectRuby
2
+ module Errors
3
+ module Configuration
4
+ class Error < StandardError; end
5
+ class UnknownOptionError < Error; end
6
+ class MissingOptionsError < Error; end
7
+ end
8
+
9
+ module Token
10
+ class Error < StandardError; end
11
+ class ExpiredError < Error; end
12
+ class NoProvidedError < Error; end
13
+ class InvalidFormatError < Error; end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,22 @@
1
+ require 'uri'
2
+ require 'net/http'
3
+ require 'json'
4
+
5
+ module KeycloakConnectRuby
6
+ class Token
7
+ def self.generate_from_client_credentials
8
+ # colocar logger e proxy aqui
9
+ uri = URI("#{KeycloakConnectRuby.config.url}/realms/#{KeycloakConnectRuby.config.realm}/protocol/openid-connect/token")
10
+
11
+ params = {
12
+ 'client_id' => KeycloakConnectRuby.config.client_id,
13
+ 'client_secret' => KeycloakConnectRuby.config.client_secret,
14
+ 'grant_type' => 'client_credentials'
15
+ }
16
+
17
+ response = Net::HTTP.post_form(uri, params)
18
+ tokens = JSON.parse(response.body)
19
+ tokens['access_token']
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module KeycloakConnectRuby
4
+ VERSION = '1.0.0'
5
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'keycloak-connect-ruby/version'
4
+ require_relative 'keycloak-connect-ruby/errors'
5
+ require_relative 'keycloak-connect-ruby/configuration'
6
+ require_relative 'keycloak-connect-ruby/token'
7
+
8
+ module KeycloakConnectRuby; end
metadata ADDED
@@ -0,0 +1,133 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: keycloak-connect-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Pedro Furtado
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2024-02-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: webmock
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: codecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Ruby gem for integration with Keycloak API
84
+ email:
85
+ - pedro.felipe.azevedo.furtado@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".github/workflows/ci.yml"
91
+ - ".github/workflows/publish_to_rubygems.yml"
92
+ - ".gitignore"
93
+ - ".rspec"
94
+ - ".rubocop.yml"
95
+ - Dockerfile
96
+ - Gemfile
97
+ - README.md
98
+ - Rakefile
99
+ - bin/console
100
+ - bin/setup
101
+ - keycloak-connect-ruby.gemspec
102
+ - lib/keycloak-connect-ruby.rb
103
+ - lib/keycloak-connect-ruby/configuration.rb
104
+ - lib/keycloak-connect-ruby/errors.rb
105
+ - lib/keycloak-connect-ruby/token.rb
106
+ - lib/keycloak-connect-ruby/version.rb
107
+ homepage: https://github.com/pedrofurtado/keycloak-connect-ruby
108
+ licenses:
109
+ - MIT
110
+ metadata:
111
+ homepage_uri: https://github.com/pedrofurtado/keycloak-connect-ruby
112
+ source_code_uri: https://github.com/pedrofurtado/keycloak-connect-ruby
113
+ changelog_uri: https://github.com/pedrofurtado/keycloak-connect-ruby/blob/master/CHANGELOG.md
114
+ post_install_message:
115
+ rdoc_options: []
116
+ require_paths:
117
+ - lib
118
+ required_ruby_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: 2.0.0
123
+ required_rubygems_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ requirements: []
129
+ rubygems_version: 3.5.3
130
+ signing_key:
131
+ specification_version: 4
132
+ summary: Ruby gem for integration with Keycloak API
133
+ test_files: []