authkeeper 0.1.1 → 0.1.3

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: 2616ca82fd0778b03efe16f617048f00d06306695be3c5f269299d23cd4f1d50
4
- data.tar.gz: c0877dd71503826030c4c679a6cd4139f658ee1be5c643ba2389e2fab9120812
3
+ metadata.gz: 3fb703b887c4415e68a9ed91bea0a41cf1c682ccf20742d18c26700205f37a72
4
+ data.tar.gz: f9ff63172357aab12de6252c5c58a764ec9e354921fc9199826d0876778ecbfb
5
5
  SHA512:
6
- metadata.gz: f6e170db4dd20e031d29135a962388ba4a83ec6ea3ae460a180763d9416f9f7e7215b0b152c2c10df202a9e20c31cca0a10fe10d26c0b93ff7f6b8b145a568f3
7
- data.tar.gz: '000585f7ae8e44ba54ab52c15accfbc8bc689bc1a21cad5964353f7ddac9e3ce5774e50fe5b1b910b768f1d83200155d1e6b044856d929ef288939d4ca4ea945'
6
+ metadata.gz: 633d17c8e59833d357dca0861cbfef908813a8668102ddff1e6760cc6e9aa3dc1fe249b3f7a194f4324d7c1722b97ba2684c2ed14b88993afea003943630bb73
7
+ data.tar.gz: 902eef36cfcee239262871e13d1fd1eace8eca90f0b99449541d31ae46e94002c8943cc492d2b823861e2b2dff1c04f44bb5b51a68cef236b6a8a88553eb16c6
@@ -12,6 +12,7 @@ module Authkeeper
12
12
  TELEGRAM = 'telegram'
13
13
  GOOGLE = 'google'
14
14
  YANDEX = 'yandex'
15
+ VK = 'vk'
15
16
 
16
17
  skip_before_action :verify_authenticity_token
17
18
  skip_before_action :authenticate, only: %i[create]
@@ -49,20 +50,16 @@ module Authkeeper
49
50
  end
50
51
 
51
52
  def auth
52
- @auth ||= provider_service(params[:provider]).call(params: params)[:result]
53
+ @auth ||=
54
+ provider_service(params[:provider]).call(params: params.merge(oauth_data))[:result]
53
55
  end
54
56
 
55
- def provider_service(provider)
56
- Authkeeper::Container.resolve("services.providers.#{provider}")
57
+ def oauth_data
58
+ Rails.cache.read("oauth_data_#{params[:state]}") || {}
57
59
  end
58
60
 
59
- def sign_in(user)
60
- user_session = Authkeeper.configuration.user_session_model.constantize.create!(user: user)
61
- cookies[Authkeeper.configuration.access_token_name] = {
62
- value: generate_token.call(user_session: user_session)[:result],
63
- domain: Authkeeper.configuration.domain,
64
- expires: 1.week.from_now
65
- }.compact
61
+ def provider_service(provider)
62
+ Authkeeper::Container.resolve("services.providers.#{provider}")
66
63
  end
67
64
  end
68
65
  end
@@ -2,12 +2,13 @@
2
2
 
3
3
  module Authkeeper
4
4
  module ApplicationHelper
5
- def omniauth_link(provider)
5
+ def omniauth_link(provider, oauth_data=nil)
6
6
  case provider
7
7
  when :github then github_oauth_link
8
8
  when :gitlab then gitlab_oauth_link
9
9
  when :google then google_oauth_link
10
10
  when :yandex then yandex_oauth_link
11
+ when :vk then vk_oauth_link(oauth_data)
11
12
  end
12
13
  end
13
14
 
@@ -29,6 +30,10 @@ module Authkeeper
29
30
  def yandex_oauth_link
30
31
  "https://oauth.yandex.ru/authorize?response_type=code&client_id=#{value(:yandex, :client_id)}"
31
32
  end
33
+
34
+ def vk_oauth_link(oauth_data)
35
+ "https://id.vk.com/authorize?scope=email&response_type=code&client_id=#{value(:vk, :client_id)}&code_challenge=#{oauth_data[:code_challenge]}&code_challenge_method=S256&redirect_uri=#{value(:vk, :redirect_url)}&state=#{oauth_data[:state]}"
36
+ end
32
37
  # rubocop: enable Layout/LineLength
33
38
 
34
39
  def value(provider, key)
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Authkeeper
4
+ module VkAuthApi
5
+ class Client < HttpService::Client
6
+ include Requests::FetchAccessToken
7
+ include Requests::Info
8
+
9
+ BASE_URL = 'https://id.vk.com/'
10
+
11
+ option :url, default: proc { BASE_URL }
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'uri'
4
+
5
+ module Authkeeper
6
+ module VkAuthApi
7
+ module Requests
8
+ module FetchAccessToken
9
+ def fetch_access_token(client_id:, redirect_url:, device_id:, code:, state:, code_verifier:)
10
+ post(
11
+ path: 'oauth2/auth',
12
+ body: URI.encode_www_form({
13
+ grant_type: 'authorization_code',
14
+ client_id: client_id,
15
+ device_id: device_id,
16
+ code: code,
17
+ state: state,
18
+ redirect_uri: redirect_url,
19
+ code_verifier: code_verifier
20
+ }),
21
+ headers: {
22
+ 'Content-Type' => 'application/x-www-form-urlencoded'
23
+ }
24
+ )
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Authkeeper
4
+ module VkAuthApi
5
+ module Requests
6
+ module Info
7
+ def info(access_token:, client_id:)
8
+ post(
9
+ path: 'oauth2/user_info',
10
+ body: {
11
+ access_token: access_token,
12
+ client_id: client_id
13
+ }
14
+ )
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Authkeeper
4
+ module Providers
5
+ class Vk
6
+ include AuthkeeperDeps[
7
+ auth_client: 'api.vk.auth_client'
8
+ ]
9
+
10
+ def call(params: {})
11
+ auth_info = fetch_auth_info(params)
12
+ # {
13
+ # "refresh_token" => "vk2.a.",
14
+ # "access_token" => "vk2.a.",
15
+ # "id_token" => "",
16
+ # "token_type" => "Bearer",
17
+ # "expires_in" => 3600,
18
+ # "user_id" => 176780000,
19
+ # "state" => "ce4a09792e2cc8065a96074906709765",
20
+ # "scope" => "vkid.personal_info email"
21
+ # }
22
+
23
+ user_info = fetch_user_info(auth_info['access_token'])
24
+ # {
25
+ # "user" => {
26
+ # "user_id" => "176780000",
27
+ # "first_name" => "",
28
+ # "last_name" => "",
29
+ # "avatar" => "",
30
+ # "email" => "",
31
+ # "sex" => 2,
32
+ # "verified" => false,
33
+ # "birthday" => "01.01.2000"
34
+ # }
35
+ # }
36
+
37
+ {
38
+ result: {
39
+ auth_info: auth_info.symbolize_keys,
40
+ user_info: {
41
+ uid: user_info.dig('user', 'user_id'),
42
+ provider: 'vk',
43
+ email: user_info.dig('user', 'email'),
44
+ phone_number: "+#{user_info.dig('user', 'phone')}"
45
+ }
46
+ }
47
+ }
48
+ end
49
+
50
+ private
51
+
52
+ def fetch_auth_info(params)
53
+ auth_client.fetch_access_token(
54
+ client_id: omniauth_config[:client_id],
55
+ redirect_url: omniauth_config[:redirect_url],
56
+ device_id: params[:device_id],
57
+ code: params[:code],
58
+ state: params[:state],
59
+ code_verifier: params[:code_verifier]
60
+ )
61
+ end
62
+
63
+ def fetch_user_info(access_token)
64
+ auth_client.info(access_token: access_token, client_id: omniauth_config[:client_id])
65
+ end
66
+
67
+ def omniauth_config
68
+ @omniauth_config ||= Authkeeper.configuration.omniauth_configs[:vk]
69
+ end
70
+ end
71
+ end
72
+ end
@@ -25,12 +25,14 @@ module Authkeeper
25
25
  register('api.google.client') { Authkeeper::GoogleApi::Client.new }
26
26
  register('api.yandex.auth_client') { Authkeeper::YandexAuthApi::Client.new }
27
27
  register('api.yandex.client') { Authkeeper::YandexApi::Client.new }
28
+ register('api.vk.auth_client') { Authkeeper::VkAuthApi::Client.new }
28
29
 
29
30
  register('services.providers.github') { Authkeeper::Providers::Github.new }
30
31
  register('services.providers.gitlab') { Authkeeper::Providers::Gitlab.new }
31
32
  register('services.providers.telegram') { Authkeeper::Providers::Telegram.new }
32
33
  register('services.providers.google') { Authkeeper::Providers::Google.new }
33
34
  register('services.providers.yandex') { Authkeeper::Providers::Yandex.new }
35
+ register('services.providers.vk') { Authkeeper::Providers::Vk.new }
34
36
 
35
37
  register('services.fetch_session') { Authkeeper::FetchSessionService.new }
36
38
  register('services.generate_token') { Authkeeper::GenerateTokenService.new }
@@ -49,6 +49,15 @@ module Authkeeper
49
49
  end
50
50
 
51
51
  def access_token_name = Authkeeper.configuration.access_token_name
52
+
53
+ def sign_in(user)
54
+ user_session = Authkeeper.configuration.user_session_model.constantize.create!(user: user)
55
+ cookies[Authkeeper.configuration.access_token_name] = {
56
+ value: Authkeeper::Container['services.generate_token'].call(user_session: user_session)[:result],
57
+ domain: Authkeeper.configuration.domain,
58
+ expires: 1.week.from_now
59
+ }.compact
60
+ end
52
61
  end
53
62
  end
54
63
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Authkeeper
4
- VERSION = '0.1.1'
4
+ VERSION = '0.1.3'
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.1
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bogdanov Anton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-11-20 00:00:00.000000000 Z
11
+ date: 2024-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -52,6 +52,9 @@ files:
52
52
  - app/lib/authkeeper/google_auth_api/client.rb
53
53
  - app/lib/authkeeper/google_auth_api/requests/fetch_access_token.rb
54
54
  - app/lib/authkeeper/jwt_encoder.rb
55
+ - app/lib/authkeeper/vk_auth_api/client.rb
56
+ - app/lib/authkeeper/vk_auth_api/requests/fetch_access_token.rb
57
+ - app/lib/authkeeper/vk_auth_api/requests/info.rb
55
58
  - app/lib/authkeeper/yandex_api/client.rb
56
59
  - app/lib/authkeeper/yandex_api/requests/info.rb
57
60
  - app/lib/authkeeper/yandex_auth_api/client.rb
@@ -64,6 +67,7 @@ files:
64
67
  - app/services/authkeeper/providers/gitlab.rb
65
68
  - app/services/authkeeper/providers/google.rb
66
69
  - app/services/authkeeper/providers/telegram.rb
70
+ - app/services/authkeeper/providers/vk.rb
67
71
  - app/services/authkeeper/providers/yandex.rb
68
72
  - app/views/layouts/authkeeper/application.html.erb
69
73
  - config/routes.rb