authkeeper 0.1.2 → 0.1.4

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: b1ad0732c58c2aea200daefc4fa356863cd200bec250dacb6daa04d0185ff51f
4
- data.tar.gz: 4045f3010b507092e6afab4ebe7e1b46a68f0b63adcf3910e18ddffcb68f2b86
3
+ metadata.gz: 780d37ca518a657c6988521b2ded293eba9caf428f624f8e4b8f38d4e10daaf3
4
+ data.tar.gz: f5a8b4aa60061ed901472f5d8d996c27c22909175107d9967b495c5b851ca200
5
5
  SHA512:
6
- metadata.gz: c9c24eb314938054584b1e2c9e1e84fd24fb9738150d737b3e567caf992fc30ed911d28446874002444236f916917505bf790d6a522094a53f5e34f84f8d678f
7
- data.tar.gz: a1430eedecc606ba84cbc78aeb719fe3af468abac86a5637d307f694597b5c3b38ace2dc7b1a8f680dc2ca3e57a524d4b01bbdfac6f1167207fae466393a97e5
6
+ metadata.gz: 7e50531638b9dde0429275524fb1f57b7108374dc8a4a6c5574a510640ff0623451ab9124fef1a178d11418d839c73412433ac031ff84ffe8cd2ce8e3cf353db
7
+ data.tar.gz: 4049c78bf133b9a40ba4184460b0306aa8536dc31f7b136031739cf17a275d28df361fd8cfb8f2f50aa8327daa01b8eb62f473d40cff6c719666f5fd26b9afa5
@@ -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,7 +50,12 @@ 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]
55
+ end
56
+
57
+ def oauth_data
58
+ Rails.cache.read("oauth_data_#{params[:state]}") || {}
53
59
  end
54
60
 
55
61
  def provider_service(provider)
@@ -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
@@ -3,17 +3,20 @@
3
3
  require 'uri'
4
4
 
5
5
  module Authkeeper
6
- module YandexAuthApi
6
+ module VkAuthApi
7
7
  module Requests
8
8
  module FetchAccessToken
9
- def fetch_access_token(client_id:, client_secret:, code:)
9
+ def fetch_access_token(client_id:, redirect_url:, device_id:, code:, state:, code_verifier:)
10
10
  post(
11
- path: 'token',
11
+ path: 'oauth2/auth',
12
12
  body: URI.encode_www_form({
13
13
  grant_type: 'authorization_code',
14
14
  client_id: client_id,
15
- client_secret: client_secret,
16
- code: code
15
+ device_id: device_id,
16
+ code: code,
17
+ state: state,
18
+ redirect_uri: redirect_url,
19
+ code_verifier: code_verifier
17
20
  }),
18
21
  headers: {
19
22
  'Content-Type' => 'application/x-www-form-urlencoded'
@@ -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
@@ -3,7 +3,7 @@
3
3
  module Authkeeper
4
4
  module YandexAuthApi
5
5
  class Client < HttpService::Client
6
- include Requests::FetchAccessToken
6
+ include Requests::AccessToken
7
7
 
8
8
  BASE_URL = 'https://oauth.yandex.ru/'
9
9
 
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'uri'
4
+ require 'base64'
5
+
6
+ module Authkeeper
7
+ module YandexAuthApi
8
+ module Requests
9
+ module AccessToken
10
+ def fetch_access_token(client_id:, client_secret:, code:)
11
+ post(
12
+ path: 'token',
13
+ body: URI.encode_www_form({
14
+ grant_type: 'authorization_code',
15
+ client_id: client_id,
16
+ client_secret: client_secret,
17
+ code: code
18
+ }),
19
+ headers: {
20
+ 'Content-Type' => 'application/x-www-form-urlencoded'
21
+ }
22
+ )
23
+ end
24
+
25
+ def refresh_access_token(client_id:, client_secret:, refresh_token:)
26
+ post(
27
+ path: 'token',
28
+ body: URI.encode_www_form({
29
+ grant_type: 'refresh_token',
30
+ refresh_token: refresh_token
31
+ }),
32
+ headers: {
33
+ 'Content-Type' => 'application/x-www-form-urlencoded',
34
+ 'Authorization' => "Basic #{authorization(client_id, client_secret)}"
35
+ }
36
+ )
37
+ end
38
+
39
+ private
40
+
41
+ def authorization(client_id, client_secret)
42
+ Base64.encode64("#{client_id}:#{client_secret}").gsub("\n", '')
43
+ end
44
+ end
45
+ end
46
+ end
47
+ 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 }
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Authkeeper
4
- VERSION = '0.1.2'
4
+ VERSION = '0.1.4'
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.2
4
+ version: 0.1.4
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-27 00:00:00.000000000 Z
11
+ date: 2024-12-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -52,10 +52,13 @@ 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
58
- - app/lib/authkeeper/yandex_auth_api/requests/fetch_access_token.rb
61
+ - app/lib/authkeeper/yandex_auth_api/requests/access_token.rb
59
62
  - app/mailers/authkeeper/application_mailer.rb
60
63
  - app/models/authkeeper/application_record.rb
61
64
  - app/services/authkeeper/fetch_session_service.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