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 +7 -0
- data/.github/workflows/ci.yml +34 -0
- data/.github/workflows/publish_to_rubygems.yml +30 -0
- data/.gitignore +12 -0
- data/.rspec +3 -0
- data/.rubocop.yml +54 -0
- data/Dockerfile +6 -0
- data/Gemfile +4 -0
- data/README.md +52 -0
- data/Rakefile +10 -0
- data/bin/console +7 -0
- data/bin/setup +7 -0
- data/keycloak-connect-ruby.gemspec +28 -0
- data/lib/keycloak-connect-ruby/configuration.rb +43 -0
- data/lib/keycloak-connect-ruby/errors.rb +16 -0
- data/lib/keycloak-connect-ruby/token.rb +22 -0
- data/lib/keycloak-connect-ruby/version.rb +5 -0
- data/lib/keycloak-connect-ruby.rb +8 -0
- metadata +133 -0
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
data/.rspec
ADDED
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
data/Gemfile
ADDED
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
data/bin/console
ADDED
data/bin/setup
ADDED
@@ -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,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: []
|