authkeeper 0.1.11 → 0.1.13

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8105f35b2cee5f3c686c7300ebf3bb41b8c17872ea63fdbe59ba469716a7d370
4
- data.tar.gz: c25b539dbca8a4ed37e00efb528ad877c4ca6abb81a49df16f4e9ff0b8142af7
3
+ metadata.gz: c436194b9b10209087de9a23e793a03cb9dc222748fe9b2d040d17e84b1f0b3b
4
+ data.tar.gz: 73af525eb9235b3d3e0cc8c31159d5665c42a829b3548ba0ce2e9dfd676791bb
5
5
  SHA512:
6
- metadata.gz: 07b69c728a18d65e77c65d5b0a3613d6d676b88a96bab31c4d46d9017ad1350cb15e878b505962831e7d899ed08827cc85020fbc8177891611471ce5440a7600
7
- data.tar.gz: 3e4e74fb0bf1f8b95e5121cfc8b525b0fe057abe2783045b64fd7be82782522a3566a66d288e0be769c2c77cea4f19a23923da0441856dc23e3e2b1fd12b0090
6
+ metadata.gz: 4ad5ea1075dfac7c1b18f12b00eb4ce3a3ff17c8aace3a603dd6660fc0210630d672d4496ede00305f8b84b115833c97bb001dd6d5c187ee88367b877053ee7b
7
+ data.tar.gz: c98938d5da6d1fb5f5c333143384806fcfd0bffed5a2c45fdef6cbdd0e1b338fe20bc1bd285952bee8aec112d72e4bab3b8b7a7add03acc6951ef1c2dd2e0596
@@ -5,7 +5,7 @@ module Authkeeper
5
5
  module Requests
6
6
  module FetchAccessToken
7
7
  def fetch_access_token(client_id:, client_secret:, code:, redirect_uri:)
8
- post(
8
+ form_post(
9
9
  path: 'oauth2/v4/token',
10
10
  params: {
11
11
  grant_type: 'authorization_code',
@@ -22,8 +22,7 @@ module Authkeeper
22
22
  }
23
23
  end
24
24
 
25
- # rubocop: disable Metrics/AbcSize
26
- def post(path:, body: nil, headers: nil)
25
+ def no_params_post(path:, body: nil, headers: nil)
27
26
  if Rails.env.test? && connection.adapter != 'Faraday::Adapter::Test'
28
27
  raise StandardError, 'please stub request in test env'
29
28
  end
@@ -32,6 +31,23 @@ module Authkeeper
32
31
  response.body if response.success?
33
32
  end
34
33
 
34
+ def post(path:, body: {}, params: {}, headers: {}) # rubocop: disable Metrics/AbcSize
35
+ if Rails.env.test? && connection.adapter != 'Faraday::Adapter::Test'
36
+ raise StandardError, 'please stub request in test env'
37
+ end
38
+
39
+ response = connection.post(path) do |request|
40
+ params.each do |param, value|
41
+ request.params[param] = value
42
+ end
43
+ headers.each do |header, value|
44
+ request.headers[header] = value
45
+ end
46
+ request.body = body.to_json
47
+ end
48
+ response.body if response.success?
49
+ end
50
+
35
51
  def form_post(path:, body: {}, params: {}, headers: {})
36
52
  if Rails.env.test? && connection.adapter != 'Faraday::Adapter::Test'
37
53
  raise StandardError, 'please stub request in test env'
@@ -7,9 +7,9 @@ module Authkeeper
7
7
  module Requests
8
8
  module AccessToken
9
9
  def fetch_access_token(client_id:, redirect_url:, device_id:, code:, state:, code_verifier:)
10
- post(
10
+ form_post(
11
11
  path: 'oauth2/auth',
12
- body: URI.encode_www_form({
12
+ body: {
13
13
  grant_type: 'authorization_code',
14
14
  client_id: client_id,
15
15
  device_id: device_id,
@@ -17,7 +17,7 @@ module Authkeeper
17
17
  state: state,
18
18
  redirect_uri: redirect_url,
19
19
  code_verifier: code_verifier
20
- }),
20
+ },
21
21
  headers: {
22
22
  'Content-Type' => 'application/x-www-form-urlencoded'
23
23
  }
@@ -25,15 +25,15 @@ module Authkeeper
25
25
  end
26
26
 
27
27
  def refresh_access_token(client_id:, refresh_token:, device_id:, state:)
28
- post(
28
+ form_post(
29
29
  path: 'oauth2/auth',
30
- body: URI.encode_www_form({
30
+ body: {
31
31
  grant_type: 'refresh_token',
32
32
  client_id: client_id,
33
33
  device_id: device_id,
34
34
  refresh_token: refresh_token,
35
35
  state: state
36
- }),
36
+ },
37
37
  headers: {
38
38
  'Content-Type' => 'application/x-www-form-urlencoded'
39
39
  }
@@ -8,14 +8,14 @@ module Authkeeper
8
8
  module Requests
9
9
  module AccessToken
10
10
  def fetch_access_token(client_id:, client_secret:, code:)
11
- post(
11
+ form_post(
12
12
  path: 'token',
13
- body: URI.encode_www_form({
13
+ body: {
14
14
  grant_type: 'authorization_code',
15
15
  client_id: client_id,
16
16
  client_secret: client_secret,
17
17
  code: code
18
- }),
18
+ },
19
19
  headers: {
20
20
  'Content-Type' => 'application/x-www-form-urlencoded'
21
21
  }
@@ -23,12 +23,12 @@ module Authkeeper
23
23
  end
24
24
 
25
25
  def refresh_access_token(client_id:, client_secret:, refresh_token:)
26
- post(
26
+ form_post(
27
27
  path: 'token',
28
- body: URI.encode_www_form({
28
+ body: {
29
29
  grant_type: 'refresh_token',
30
30
  refresh_token: refresh_token
31
- }),
31
+ },
32
32
  headers: {
33
33
  'Content-Type' => 'application/x-www-form-urlencoded',
34
34
  'Authorization' => "Basic #{authorization(client_id, client_secret)}"
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Authkeeper
4
+ class FetchUuidService
5
+ include AuthkeeperDeps[jwt_encoder: 'jwt_encoder']
6
+
7
+ def call(token:)
8
+ payload = extract_uuid(token)
9
+ return { errors: ['Forbidden'] } if payload.blank?
10
+ return { errors: ['Forbidden'] } if payload['uuid'].blank?
11
+
12
+ { result: payload['uuid'] }
13
+ end
14
+
15
+ private
16
+
17
+ def extract_uuid(token)
18
+ jwt_encoder.decode(token: token)
19
+ end
20
+ end
21
+ end
@@ -5,7 +5,7 @@ module Authkeeper
5
5
  InitializeError = Class.new(StandardError)
6
6
 
7
7
  attr_accessor :user_model, :user_session_model, :access_token_name, :domain, :fallback_url_session_name, :omniauth_providers,
8
- :token_expiration_seconds
8
+ :token_expiration_seconds, :current_user_cache_minutes
9
9
  attr_reader :omniauth_configs
10
10
 
11
11
  def initialize
@@ -20,6 +20,8 @@ module Authkeeper
20
20
  @omniauth_configs = {}
21
21
 
22
22
  @token_expiration_seconds = 18_144_000 # 30.days
23
+
24
+ @current_user_cache_minutes = nil
23
25
  end
24
26
 
25
27
  def validate
@@ -37,6 +37,7 @@ module Authkeeper
37
37
  register('services.providers.vk') { Authkeeper::Providers::Vk.new }
38
38
  register('services.providers.discord') { Authkeeper::Providers::Discord.new }
39
39
 
40
+ register('services.fetch_uuid') { Authkeeper::FetchUuidService.new }
40
41
  register('services.fetch_session') { Authkeeper::FetchSessionService.new }
41
42
  register('services.generate_token') { Authkeeper::GenerateTokenService.new }
42
43
  end
@@ -14,6 +14,27 @@ module Authkeeper
14
14
  private
15
15
 
16
16
  def set_current_user
17
+ return find_user if Authkeeper.configuration.current_user_cache_minutes.nil?
18
+
19
+ access_token = cookies_token.presence || bearer_token.presence || params_token
20
+ return unless access_token
21
+
22
+ auth_uuid = Authkeeper::Container['services.fetch_uuid'].call(token: access_token)
23
+ return if auth_uuid[:errors].present?
24
+
25
+ user_id =
26
+ Rails.cache.fetch(
27
+ "authkeeper_cached_user_v2/#{auth_uuid[:result]}",
28
+ expires_in: Authkeeper.configuration.current_user_cache_minutes.minutes,
29
+ race_condition_ttl: 10.seconds
30
+ ) do
31
+ find_user
32
+ current_user&.id
33
+ end
34
+ @current_user ||= User.find_by(id: user_id)
35
+ end
36
+
37
+ def find_user
17
38
  access_token = cookies_token.presence || bearer_token.presence || params_token
18
39
  return unless access_token
19
40
 
@@ -65,6 +86,9 @@ module Authkeeper
65
86
  if access_token
66
87
  auth_call = Authkeeper::Container['services.fetch_session'].call(token: access_token)
67
88
  auth_call[:result].destroy if auth_call[:result]
89
+
90
+ auth_uuid = Authkeeper::Container['services.fetch_uuid'].call(token: access_token)
91
+ Rails.cache.delete("authkeeper_cached_user_v2/#{auth_uuid[:result]}") if auth_uuid[:result]
68
92
  end
69
93
 
70
94
  cookies.delete(access_token_name)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Authkeeper
4
- VERSION = '0.1.11'
4
+ VERSION = '0.1.13'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: authkeeper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.1.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bogdanov Anton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-11-14 00:00:00.000000000 Z
11
+ date: 2025-12-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -67,6 +67,7 @@ files:
67
67
  - app/mailers/authkeeper/application_mailer.rb
68
68
  - app/models/authkeeper/application_record.rb
69
69
  - app/services/authkeeper/fetch_session_service.rb
70
+ - app/services/authkeeper/fetch_uuid_service.rb
70
71
  - app/services/authkeeper/generate_token_service.rb
71
72
  - app/services/authkeeper/providers/discord.rb
72
73
  - app/services/authkeeper/providers/github.rb