From 86f1be2e5a08d649136577bd6c2fb350f4a59999 Mon Sep 17 00:00:00 2001 From: Yaqzan Ali Date: Mon, 11 May 2020 09:44:07 -0400 Subject: [PATCH 01/16] implemented basic profile v2 --- lib/omniauth/strategies/linkedin.rb | 42 ++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/lib/omniauth/strategies/linkedin.rb b/lib/omniauth/strategies/linkedin.rb index ecff8a5..fae15da 100755 --- a/lib/omniauth/strategies/linkedin.rb +++ b/lib/omniauth/strategies/linkedin.rb @@ -6,13 +6,22 @@ class LinkedIn < OmniAuth::Strategies::OAuth2 option :name, 'linkedin' option :client_options, { - :site => 'https://api.linkedin.com', - :authorize_url => 'https://www.linkedin.com/oauth/v2/authorization?response_type=code', - :token_url => 'https://www.linkedin.com/oauth/v2/accessToken' + site: 'https://api.linkedin.com', + authorize_url: 'https://www.linkedin.com/oauth/v2/authorization?response_type=code', + token_url: 'https://www.linkedin.com/oauth/v2/accessToken' } - option :scope, 'r_liteprofile r_emailaddress' - option :fields, ['id', 'first-name', 'last-name', 'picture-url', 'email-address'] + option :scope, 'r_basicprofile r_emailaddress' + option :fields, %w[ + id + first-name + last-name + picture-url + email-address + vanity-name + maiden-name + headline + ] uid do raw_info['id'] @@ -20,10 +29,14 @@ class LinkedIn < OmniAuth::Strategies::OAuth2 info do { - :email => email_address, - :first_name => localized_field('firstName'), - :last_name => localized_field('lastName'), - :picture_url => picture_url + email: email_address, + first_name: localized_field('firstName'), + last_name: localized_field('lastName'), + vanity_name: raw_info['vanityName'], + maiden_name: localized_field('maidenName'), + headline: localized_field('headline'), + picture_url: picture_url, + profile_url: profile_url } end @@ -81,7 +94,10 @@ def fields_mapping 'id' => 'id', 'first-name' => 'firstName', 'last-name' => 'lastName', - 'picture-url' => 'profilePicture(displayImage~:playableStreams)' + 'picture-url' => 'profilePicture(displayImage~:playableStreams)', + 'vanity-name' => 'vanityName', + 'maiden-name' => 'maidenName', + 'headline' => 'headline' } end @@ -112,6 +128,12 @@ def picture_url picture_references.last['identifiers'].first['identifier'] end + def profile_url + return nil if raw_info['vanityName'].nil? + + "www.linkedin.com/in/{raw_info['vanityName']}" + end + def picture_available? raw_info['profilePicture'] && raw_info['profilePicture']['displayImage~'] && From 3aa8cccdc2be6539cc69f72b06267b18247bc56d Mon Sep 17 00:00:00 2001 From: Yaqzan Ali Date: Mon, 11 May 2020 09:57:01 -0400 Subject: [PATCH 02/16] properly parsed string --- lib/omniauth/strategies/linkedin.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/omniauth/strategies/linkedin.rb b/lib/omniauth/strategies/linkedin.rb index fae15da..e235957 100755 --- a/lib/omniauth/strategies/linkedin.rb +++ b/lib/omniauth/strategies/linkedin.rb @@ -131,7 +131,7 @@ def picture_url def profile_url return nil if raw_info['vanityName'].nil? - "www.linkedin.com/in/{raw_info['vanityName']}" + "www.linkedin.com/in/#{raw_info['vanityName']}" end def picture_available? From 38c400f2297cad5313b24aa0e78a3c3f76e83593 Mon Sep 17 00:00:00 2001 From: Yaqzan Ali Date: Mon, 11 May 2020 10:03:16 -0400 Subject: [PATCH 03/16] removed profile_url as we are handling this on client side --- lib/omniauth/strategies/linkedin.rb | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/lib/omniauth/strategies/linkedin.rb b/lib/omniauth/strategies/linkedin.rb index e235957..0b62362 100755 --- a/lib/omniauth/strategies/linkedin.rb +++ b/lib/omniauth/strategies/linkedin.rb @@ -35,8 +35,7 @@ class LinkedIn < OmniAuth::Strategies::OAuth2 vanity_name: raw_info['vanityName'], maiden_name: localized_field('maidenName'), headline: localized_field('headline'), - picture_url: picture_url, - profile_url: profile_url + picture_url: picture_url } end @@ -128,12 +127,6 @@ def picture_url picture_references.last['identifiers'].first['identifier'] end - def profile_url - return nil if raw_info['vanityName'].nil? - - "www.linkedin.com/in/#{raw_info['vanityName']}" - end - def picture_available? raw_info['profilePicture'] && raw_info['profilePicture']['displayImage~'] && From a22a3087ca0e1a4ac3e47b0701b7d6297d2ab552 Mon Sep 17 00:00:00 2001 From: Yaqzan Ali Date: Thu, 21 May 2020 14:15:33 -0400 Subject: [PATCH 04/16] created a subclass instead --- lib/omniauth/strategies/linkedin_basic.rb | 46 +++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 lib/omniauth/strategies/linkedin_basic.rb diff --git a/lib/omniauth/strategies/linkedin_basic.rb b/lib/omniauth/strategies/linkedin_basic.rb new file mode 100644 index 0000000..0af9fc6 --- /dev/null +++ b/lib/omniauth/strategies/linkedin_basic.rb @@ -0,0 +1,46 @@ +require 'omniauth-oauth2' + +module OmniAuth + module Strategies + class LinkedInBasic < LinkedIn + option :scope, 'r_basicprofile r_emailaddress' + + option :fields, %w[ + id + first-name + last-name + picture-url + email-address + vanity-name + maiden-name + headline + ] + + info do + { + email: email_address, + first_name: localized_field('firstName'), + last_name: localized_field('lastName'), + vanity_name: raw_info['vanityName'], + maiden_name: localized_field('maidenName'), + headline: localized_field('headline'), + picture_url: picture_url + } + end + + private + + def fields_mapping + { + 'id' => 'id', + 'first-name' => 'firstName', + 'last-name' => 'lastName', + 'picture-url' => 'profilePicture(displayImage~:playableStreams)', + 'vanity-name' => 'vanityName', + 'maiden-name' => 'maidenName', + 'headline' => 'headline' + } + end + end + end +end From 9d78960a3e88fc8bf0637d6586e1050294129381 Mon Sep 17 00:00:00 2001 From: Yaqzan Ali Date: Thu, 21 May 2020 14:15:58 -0400 Subject: [PATCH 05/16] reverted parent class --- lib/omniauth/strategies/linkedin.rb | 35 +++++++++-------------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/lib/omniauth/strategies/linkedin.rb b/lib/omniauth/strategies/linkedin.rb index 0b62362..ecff8a5 100755 --- a/lib/omniauth/strategies/linkedin.rb +++ b/lib/omniauth/strategies/linkedin.rb @@ -6,22 +6,13 @@ class LinkedIn < OmniAuth::Strategies::OAuth2 option :name, 'linkedin' option :client_options, { - site: 'https://api.linkedin.com', - authorize_url: 'https://www.linkedin.com/oauth/v2/authorization?response_type=code', - token_url: 'https://www.linkedin.com/oauth/v2/accessToken' + :site => 'https://api.linkedin.com', + :authorize_url => 'https://www.linkedin.com/oauth/v2/authorization?response_type=code', + :token_url => 'https://www.linkedin.com/oauth/v2/accessToken' } - option :scope, 'r_basicprofile r_emailaddress' - option :fields, %w[ - id - first-name - last-name - picture-url - email-address - vanity-name - maiden-name - headline - ] + option :scope, 'r_liteprofile r_emailaddress' + option :fields, ['id', 'first-name', 'last-name', 'picture-url', 'email-address'] uid do raw_info['id'] @@ -29,13 +20,10 @@ class LinkedIn < OmniAuth::Strategies::OAuth2 info do { - email: email_address, - first_name: localized_field('firstName'), - last_name: localized_field('lastName'), - vanity_name: raw_info['vanityName'], - maiden_name: localized_field('maidenName'), - headline: localized_field('headline'), - picture_url: picture_url + :email => email_address, + :first_name => localized_field('firstName'), + :last_name => localized_field('lastName'), + :picture_url => picture_url } end @@ -93,10 +81,7 @@ def fields_mapping 'id' => 'id', 'first-name' => 'firstName', 'last-name' => 'lastName', - 'picture-url' => 'profilePicture(displayImage~:playableStreams)', - 'vanity-name' => 'vanityName', - 'maiden-name' => 'maidenName', - 'headline' => 'headline' + 'picture-url' => 'profilePicture(displayImage~:playableStreams)' } end From fb357a952c3ef8f6e6044bdcb5611082347f06bb Mon Sep 17 00:00:00 2001 From: Yaqzan Ali Date: Thu, 21 May 2020 14:37:17 -0400 Subject: [PATCH 06/16] change hashes so theyre compatible with pas ruby versions --- lib/omniauth/strategies/linkedin_basic.rb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/omniauth/strategies/linkedin_basic.rb b/lib/omniauth/strategies/linkedin_basic.rb index 0af9fc6..57122b6 100644 --- a/lib/omniauth/strategies/linkedin_basic.rb +++ b/lib/omniauth/strategies/linkedin_basic.rb @@ -18,13 +18,13 @@ class LinkedInBasic < LinkedIn info do { - email: email_address, - first_name: localized_field('firstName'), - last_name: localized_field('lastName'), - vanity_name: raw_info['vanityName'], - maiden_name: localized_field('maidenName'), - headline: localized_field('headline'), - picture_url: picture_url + :email => email_address, + :first_name => localized_field('firstName'), + :last_name => localized_field('lastName'), + :vanity_name => raw_info['vanityName'], + :maiden_name => localized_field('maidenName'), + :headline => localized_field('headline'), + :picture_url => picture_url } end From 795a717116ebc6791348f3eb753ee8c6024bd812 Mon Sep 17 00:00:00 2001 From: Yaqzan Ali Date: Thu, 21 May 2020 14:56:55 -0400 Subject: [PATCH 07/16] change the option name as well --- lib/omniauth/strategies/linkedin_basic.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/omniauth/strategies/linkedin_basic.rb b/lib/omniauth/strategies/linkedin_basic.rb index 57122b6..6071285 100644 --- a/lib/omniauth/strategies/linkedin_basic.rb +++ b/lib/omniauth/strategies/linkedin_basic.rb @@ -3,6 +3,8 @@ module OmniAuth module Strategies class LinkedInBasic < LinkedIn + option :name, 'linkedinbasic' + option :scope, 'r_basicprofile r_emailaddress' option :fields, %w[ From e8b41878d9b3e05a7fc3f3f38d2813f6362b888f Mon Sep 17 00:00:00 2001 From: Yaqzan Ali Date: Thu, 21 May 2020 15:37:31 -0400 Subject: [PATCH 08/16] add strategy class --- lib/omniauth/strategies/linkedin_basic.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/omniauth/strategies/linkedin_basic.rb b/lib/omniauth/strategies/linkedin_basic.rb index 6071285..a7a1daf 100644 --- a/lib/omniauth/strategies/linkedin_basic.rb +++ b/lib/omniauth/strategies/linkedin_basic.rb @@ -3,7 +3,7 @@ module OmniAuth module Strategies class LinkedInBasic < LinkedIn - option :name, 'linkedinbasic' + option :name, 'linkedin_basic' option :scope, 'r_basicprofile r_emailaddress' From 8e7e9392584a4ceaed741936aa136742efe13302 Mon Sep 17 00:00:00 2001 From: Yaqzan Ali Date: Thu, 21 May 2020 16:30:52 -0400 Subject: [PATCH 09/16] added requirements so it loads the new linkedin basic configuration --- lib/omniauth-linkedin-oauth2.rb | 1 + lib/omniauth/strategies/linkedin_basic.rb | 2 ++ 2 files changed, 3 insertions(+) diff --git a/lib/omniauth-linkedin-oauth2.rb b/lib/omniauth-linkedin-oauth2.rb index 3f5d3dd..5a47a27 100644 --- a/lib/omniauth-linkedin-oauth2.rb +++ b/lib/omniauth-linkedin-oauth2.rb @@ -1,2 +1,3 @@ require "omniauth-linkedin-oauth2/version" require "omniauth/strategies/linkedin" +require "omniauth/strategies/linkedin_basic" diff --git a/lib/omniauth/strategies/linkedin_basic.rb b/lib/omniauth/strategies/linkedin_basic.rb index a7a1daf..b78c7a2 100644 --- a/lib/omniauth/strategies/linkedin_basic.rb +++ b/lib/omniauth/strategies/linkedin_basic.rb @@ -46,3 +46,5 @@ def fields_mapping end end end + +OmniAuth.config.add_camelization 'linkedin_basic', 'LinkedInBasic' From 809902cb29d0dc39ec8164c620705465b5148f0c Mon Sep 17 00:00:00 2001 From: Yaqzan Ali Date: Fri, 22 May 2020 09:30:32 -0400 Subject: [PATCH 10/16] specs --- .../strategies/linkedin_basic_spec.rb | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100755 spec/omniauth/strategies/linkedin_basic_spec.rb diff --git a/spec/omniauth/strategies/linkedin_basic_spec.rb b/spec/omniauth/strategies/linkedin_basic_spec.rb new file mode 100755 index 0000000..d1fc97e --- /dev/null +++ b/spec/omniauth/strategies/linkedin_basic_spec.rb @@ -0,0 +1,112 @@ +require 'spec_helper' +require 'omniauth-linkedin-oauth2' + +describe OmniAuth::Strategies::LinkedInBasic do + subject { OmniAuth::Strategies::LinkedInBasic.new(nil) } + + it 'adds camelization for itself' do + expect(OmniAuth::Utils.camelize('linkedin_basic')).to eq('LinkedInBasic') + end + + describe '#client' do + it 'has correct LinkedIn site' do + expect(subject.client.site).to eq('https://api.linkedin.com') + end + + it 'has correct `authorize_url`' do + expect(subject.client.options[:authorize_url]).to eq('https://www.linkedin.com/oauth/v2/authorization?response_type=code') + end + + it 'has correct `token_url`' do + expect(subject.client.options[:token_url]).to eq('https://www.linkedin.com/oauth/v2/accessToken') + end + end + + describe '#callback_path' do + it 'has the correct callback path' do + expect(subject.callback_path).to eq('/auth/linkedin_basic/callback') + end + end + + describe '#uid' do + before :each do + allow(subject).to receive(:raw_info) { Hash['id' => 'uid'] } + end + + it 'returns the id from raw_info' do + expect(subject.uid).to eq('uid') + end + end + + describe '#info / #raw_info' do + let(:access_token) { instance_double OAuth2::AccessToken } + + let(:parsed_response) { Hash[:foo => 'bar'] } + + let(:profile_endpoint) { "/v2/me?projection=(id,firstName,lastName,profilePicture(displayImage~:playableStreams),vanityName,maidenName,headline)" } + let(:email_address_endpoint) { '/v2/emailAddress?q=members&projection=(elements*(handle~))' } + + let(:email_address_response) { instance_double OAuth2::Response, parsed: parsed_response } + let(:profile_response) { instance_double OAuth2::Response, parsed: parsed_response } + + before :each do + allow(subject).to receive(:access_token).and_return access_token + + allow(access_token).to receive(:get) + .with(email_address_endpoint) + .and_return(email_address_response) + + allow(access_token).to receive(:get) + .with(profile_endpoint) + .and_return(profile_response) + end + + it 'returns parsed responses using access token' do + expect(subject.info).to have_key :email + expect(subject.info).to have_key :first_name + expect(subject.info).to have_key :last_name + expect(subject.info).to have_key :picture_url + + expect(subject.raw_info).to eq({ :foo => 'bar' }) + end + end + + describe '#extra' do + let(:raw_info) { Hash[:foo => 'bar'] } + + before :each do + allow(subject).to receive(:raw_info).and_return raw_info + end + + specify { expect(subject.extra['raw_info']).to eq raw_info } + end + + describe '#access_token' do + let(:expires_in) { 3600 } + let(:expires_at) { 946688400 } + let(:token) { 'token' } + let(:access_token) do + instance_double OAuth2::AccessToken, :expires_in => expires_in, + :expires_at => expires_at, :token => token + end + + before :each do + allow(subject).to receive(:oauth2_access_token).and_return access_token + end + + specify { expect(subject.access_token.expires_in).to eq expires_in } + specify { expect(subject.access_token.expires_at).to eq expires_at } + end + + describe '#authorize_params' do + describe 'scope' do + before :each do + allow(subject).to receive(:session).and_return({}) + end + + it 'sets default scope' do + expect(subject.authorize_params['scope']).to eq('r_basicprofile r_emailaddress') + end + end + end +end From b68a006837efcd03b3e109d8681f5932d419300f Mon Sep 17 00:00:00 2001 From: Yaqzan Ali Date: Fri, 22 May 2020 09:31:26 -0400 Subject: [PATCH 11/16] single quotes --- spec/omniauth/strategies/linkedin_basic_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/omniauth/strategies/linkedin_basic_spec.rb b/spec/omniauth/strategies/linkedin_basic_spec.rb index d1fc97e..e5c3f6c 100755 --- a/spec/omniauth/strategies/linkedin_basic_spec.rb +++ b/spec/omniauth/strategies/linkedin_basic_spec.rb @@ -43,7 +43,7 @@ let(:parsed_response) { Hash[:foo => 'bar'] } - let(:profile_endpoint) { "/v2/me?projection=(id,firstName,lastName,profilePicture(displayImage~:playableStreams),vanityName,maidenName,headline)" } + let(:profile_endpoint) { '/v2/me?projection=(id,firstName,lastName,profilePicture(displayImage~:playableStreams),vanityName,maidenName,headline)' } let(:email_address_endpoint) { '/v2/emailAddress?q=members&projection=(elements*(handle~))' } let(:email_address_response) { instance_double OAuth2::Response, parsed: parsed_response } From 3fe4a54e471e9d3c06bd9538000548565ae31983 Mon Sep 17 00:00:00 2001 From: Yaqzan Ali Date: Tue, 26 May 2020 13:38:26 -0400 Subject: [PATCH 12/16] changed name --- lib/omniauth/strategies/linkedin_basic.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/omniauth/strategies/linkedin_basic.rb b/lib/omniauth/strategies/linkedin_basic.rb index b78c7a2..2c98514 100644 --- a/lib/omniauth/strategies/linkedin_basic.rb +++ b/lib/omniauth/strategies/linkedin_basic.rb @@ -3,7 +3,7 @@ module OmniAuth module Strategies class LinkedInBasic < LinkedIn - option :name, 'linkedin_basic' + option :name, 'linkedin' option :scope, 'r_basicprofile r_emailaddress' From 25813d716e5bbbaaaa901683fc6d3d9dab9d3c32 Mon Sep 17 00:00:00 2001 From: Yaqzan Ali Date: Tue, 26 May 2020 13:39:10 -0400 Subject: [PATCH 13/16] changed name --- lib/omniauth/strategies/linkedin_basic.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/omniauth/strategies/linkedin_basic.rb b/lib/omniauth/strategies/linkedin_basic.rb index b78c7a2..2c98514 100644 --- a/lib/omniauth/strategies/linkedin_basic.rb +++ b/lib/omniauth/strategies/linkedin_basic.rb @@ -3,7 +3,7 @@ module OmniAuth module Strategies class LinkedInBasic < LinkedIn - option :name, 'linkedin_basic' + option :name, 'linkedin' option :scope, 'r_basicprofile r_emailaddress' From 828ec89e0bba186b115924d7ebca60cafbbea8a8 Mon Sep 17 00:00:00 2001 From: Yaqzan Ali Date: Mon, 8 Jun 2020 15:58:17 -0400 Subject: [PATCH 14/16] init for allowing oauth mocking --- lib/omniauth-linkedin-oauth2.rb | 1 - lib/omniauth/strategies/linkedin.rb | 29 +++-- lib/omniauth/strategies/linkedin_basic.rb | 50 -------- .../strategies/linkedin_basic_spec.rb | 112 ------------------ spec/omniauth/strategies/linkedin_spec.rb | 32 ++++- 5 files changed, 48 insertions(+), 176 deletions(-) delete mode 100644 lib/omniauth/strategies/linkedin_basic.rb delete mode 100755 spec/omniauth/strategies/linkedin_basic_spec.rb diff --git a/lib/omniauth-linkedin-oauth2.rb b/lib/omniauth-linkedin-oauth2.rb index 5a47a27..3f5d3dd 100644 --- a/lib/omniauth-linkedin-oauth2.rb +++ b/lib/omniauth-linkedin-oauth2.rb @@ -1,3 +1,2 @@ require "omniauth-linkedin-oauth2/version" require "omniauth/strategies/linkedin" -require "omniauth/strategies/linkedin_basic" diff --git a/lib/omniauth/strategies/linkedin.rb b/lib/omniauth/strategies/linkedin.rb index ecff8a5..820e38a 100755 --- a/lib/omniauth/strategies/linkedin.rb +++ b/lib/omniauth/strategies/linkedin.rb @@ -19,12 +19,7 @@ class LinkedIn < OmniAuth::Strategies::OAuth2 end info do - { - :email => email_address, - :first_name => localized_field('firstName'), - :last_name => localized_field('lastName'), - :picture_url => picture_url - } + scope.include?('r_basicprofile') ? lite_info.merge(basic_info) : lite_info end extra do @@ -52,6 +47,23 @@ def raw_info private + def lite_info + { + :email => email_address, + :first_name => localized_field('firstName'), + :last_name => localized_field('lastName'), + :picture_url => picture_url + } + end + + def basic_info + { + :vanity_name => raw_info['vanityName'], + :maiden_name => localized_field('maidenName'), + :headline => localized_field('headline') + } + end + def email_address if options.fields.include? 'email-address' fetch_email_address @@ -81,7 +93,10 @@ def fields_mapping 'id' => 'id', 'first-name' => 'firstName', 'last-name' => 'lastName', - 'picture-url' => 'profilePicture(displayImage~:playableStreams)' + 'picture-url' => 'profilePicture(displayImage~:playableStreams)', + 'vanity-name' => 'vanityName', + 'maiden-name' => 'maidenName', + 'headline' => 'headline' } end diff --git a/lib/omniauth/strategies/linkedin_basic.rb b/lib/omniauth/strategies/linkedin_basic.rb deleted file mode 100644 index 2c98514..0000000 --- a/lib/omniauth/strategies/linkedin_basic.rb +++ /dev/null @@ -1,50 +0,0 @@ -require 'omniauth-oauth2' - -module OmniAuth - module Strategies - class LinkedInBasic < LinkedIn - option :name, 'linkedin' - - option :scope, 'r_basicprofile r_emailaddress' - - option :fields, %w[ - id - first-name - last-name - picture-url - email-address - vanity-name - maiden-name - headline - ] - - info do - { - :email => email_address, - :first_name => localized_field('firstName'), - :last_name => localized_field('lastName'), - :vanity_name => raw_info['vanityName'], - :maiden_name => localized_field('maidenName'), - :headline => localized_field('headline'), - :picture_url => picture_url - } - end - - private - - def fields_mapping - { - 'id' => 'id', - 'first-name' => 'firstName', - 'last-name' => 'lastName', - 'picture-url' => 'profilePicture(displayImage~:playableStreams)', - 'vanity-name' => 'vanityName', - 'maiden-name' => 'maidenName', - 'headline' => 'headline' - } - end - end - end -end - -OmniAuth.config.add_camelization 'linkedin_basic', 'LinkedInBasic' diff --git a/spec/omniauth/strategies/linkedin_basic_spec.rb b/spec/omniauth/strategies/linkedin_basic_spec.rb deleted file mode 100755 index e5c3f6c..0000000 --- a/spec/omniauth/strategies/linkedin_basic_spec.rb +++ /dev/null @@ -1,112 +0,0 @@ -require 'spec_helper' -require 'omniauth-linkedin-oauth2' - -describe OmniAuth::Strategies::LinkedInBasic do - subject { OmniAuth::Strategies::LinkedInBasic.new(nil) } - - it 'adds camelization for itself' do - expect(OmniAuth::Utils.camelize('linkedin_basic')).to eq('LinkedInBasic') - end - - describe '#client' do - it 'has correct LinkedIn site' do - expect(subject.client.site).to eq('https://api.linkedin.com') - end - - it 'has correct `authorize_url`' do - expect(subject.client.options[:authorize_url]).to eq('https://www.linkedin.com/oauth/v2/authorization?response_type=code') - end - - it 'has correct `token_url`' do - expect(subject.client.options[:token_url]).to eq('https://www.linkedin.com/oauth/v2/accessToken') - end - end - - describe '#callback_path' do - it 'has the correct callback path' do - expect(subject.callback_path).to eq('/auth/linkedin_basic/callback') - end - end - - describe '#uid' do - before :each do - allow(subject).to receive(:raw_info) { Hash['id' => 'uid'] } - end - - it 'returns the id from raw_info' do - expect(subject.uid).to eq('uid') - end - end - - describe '#info / #raw_info' do - let(:access_token) { instance_double OAuth2::AccessToken } - - let(:parsed_response) { Hash[:foo => 'bar'] } - - let(:profile_endpoint) { '/v2/me?projection=(id,firstName,lastName,profilePicture(displayImage~:playableStreams),vanityName,maidenName,headline)' } - let(:email_address_endpoint) { '/v2/emailAddress?q=members&projection=(elements*(handle~))' } - - let(:email_address_response) { instance_double OAuth2::Response, parsed: parsed_response } - let(:profile_response) { instance_double OAuth2::Response, parsed: parsed_response } - - before :each do - allow(subject).to receive(:access_token).and_return access_token - - allow(access_token).to receive(:get) - .with(email_address_endpoint) - .and_return(email_address_response) - - allow(access_token).to receive(:get) - .with(profile_endpoint) - .and_return(profile_response) - end - - it 'returns parsed responses using access token' do - expect(subject.info).to have_key :email - expect(subject.info).to have_key :first_name - expect(subject.info).to have_key :last_name - expect(subject.info).to have_key :picture_url - - expect(subject.raw_info).to eq({ :foo => 'bar' }) - end - end - - describe '#extra' do - let(:raw_info) { Hash[:foo => 'bar'] } - - before :each do - allow(subject).to receive(:raw_info).and_return raw_info - end - - specify { expect(subject.extra['raw_info']).to eq raw_info } - end - - describe '#access_token' do - let(:expires_in) { 3600 } - let(:expires_at) { 946688400 } - let(:token) { 'token' } - let(:access_token) do - instance_double OAuth2::AccessToken, :expires_in => expires_in, - :expires_at => expires_at, :token => token - end - - before :each do - allow(subject).to receive(:oauth2_access_token).and_return access_token - end - - specify { expect(subject.access_token.expires_in).to eq expires_in } - specify { expect(subject.access_token.expires_at).to eq expires_at } - end - - describe '#authorize_params' do - describe 'scope' do - before :each do - allow(subject).to receive(:session).and_return({}) - end - - it 'sets default scope' do - expect(subject.authorize_params['scope']).to eq('r_basicprofile r_emailaddress') - end - end - end -end diff --git a/spec/omniauth/strategies/linkedin_spec.rb b/spec/omniauth/strategies/linkedin_spec.rb index 02765af..16b4e17 100755 --- a/spec/omniauth/strategies/linkedin_spec.rb +++ b/spec/omniauth/strategies/linkedin_spec.rb @@ -39,6 +39,7 @@ end describe '#info / #raw_info' do + let(:access_token) { instance_double OAuth2::AccessToken } let(:parsed_response) { Hash[:foo => 'bar'] } @@ -61,13 +62,32 @@ .and_return(profile_response) end - it 'returns parsed responses using access token' do - expect(subject.info).to have_key :email - expect(subject.info).to have_key :first_name - expect(subject.info).to have_key :last_name - expect(subject.info).to have_key :picture_url + context 'lite_profile' do + it 'returns parsed responses using access token' do + expect(subject.info).to have_key :email + expect(subject.info).to have_key :first_name + expect(subject.info).to have_key :last_name + expect(subject.info).to have_key :picture_url + + expect(subject.raw_info).to eq({ :foo => 'bar' }) + end + end - expect(subject.raw_info).to eq({ :foo => 'bar' }) + context 'basic_profile' do + subject { OmniAuth::Strategies::LinkedIn.new(scope: ['r_emailaddress r_basicprofile']) } + let(:profile_endpoint) { '/v2/me?projection=(id,firstName,lastName,profilePicture(displayImage~:playableStreams),vanityName,maidenName,headline)' } + + it 'returns parsed responses using access token' do + expect(subject.info).to have_key :email + expect(subject.info).to have_key :first_name + expect(subject.info).to have_key :last_name + expect(subject.info).to have_key :picture_url + expect(subject.info).to have_key :vanity_name + expect(subject.info).to have_key :maiden_name + expect(subject.info).to have_key :headline + + expect(subject.raw_info).to eq({ :foo => 'bar' }) + end end end From 3e206d2e6c6769c78435247dadcc80f001ca969f Mon Sep 17 00:00:00 2001 From: Yaqzan Ali Date: Mon, 8 Jun 2020 16:25:40 -0400 Subject: [PATCH 15/16] fixed --- spec/omniauth/strategies/linkedin_spec.rb | 25 ++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/spec/omniauth/strategies/linkedin_spec.rb b/spec/omniauth/strategies/linkedin_spec.rb index 16b4e17..206ce9d 100755 --- a/spec/omniauth/strategies/linkedin_spec.rb +++ b/spec/omniauth/strategies/linkedin_spec.rb @@ -64,6 +64,7 @@ context 'lite_profile' do it 'returns parsed responses using access token' do + expect(subject.options.scope).to eq('r_liteprofile r_emailaddress') expect(subject.info).to have_key :email expect(subject.info).to have_key :first_name expect(subject.info).to have_key :last_name @@ -74,10 +75,28 @@ end context 'basic_profile' do - subject { OmniAuth::Strategies::LinkedIn.new(scope: ['r_emailaddress r_basicprofile']) } - let(:profile_endpoint) { '/v2/me?projection=(id,firstName,lastName,profilePicture(displayImage~:playableStreams),vanityName,maidenName,headline)' } + subject do + OmniAuth::Strategies::LinkedIn.new( + nil, + scope: 'r_basicprofile r_emailaddress', + fields: [ + 'id', + 'first-name', + 'last-name', + 'headline', + 'picture-url', + 'profile-url', + 'email-address', + 'vanity-name', + 'maiden-name' + ] + ) + end + + let(:profile_endpoint) { '/v2/me?projection=(id,firstName,lastName,headline,profilePicture(displayImage~:playableStreams),vanityName,maidenName)' } it 'returns parsed responses using access token' do + expect(subject.options.scope).to eq('r_basicprofile r_emailaddress') expect(subject.info).to have_key :email expect(subject.info).to have_key :first_name expect(subject.info).to have_key :last_name @@ -86,7 +105,7 @@ expect(subject.info).to have_key :maiden_name expect(subject.info).to have_key :headline - expect(subject.raw_info).to eq({ :foo => 'bar' }) + expect(subject.raw_info).to eq(:foo => 'bar') end end end From d102cbfacd35da863c75248108bc024589106fb6 Mon Sep 17 00:00:00 2001 From: Yaqzan Ali Date: Mon, 8 Jun 2020 16:32:45 -0400 Subject: [PATCH 16/16] option.scope --- lib/omniauth/strategies/linkedin.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/omniauth/strategies/linkedin.rb b/lib/omniauth/strategies/linkedin.rb index 820e38a..aecc5b5 100755 --- a/lib/omniauth/strategies/linkedin.rb +++ b/lib/omniauth/strategies/linkedin.rb @@ -19,7 +19,7 @@ class LinkedIn < OmniAuth::Strategies::OAuth2 end info do - scope.include?('r_basicprofile') ? lite_info.merge(basic_info) : lite_info + options.scope.include?('r_basicprofile') ? lite_info.merge(basic_info) : lite_info end extra do