From c4d840ecb35fb45acbe32c64eb5589c0fb44bb26 Mon Sep 17 00:00:00 2001 From: Dzmitry Date: Tue, 6 Feb 2018 19:44:31 +0300 Subject: [PATCH 1/6] Add required version parameter when requesting user information from vk provider [fix #108] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Seems like now vk provider requires v (version) parameter to be present when calling their API: ``` curl -XGET https://api.vk.com/method/getProfiles\?user_id\=1 => {"error":{"error_code":8,"error_msg":"Invalid request: v (version) is required","request_params":[{"key":"oauth","value":"1"},{"key":"method","value":"getProfiles"},{"key":"user_id","value":"1"}]}} curl -XGET https://api.vk.com/method/getProfiles\?user_id\=1\&v\=5.71 {"response":[{"id":1,"first_name":"Павел","last_name":"Дуров"}]} ``` --- lib/sorcery/providers/vk.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/sorcery/providers/vk.rb b/lib/sorcery/providers/vk.rb index 3e7fbcbc..b3b836c6 100644 --- a/lib/sorcery/providers/vk.rb +++ b/lib/sorcery/providers/vk.rb @@ -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: '5.71' } response = access_token.get(user_info_url, params: params) From 596093d791beff1551777f670c0ffdf08f7b2903 Mon Sep 17 00:00:00 2001 From: Dzmitry Date: Wed, 7 Feb 2018 13:01:03 +0300 Subject: [PATCH 2/6] Developer can specify vk API version in sorcery config [#108] --- lib/sorcery/providers/vk.rb | 4 ++-- sorcery.gemspec | 1 + spec/providers/vk_spec.rb | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 spec/providers/vk_spec.rb diff --git a/lib/sorcery/providers/vk.rb b/lib/sorcery/providers/vk.rb index b3b836c6..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 @@ -29,7 +29,7 @@ def get_user_hash(access_token) uids: access_token.params['user_id'], fields: user_info_mapping.values.join(','), scope: scope, - v: '5.71' + 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..7a7ef1d0 --- /dev/null +++ b/spec/providers/vk_spec.rb @@ -0,0 +1,37 @@ +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 + + context "getting user info hash" do + it "should provide VK API version" do + sorcery_controller_external_property_set(:vk, :api_version, '5.71') + 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'}) + 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 From ef8bbc5a7dc3f08b3634fcf8f2cea5eb704d2183 Mon Sep 17 00:00:00 2001 From: Dzmitry Date: Wed, 7 Feb 2018 13:05:23 +0300 Subject: [PATCH 3/6] Fix indentation --- spec/providers/vk_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/providers/vk_spec.rb b/spec/providers/vk_spec.rb index 7a7ef1d0..9cad8f2a 100644 --- a/spec/providers/vk_spec.rb +++ b/spec/providers/vk_spec.rb @@ -23,9 +23,9 @@ status: 200, body: '{"access_token":"TOKEN","expires_in":86329,"user_id":1}', headers: {'content-type' => 'application/json'}) - 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}]}') + 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) From 72a9306b6d094e7f9fb0bc61efe7621b91bb14a7 Mon Sep 17 00:00:00 2001 From: Dzmitry Date: Wed, 7 Feb 2018 13:07:12 +0300 Subject: [PATCH 4/6] Extract authorize with vk request stub into a method --- spec/providers/vk_spec.rb | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/spec/providers/vk_spec.rb b/spec/providers/vk_spec.rb index 9cad8f2a..0a885a16 100644 --- a/spec/providers/vk_spec.rb +++ b/spec/providers/vk_spec.rb @@ -15,14 +15,18 @@ 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') - 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'}) 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}]}') From 9332b3b8d0654359f6817eed1b602961aeb5b1ac Mon Sep 17 00:00:00 2001 From: Dzmitry Date: Wed, 7 Feb 2018 20:25:21 +0300 Subject: [PATCH 5/6] Add VK api version to the sorcery initializer template [#108] --- lib/generators/sorcery/templates/initializer.rb | 1 + 1 file changed, 1 insertion(+) 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 = '' From cd0723928a64dbd12d5f0a64b9432a0beda70c19 Mon Sep 17 00:00:00 2001 From: Joshua Buker Date: Fri, 23 Feb 2018 07:11:33 -0800 Subject: [PATCH 6/6] Update changelog.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54e4c3b4..583c860e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ * Add configuration for token randomness [#67](https://github.com/Sorcery/sorcery/pull/67) * 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 support for VK OAuth (thanks to @Hirurg103) [#109](https://github.com/Sorcery/sorcery/pull/109) ## 0.11.0