diff --git a/CHANGELOG.md b/CHANGELOG.md index 392f639b..11033d1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ * Add facebook user_info_path option to initializer.rb [#63](https://github.com/Sorcery/sorcery/pull/63) * Add new function: `build_from` (allows building a user instance from OAuth without saving) [#54](https://github.com/Sorcery/sorcery/pull/54) * Add rubocop configuration and TODO list [#107](https://github.com/Sorcery/sorcery/pull/107) +* Add support for VK OAuth (thanks to @Hirurg103) [#109](https://github.com/Sorcery/sorcery/pull/109) ## 0.11.0 diff --git a/lib/generators/sorcery/templates/initializer.rb b/lib/generators/sorcery/templates/initializer.rb index 36df69de..947902fe 100644 --- a/lib/generators/sorcery/templates/initializer.rb +++ b/lib/generators/sorcery/templates/initializer.rb @@ -154,6 +154,7 @@ # config.vk.secret = "" # config.vk.callback_url = "http://0.0.0.0:3000/oauth/callback?provider=vk" # config.vk.user_info_mapping = {:login => "domain", :name => "full_name"} + # config.vk.api_version = "5.71" # # config.slack.callback_url = "http://0.0.0.0:3000/oauth/callback?provider=slack" # config.slack.key = '' diff --git a/lib/sorcery/providers/vk.rb b/lib/sorcery/providers/vk.rb index 3e7fbcbc..82edf6f4 100644 --- a/lib/sorcery/providers/vk.rb +++ b/lib/sorcery/providers/vk.rb @@ -9,7 +9,7 @@ module Providers class Vk < Base include Protocols::Oauth2 - attr_accessor :auth_path, :token_path, :user_info_url, :scope + attr_accessor :auth_path, :token_path, :user_info_url, :scope, :api_version def initialize super @@ -28,7 +28,8 @@ def get_user_hash(access_token) access_token: access_token.token, uids: access_token.params['user_id'], fields: user_info_mapping.values.join(','), - scope: scope + scope: scope, + v: api_version.to_s } response = access_token.get(user_info_url, params: params) diff --git a/sorcery.gemspec b/sorcery.gemspec index ee3bbfb3..6a1a8dab 100644 --- a/sorcery.gemspec +++ b/sorcery.gemspec @@ -30,4 +30,5 @@ Gem::Specification.new do |s| s.add_development_dependency 'rspec-rails', '~> 3.5.0' s.add_development_dependency 'test-unit', '~> 3.1.0' s.add_development_dependency 'byebug', '~> 9.0.0' + s.add_development_dependency 'webmock', '~> 3.3.0' end diff --git a/spec/providers/vk_spec.rb b/spec/providers/vk_spec.rb new file mode 100644 index 00000000..0a885a16 --- /dev/null +++ b/spec/providers/vk_spec.rb @@ -0,0 +1,41 @@ +require 'spec_helper' +require 'sorcery/providers/base' +require 'sorcery/providers/vk' +require 'webmock/rspec' + +describe Sorcery::Providers::Vk do + include WebMock::API + + let(:provider) { Sorcery::Controller::Config.vk } + + before(:all) do + sorcery_reload!([:external]) + sorcery_controller_property_set(:external_providers, [:vk]) + sorcery_controller_external_property_set(:vk, :key, "KEY") + sorcery_controller_external_property_set(:vk, :secret, "SECRET") + end + + def stub_vk_authorize + stub_request(:post, /https\:\/\/oauth\.vk\.com\/access_token/) + .to_return( + status: 200, + body: '{"access_token":"TOKEN","expires_in":86329,"user_id":1}', + headers: {'content-type' => 'application/json'}) + end + + context "getting user info hash" do + it "should provide VK API version" do + stub_vk_authorize + sorcery_controller_external_property_set(:vk, :api_version, '5.71') + + get_user = stub_request(:get, "https://api.vk.com/method/getProfiles?access_token=TOKEN&fields=&scope=email&uids=1&v=5.71") + .to_return(body: '{"response":[{"id":1}]}') + + token = provider.process_callback({ code: 'CODE' }, nil) + provider.get_user_hash(token) + + expect(get_user).to have_been_requested + end + end + +end