omniauth-tink 0.1.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c40a1ef61226020f93ef63ac000adabe05167f0c
4
+ data.tar.gz: b63e3ac173e528baae4b6089082f587e65543d91
5
+ SHA512:
6
+ metadata.gz: 14f5beaba80f6339c41e36dcfd5f8b3e68ca9506020408c3216654a813534987fd871e1389a83d5beb897dbdb81d03888e996b108e0042d912fd9dcf0d0feec8
7
+ data.tar.gz: 0617dcf9e76daa62f92ffd68771fafec6b48009b72aa49685ee5c7d1694b3076e83b648eba2b571f780df2f10e4048b189a34a56878ed25186eb811e38dfd4e9
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ /pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --colour
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in omniauth-github.gemspec
4
+ gemspec
5
+
6
+ group :development, :test do
7
+ gem 'guard'
8
+ gem 'guard-rspec'
9
+ gem 'guard-bundler'
10
+ gem 'rb-fsevent'
11
+ gem 'growl'
12
+ gem 'rake'
13
+ end
@@ -0,0 +1,10 @@
1
+ guard 'rspec', :version => 2 do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
6
+
7
+ guard 'bundler' do
8
+ watch('Gemfile')
9
+ watch('omniauth-tink.gemspec')
10
+ end
@@ -0,0 +1,13 @@
1
+ # OmniAuth Tink
2
+
3
+ This is the official OmniAuth strategy for authenticating to Rabobank. To
4
+ use it, you'll need to sign up for an OAuth2 Application ID and Secret
5
+ on the [Tink Applications Page](https://docs.tink.se).
6
+
7
+ ## Basic Usage
8
+
9
+ ```ruby
10
+ use OmniAuth::Builder do
11
+ provider :tink, ENV['TINK_KEY'], ENV['TINK_SECRET']
12
+ end
13
+ ```
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+ require 'rspec/core/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new
6
+
7
+ desc 'Run specs'
8
+ task :default => :spec
@@ -0,0 +1,2 @@
1
+ require "omniauth-tink/version"
2
+ require 'omniauth/strategies/tink'
@@ -0,0 +1,5 @@
1
+ module OmniAuth
2
+ module Tink
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -0,0 +1,40 @@
1
+ require 'omniauth-oauth2'
2
+
3
+ module OmniAuth
4
+ module Strategies
5
+ class Tink < OmniAuth::Strategies::OAuth2
6
+ option :client_options, {
7
+ site: "https://api.tink.se/api/v1",
8
+ authorize_url: "https://oauth.tink.se/0.4/authorize",
9
+ token_url: "/oauth/token"
10
+ }
11
+
12
+ uid { raw_info["id"] }
13
+
14
+ info do
15
+ prune!({
16
+ "email" => raw_info["username"]
17
+ })
18
+ end
19
+
20
+ def callback_url
21
+ full_host + script_name + callback_path
22
+ end
23
+
24
+ def raw_info
25
+ @raw_info ||= access_token.get("/user", info_options).parsed || {}
26
+ end
27
+
28
+ private
29
+
30
+ def prune!(hash)
31
+ hash.delete_if do |_, value|
32
+ prune!(value) if value.is_a?(Hash)
33
+ value.nil? || (value.respond_to?(:empty?) && value.empty?)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ OmniAuth.config.add_camelization "tink", "Tink"
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/omniauth-tink/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Dunya Kirkali"]
6
+ gem.email = ["dunyakirkali@gmail.com"]
7
+ gem.description = %q{Official OmniAuth strategy for Tink.}
8
+ gem.summary = %q{Official OmniAuth strategy for Tink.}
9
+ gem.homepage = "https://github.com/ahtung/omniauth-tink"
10
+ gem.license = "MIT"
11
+
12
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
13
+ gem.files = `git ls-files`.split("\n")
14
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
+ gem.name = "omniauth-tink"
16
+ gem.require_paths = ["lib"]
17
+ gem.version = OmniAuth::Tink::VERSION
18
+
19
+ gem.add_dependency 'omniauth', '~> 1.5'
20
+ gem.add_dependency 'omniauth-oauth2', '>= 1.4.0', '< 2.0'
21
+ gem.add_development_dependency 'rspec', '~> 3.5'
22
+ gem.add_development_dependency 'rack-test'
23
+ gem.add_development_dependency 'simplecov'
24
+ gem.add_development_dependency 'webmock'
25
+ end
@@ -0,0 +1,134 @@
1
+ require 'spec_helper'
2
+
3
+ describe OmniAuth::Strategies::Tink do
4
+ let(:access_token) { instance_double('AccessToken', :options => {}) }
5
+ let(:parsed_response) { instance_double('ParsedResponse') }
6
+ let(:response) { instance_double('Response', :parsed => parsed_response) }
7
+
8
+ let(:enterprise_site) { 'https://some.other.site.com/api/v3' }
9
+ let(:enterprise_authorize_url) { 'https://some.other.site.com/login/oauth/authorize' }
10
+ let(:enterprise_token_url) { 'https://some.other.site.com/login/oauth/access_token' }
11
+ let(:enterprise) do
12
+ OmniAuth::Strategies::Tink.new('TINK_KEY', 'TINK_SECRET',
13
+ {
14
+ :client_options => {
15
+ :site => enterprise_site,
16
+ :authorize_url => enterprise_authorize_url,
17
+ :token_url => enterprise_token_url
18
+ }
19
+ }
20
+ )
21
+ end
22
+
23
+ subject do
24
+ OmniAuth::Strategies::Tink.new({})
25
+ end
26
+
27
+ before(:each) do
28
+ allow(subject).to receive(:access_token).and_return(access_token)
29
+ end
30
+
31
+ context 'client options' do
32
+ it 'should have correct site' do
33
+ expect(subject.options.client_options.site).to eq('https://api.tink.se/api/v1')
34
+ end
35
+
36
+ it 'should have correct authorize url' do
37
+ expect(subject.options.client_options.authorize_url).to eq('https://oauth.tink.se/0.4/authorize')
38
+ end
39
+
40
+ it 'should have correct token url' do
41
+ expect(subject.options.client_options.token_url).to eq('/oauth/token')
42
+ end
43
+
44
+ describe 'should be overrideable' do
45
+ it 'for site' do
46
+ expect(enterprise.options.client_options.site).to eq(enterprise_site)
47
+ end
48
+
49
+ it 'for authorize url' do
50
+ expect(enterprise.options.client_options.authorize_url).to eq(enterprise_authorize_url)
51
+ end
52
+
53
+ it 'for token url' do
54
+ expect(enterprise.options.client_options.token_url).to eq(enterprise_token_url)
55
+ end
56
+ end
57
+ end
58
+
59
+ context '#email' do
60
+ it 'should return email from raw_info if available' do
61
+ allow(subject).to receive(:raw_info).and_return({ 'email' => 'you@example.com' })
62
+ expect(subject.email).to eq('you@example.com')
63
+ end
64
+
65
+ it 'should return nil if there is no raw_info and email access is not allowed' do
66
+ allow(subject).to receive(:raw_info).and_return({})
67
+ expect(subject.email).to be_nil
68
+ end
69
+
70
+ it 'should not return the primary email if there is no raw_info and email access is allowed' do
71
+ emails = [
72
+ { 'email' => 'secondary@example.com', 'primary' => false },
73
+ { 'email' => 'primary@example.com', 'primary' => true }
74
+ ]
75
+ allow(subject).to receive(:raw_info).and_return({})
76
+ subject.options['scope'] = 'user'
77
+ allow(subject).to receive(:emails).and_return(emails)
78
+ expect(subject.email).to be_nil
79
+ end
80
+
81
+ it 'should not return the first email if there is no raw_info and email access is allowed' do
82
+ emails = [
83
+ { 'email' => 'first@example.com', 'primary' => false },
84
+ { 'email' => 'second@example.com', 'primary' => false }
85
+ ]
86
+ allow(subject).to receive(:raw_info).and_return({})
87
+ subject.options['scope'] = 'user'
88
+ allow(subject).to receive(:emails).and_return(emails)
89
+ expect(subject.email).to be_nil
90
+ end
91
+ end
92
+
93
+ context '#raw_info' do
94
+ it 'should use relative paths' do
95
+ expect(access_token).to receive(:get).with('user').and_return(response)
96
+ expect(subject.raw_info).to eq(parsed_response)
97
+ end
98
+ end
99
+
100
+ context '#emails' do
101
+ it 'should use relative paths' do
102
+ expect(access_token).to receive(:get).with('user/emails', :headers => {
103
+ 'Accept' => 'application/vnd.github.v3'
104
+ }).and_return(response)
105
+
106
+ subject.options['scope'] = 'user'
107
+ expect(subject.emails).to eq(parsed_response)
108
+ end
109
+ end
110
+
111
+ context '#info.email' do
112
+ it 'should use any available email' do
113
+ allow(subject).to receive(:raw_info).and_return({})
114
+ allow(subject).to receive(:email).and_return('you@example.com')
115
+ expect(subject.info['email']).to eq('you@example.com')
116
+ end
117
+ end
118
+
119
+ context '#info.urls' do
120
+ it 'should use html_url from raw_info' do
121
+ allow(subject).to receive(:raw_info).and_return({ 'login' => 'me', 'html_url' => 'http://enterprise/me' })
122
+ expect(subject.info['urls']['GitHub']).to eq('http://enterprise/me')
123
+ end
124
+ end
125
+
126
+ describe '#callback_url' do
127
+ it 'is a combination of host, script name, and callback path' do
128
+ allow(subject).to receive(:full_host).and_return('https://example.com')
129
+ allow(subject).to receive(:script_name).and_return('/sub_uri')
130
+
131
+ expect(subject.callback_url).to eq('https://example.com/sub_uri/auth/tink/callback')
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,15 @@
1
+ $:.unshift File.expand_path('..', __FILE__)
2
+ $:.unshift File.expand_path('../../lib', __FILE__)
3
+ require 'simplecov'
4
+ SimpleCov.start
5
+ require 'rspec'
6
+ require 'rack/test'
7
+ require 'webmock/rspec'
8
+ require 'omniauth'
9
+ require 'omniauth-tink'
10
+
11
+ RSpec.configure do |config|
12
+ config.include WebMock::API
13
+ config.include Rack::Test::Methods
14
+ config.extend OmniAuth::Test::StrategyMacros, :type => :strategy
15
+ end
metadata ADDED
@@ -0,0 +1,148 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: omniauth-tink
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Dunya Kirkali
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-09-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: omniauth
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.5'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: omniauth-oauth2
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.4.0
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: '2.0'
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 1.4.0
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: '2.0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '3.5'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.5'
61
+ - !ruby/object:Gem::Dependency
62
+ name: rack-test
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: simplecov
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: webmock
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ description: Official OmniAuth strategy for Tink.
104
+ email:
105
+ - dunyakirkali@gmail.com
106
+ executables: []
107
+ extensions: []
108
+ extra_rdoc_files: []
109
+ files:
110
+ - ".gitignore"
111
+ - ".rspec"
112
+ - Gemfile
113
+ - Guardfile
114
+ - README.md
115
+ - Rakefile
116
+ - lib/omniauth-tink.rb
117
+ - lib/omniauth-tink/version.rb
118
+ - lib/omniauth/strategies/tink.rb
119
+ - omniauth-tink.gemspec
120
+ - spec/omniauth/strategies/tink_spec.rb
121
+ - spec/spec_helper.rb
122
+ homepage: https://github.com/ahtung/omniauth-tink
123
+ licenses:
124
+ - MIT
125
+ metadata: {}
126
+ post_install_message:
127
+ rdoc_options: []
128
+ require_paths:
129
+ - lib
130
+ required_ruby_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ required_rubygems_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ requirements: []
141
+ rubyforge_project:
142
+ rubygems_version: 2.5.1
143
+ signing_key:
144
+ specification_version: 4
145
+ summary: Official OmniAuth strategy for Tink.
146
+ test_files:
147
+ - spec/omniauth/strategies/tink_spec.rb
148
+ - spec/spec_helper.rb