omniauth-fishbrain 0.9.0 → 0.11.3

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: 18b08b84c82f3c10704e309debd002b2a05bfba8c3f9392028325339fdab0f61
4
- data.tar.gz: fc941f8c41c630491831e79f828f07621be3e1fc80ca91a7f7fe93f64cad926a
3
+ metadata.gz: 815a9d4e769ec9b9d05bb7cd0314395df844c3190b148960403207030b4b5cfc
4
+ data.tar.gz: 29f2f2cde590788567aedfbb85ff569943f77a8068a3d78590a35876e2d762f6
5
5
  SHA512:
6
- metadata.gz: 1ad8cff223e86137c99d924b0bdd8cf2146393738419b13163d2ae5dd69b3678967e71ce96f9cd8422b77080eaf6186edd9c1064ab9c4870e8d99dca5ff31848
7
- data.tar.gz: cc450625016d5ee861732382fdf868ec42c4291f453358729f1d28c530978bd0d5bffd6e41a9e35b8c0b8fedade712a902c1f96ab4f06423f1f81c7f9a16e99d
6
+ metadata.gz: 174826683c500756bc406c58e0bca176d9e43ded8eb65eaf4c445981e702dd6de42cf43a8e0a86bc64a29ba8b5d4ca621e9f6ccaf6524904b5acdef8054c3552
7
+ data.tar.gz: c93625fad9bcc3ce07f51191992cc89cee90eef27b2593003ae807141a285c0ae963a40902bfdf2dbd006325af0c22edd75d63745782155d07432542a2788376
@@ -0,0 +1,55 @@
1
+ # OmniAuth Fishbrain
2
+
3
+ ![](https://github.com/omniauth/omniauth-github/workflows/Ruby/badge.svg?branch=master)
4
+
5
+ This gem provides two OmniAuth strategies for Fishbrain.
6
+
7
+ 1. The `fishbrain` strategy is a standard OmniAuth OAuth2 strategy.
8
+ 2. The `fishbrain_id` strategy is intended for sharing identities between
9
+ services.
10
+
11
+ ## Installation
12
+
13
+ ```ruby
14
+ gem 'omniauth-fishbrain'
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ In production environments:
20
+
21
+ ```ruby
22
+ use OmniAuth::Builder do
23
+ provider :fishbrain, ENV['FISHBRAIN_CLIENT_ID'], ENV['FISHBRAIN_CLIENT_SECRET']
24
+ provider :fishbrain_id
25
+ end
26
+ ```
27
+
28
+ In development/test/staging environments:
29
+
30
+ ```ruby
31
+ use OmniAuth::Builder do
32
+ provider :fishbrain, ENV['FISHBRAIN_CLIENT_ID'], ENV['FISHBRAIN_CLIENT_SECRET'],
33
+ user_pool_id: 'eu-west-1_WlBhbuD6e',
34
+ client_options: {
35
+ site: 'https://accounts-staging.fishbrain.com',
36
+ }
37
+ provider :fishbrain_id, user_pool_id: 'eu-west-1_WlBhbuD6e'
38
+ end
39
+ ```
40
+
41
+ `path_prefix` is supported too:
42
+
43
+ ```ruby
44
+ use OmniAuth::Builder do
45
+ ...
46
+
47
+ configure { |c| c.path_prefix = '/client/auth' }
48
+ end
49
+ ```
50
+
51
+ See [`/examples`](examples) for full example using Sinatra.
52
+
53
+ ## License
54
+
55
+ [MIT](LICENSE)
@@ -1,3 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'omniauth/fishbrain'
3
+ require 'omniauth-fishbrain/version'
4
+ require 'omniauth/strategies/fishbrain'
5
+ require 'omniauth/strategies/fishbrain_id'
@@ -2,6 +2,6 @@
2
2
 
3
3
  module OmniAuth
4
4
  module Fishbrain
5
- VERSION = '0.9.0'
5
+ VERSION = '0.11.3'
6
6
  end
7
7
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
5
+ module OmniAuth
6
+ module Fishbrain
7
+ module PremiumStatus
8
+ def premium_status
9
+ return {} unless id_token['premium_status']
10
+
11
+ JSON.parse(id_token['premium_status'])
12
+ rescue JSON::ParserError
13
+ {}
14
+ end
15
+
16
+ def premium?
17
+ Time.xmlschema(premium_status['end_date']) > Time.new.utc
18
+ rescue ArgumentError
19
+ false
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'net/http'
4
+ require 'jwt'
5
+
6
+ module OmniAuth
7
+ module Fishbrain
8
+ module VerifiesIdToken
9
+ def id_token
10
+ @_id_token ||= if raw_id_token&.strip&.empty?
11
+ {}
12
+ else
13
+ JWT.decode(raw_id_token, nil, true, decode_options).first
14
+ end
15
+ end
16
+
17
+ def decode_options
18
+ {
19
+ iss: iss,
20
+ aud: options[:client_id],
21
+ verify_aud: true,
22
+ verify_expiration: true,
23
+ verify_iat: true,
24
+ verify_iss: true,
25
+ verify_not_before: true,
26
+ leeway: options[:jwt_leeway],
27
+ algorithm: 'RS256',
28
+ jwks: jwks,
29
+ }
30
+ end
31
+
32
+ def iss
33
+ "https://cognito-idp.#{options[:aws_region]}.amazonaws.com/#{options[:user_pool_id]}"
34
+ end
35
+
36
+ def jwks
37
+ @_jwks ||= \
38
+ "#{iss}/.well-known/jwks.json"
39
+ .yield_self(&URI.method(:parse))
40
+ .yield_self(&Net::HTTP.method(:get))
41
+ .yield_self { |it| JSON.parse(it, symbolize_names: true) }
42
+ end
43
+ end
44
+ end
45
+ end
@@ -1,84 +1,64 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'omniauth-oauth2'
4
- require 'jwt'
4
+ require 'omniauth/fishbrain/verifies_id_token'
5
+ require 'omniauth/fishbrain/premium_status'
5
6
 
6
7
  module OmniAuth
7
8
  module Strategies
8
- # OmniAuth Strategy for Fishbrain
9
9
  class Fishbrain < OmniAuth::Strategies::OAuth2
10
+ include OmniAuth::Fishbrain::VerifiesIdToken
11
+ include OmniAuth::Fishbrain::PremiumStatus
12
+
10
13
  option :name, 'fishbrain'
11
- option :client_options,
12
- site: 'https://accounts.fishbrain.com',
13
- authorize_url: '/oauth2/authorize',
14
- token_url: '/oauth2/token',
15
- auth_scheme: :basic_auth
14
+ option :client_options, site: 'https://accounts.fishbrain.com',
15
+ authorize_url: '/oauth2/authorize',
16
+ token_url: '/oauth2/token',
17
+ auth_scheme: :basic_auth
16
18
  option :scope, 'email openid profile'
17
- option :jwt_leeway, 60
18
- option :user_pool_id, 'eu-west-1_5r0WbR8OH'
19
+ option :user_pool_id, 'eu-west-1_TKWveIcYu'
19
20
  option :aws_region, 'eu-west-1'
21
+ option :jwt_leeway, 60
20
22
 
21
23
  uid do
22
- parsed_id_token['sub'] if parsed_id_token
24
+ id_token['sub']
23
25
  end
24
26
 
25
27
  info do
26
- if parsed_id_token
27
- {
28
- name: parsed_id_token['name'],
29
- email: parsed_id_token['email'],
30
- phone: parsed_id_token['phone_number']
31
- }
32
- end
28
+ {
29
+ given_name: id_token['given_name'],
30
+ email: id_token['email'],
31
+ phone: id_token['phone_number'],
32
+ }
33
33
  end
34
34
 
35
35
  credentials do
36
- { token: access_token.token }.tap do |hash|
37
- hash[:refresh_token] = access_token.refresh_token if access_token.expires? && access_token.refresh_token
38
- hash[:expires_at] = access_token.expires_at if access_token.expires?
39
- hash[:expires] = access_token.expires?
40
- hash[:id_token] = id_token if id_token
36
+ hash = { token: access_token.token }
37
+ if access_token.expires?
38
+ hash[:refresh_token] = access_token.refresh_token if access_token.refresh_token
39
+ hash[:expires_at] = access_token.expires_at
41
40
  end
41
+ hash[:expires] = access_token.expires?
42
+ hash[:id_token] = access_token['id_token'] if access_token['id_token']
43
+ hash
42
44
  end
43
45
 
44
46
  extra do
45
- { raw_info: parsed_id_token.reject { |key| %w[iss aud exp iat token_use nbf].include?(key) } }
47
+ {
48
+ raw_info: id_token.reject { |key| %w[iss aud exp iat token_use].include?(key) },
49
+ premium_status: premium_status,
50
+ is_premium: premium?,
51
+ }
46
52
  end
47
53
 
48
54
  private
49
55
 
50
- # Override this method to remove the query string from the callback_url because Cognito
51
- # requires an exact match
52
- def build_access_token
53
- client.auth_code.get_token(
54
- request.params['code'],
55
- { redirect_uri: callback_url.split('?').first }.merge(token_params.to_hash(symbolize_keys: true)),
56
- deep_symbolize(options.auth_token_params)
57
- )
56
+ def callback_url
57
+ full_host + script_name + callback_path
58
58
  end
59
59
 
60
- def id_token
61
- access_token && access_token['id_token']
62
- end
63
-
64
- def parsed_id_token
65
- return nil unless id_token
66
-
67
- @parsed_id_token ||= JWT.decode(
68
- id_token,
69
- nil,
70
- false,
71
- verify_iss: options[:aws_region] && options[:user_pool_id],
72
- iss: "https://cognito-idp.#{options[:aws_region]}.amazonaws.com/#{options[:user_pool_id]}",
73
- verify_aud: true,
74
- aud: options[:client_id],
75
- verify_sub: true,
76
- verify_expiration: true,
77
- verify_not_before: true,
78
- verify_iat: true,
79
- verify_jti: false,
80
- leeway: options[:jwt_leeway]
81
- ).first
60
+ def raw_id_token
61
+ access_token['id_token']
82
62
  end
83
63
  end
84
64
  end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal:true
2
+
3
+ require 'omniauth/fishbrain/verifies_id_token'
4
+ require 'omniauth/fishbrain/premium_status'
5
+
6
+ module OmniAuth
7
+ module Strategies
8
+ class FishbrainId
9
+ include OmniAuth::Strategy
10
+ include OmniAuth::Fishbrain::VerifiesIdToken
11
+ include OmniAuth::Fishbrain::PremiumStatus
12
+
13
+ option :name, 'fishbrain_id'
14
+ option :user_pool_id, 'eu-west-1_TKWveIcYu'
15
+ option :client_id, nil
16
+ option :aws_region, 'eu-west-1'
17
+ option :jwt_leeway, 60
18
+
19
+ uid do
20
+ id_token['sub']
21
+ end
22
+
23
+ info do
24
+ {
25
+ given_name: id_token['given_name'],
26
+ email: id_token['email'],
27
+ phone: id_token['phone_number'],
28
+ }
29
+ end
30
+
31
+ extra do
32
+ {
33
+ raw_info: id_token.reject { |key| %w[iss aud exp iat token_use].include?(key) },
34
+ premium_status: premium_status,
35
+ is_premium: premium?,
36
+ }
37
+ end
38
+
39
+ def callback_phase
40
+ if id_token.empty?
41
+ fail! :missing_id_token
42
+ else
43
+ super
44
+ end
45
+ rescue JWT::ExpiredSignature
46
+ fail! :invalid_id_token
47
+ end
48
+
49
+ def request_phase
50
+ redirect callback_url
51
+ end
52
+
53
+ private
54
+
55
+ def raw_id_token
56
+ request.params['id_token']
57
+ end
58
+ end
59
+ end
60
+ end
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omniauth-fishbrain
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.11.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Erik Dalen
8
+ - Fishbrain AB
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2020-02-10 00:00:00.000000000 Z
12
+ date: 2020-05-28 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: jwt
@@ -38,27 +39,22 @@ dependencies:
38
39
  - - "~>"
39
40
  - !ruby/object:Gem::Version
40
41
  version: '1.6'
41
- description: A Fishbrain strategy for OmniAuth 1.x. This allows you to login to Fishbrain
42
- with your ruby app.
42
+ description:
43
43
  email:
44
44
  - erik.dalen@fishbrain.com
45
+ - developer@fishbrain.com
45
46
  executables: []
46
47
  extensions: []
47
48
  extra_rdoc_files: []
48
49
  files:
49
- - ".gitignore"
50
50
  - LICENSE
51
- - README.md
52
- - examples/sinatra/Gemfile
53
- - examples/sinatra/fishbrain_example.rb
54
- - examples/sinatra/views/auth_failure.haml
55
- - examples/sinatra/views/callback.haml
56
- - examples/sinatra/views/index.haml
51
+ - README.markdown
57
52
  - lib/omniauth-fishbrain.rb
58
- - lib/omniauth/fishbrain.rb
59
- - lib/omniauth/fishbrain/version.rb
53
+ - lib/omniauth-fishbrain/version.rb
54
+ - lib/omniauth/fishbrain/premium_status.rb
55
+ - lib/omniauth/fishbrain/verifies_id_token.rb
60
56
  - lib/omniauth/strategies/fishbrain.rb
61
- - omniauth-fishbrain.gemspec
57
+ - lib/omniauth/strategies/fishbrain_id.rb
62
58
  homepage: https://github.com/fishbrain/omniauth-fishbrain
63
59
  licenses:
64
60
  - MIT
@@ -71,16 +67,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
71
67
  requirements:
72
68
  - - ">="
73
69
  - !ruby/object:Gem::Version
74
- version: '2.2'
70
+ version: '0'
75
71
  required_rubygems_version: !ruby/object:Gem::Requirement
76
72
  requirements:
77
73
  - - ">="
78
74
  - !ruby/object:Gem::Version
79
75
  version: '0'
80
76
  requirements: []
81
- rubyforge_project:
82
- rubygems_version: 2.7.6
77
+ rubygems_version: 3.1.2
83
78
  signing_key:
84
79
  specification_version: 4
85
- summary: A Fishbrain strategy for OmniAuth 1.x
80
+ summary: OmniAuth strategy for Fishbrain
86
81
  test_files: []
data/.gitignore DELETED
@@ -1,56 +0,0 @@
1
- *.gem
2
- *.rbc
3
- /.config
4
- /coverage/
5
- /InstalledFiles
6
- /pkg/
7
- /spec/reports/
8
- /spec/examples.txt
9
- /test/tmp/
10
- /test/version_tmp/
11
- /tmp/
12
-
13
- # Used by dotenv library to load environment variables.
14
- # .env
15
-
16
- # Ignore Byebug command history file.
17
- .byebug_history
18
-
19
- ## Specific to RubyMotion:
20
- .dat*
21
- .repl_history
22
- build/
23
- *.bridgesupport
24
- build-iPhoneOS/
25
- build-iPhoneSimulator/
26
-
27
- ## Specific to RubyMotion (use of CocoaPods):
28
- #
29
- # We recommend against adding the Pods directory to your .gitignore. However
30
- # you should judge for yourself, the pros and cons are mentioned at:
31
- # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
32
- #
33
- # vendor/Pods/
34
-
35
- ## Documentation cache and generated files:
36
- /.yardoc/
37
- /_yardoc/
38
- /doc/
39
- /rdoc/
40
-
41
- ## Environment normalization:
42
- /.bundle/
43
- /vendor/bundle
44
- /lib/bundler/man/
45
-
46
- # for a library or gem, you might want to ignore these files since the code is
47
- # intended to run in multiple environments; otherwise, check them in:
48
- # Gemfile.lock
49
- # .ruby-version
50
- # .ruby-gemset
51
-
52
- # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
53
- .rvmrc
54
-
55
- # Used by RuboCop. Remote config files pulled in from inherit_from directive.
56
- # .rubocop-https?--*
data/README.md DELETED
@@ -1,25 +0,0 @@
1
- # omniauth-fishbrain
2
-
3
- OmniAuth strategy for authenticating with Fishbrain
4
-
5
- ## Installation
6
-
7
- Add to your `Gemfile`:
8
-
9
- ```ruby
10
- gem 'omniauth-google-oauth2'
11
- ```
12
-
13
- Then `bundle install`.
14
-
15
- ## Usage
16
-
17
- Add something like the following to add the fishbrain authentication stategy.
18
-
19
- ```
20
- use OmniAuth::Builder do
21
- provider :fishbrain, ENV.fetch('FISHBRAIN_CLIENT_ID'), ENV.fetch('FISHBRAIN_CLIENT_SECRET')
22
- end
23
- ```
24
-
25
- See `/examples` for a full example using Sinatra & Omniauth.
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source 'https://rubygems.org'
4
-
5
- git_source(:github) {|repo_name| 'https://github.com/#{repo_name}' }
6
-
7
- gem 'sinatra'
8
- gem 'omniauth'
9
- gem 'haml'
10
- gem 'omniauth-fishbrain'
@@ -1,34 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- require 'sinatra/base'
5
- require 'omniauth'
6
- require 'omniauth-fishbrain'
7
- require 'pp'
8
-
9
- # Example Sinatra+Omniauth+Fishbrain app
10
- class FishbrainExample < Sinatra::Application
11
- configure do
12
- set :sessions, true
13
- set :haml, format: :html5
14
- end
15
- use OmniAuth::Builder do
16
- provider :fishbrain,
17
- ENV.fetch('FISHBRAIN_CLIENT_ID'),
18
- ENV.fetch('FISHBRAIN_CLIENT_SECRET')
19
- end
20
-
21
- get '/' do
22
- haml :index
23
- end
24
-
25
- get '/auth/failure' do
26
- haml :auth_failure
27
- end
28
-
29
- get '/auth/:provider/callback' do
30
- haml :callback
31
- end
32
-
33
- run! if app_file == $PROGRAM_NAME
34
- end
@@ -1,10 +0,0 @@
1
- !!!
2
- %html
3
- %head
4
- %title
5
- Cognito auth example
6
- %body
7
- %h1
8
- Authentication failure
9
-
10
- %pre= params['message']
@@ -1,9 +0,0 @@
1
- !!!
2
- %html
3
- %head
4
- %title
5
- Cognito auth example
6
- %body
7
- %h1= params[:provider]
8
-
9
- %pre= request.env['omniauth.auth'].pretty_inspect
@@ -1,14 +0,0 @@
1
- !!!
2
- %html
3
- %head
4
- %title
5
- Cognito auth example
6
- %body
7
- %h1
8
- Welcome
9
-
10
- %a{ href: "/auth/fishbrain" }
11
- Log in with Fishbrain
12
-
13
- %a{ href: "/auth/cognito-idp" }
14
- Log in with Cognito
@@ -1,3 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'omniauth/strategies/fishbrain'
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require File.expand_path(
4
- File.join('..', 'lib', 'omniauth', 'fishbrain', 'version'),
5
- __FILE__
6
- )
7
-
8
- Gem::Specification.new do |gem|
9
- gem.name = 'omniauth-fishbrain'
10
- gem.version = OmniAuth::Fishbrain::VERSION
11
- gem.license = 'MIT'
12
- gem.summary = %(A Fishbrain strategy for OmniAuth 1.x)
13
- gem.description = %(A Fishbrain strategy for OmniAuth 1.x. This allows you to login to Fishbrain with your ruby app.)
14
- gem.authors = ['Erik Dalen']
15
- gem.email = ['erik.dalen@fishbrain.com']
16
- gem.homepage = 'https://github.com/fishbrain/omniauth-fishbrain'
17
-
18
- gem.files = `git ls-files`.split("\n")
19
- gem.require_paths = ['lib']
20
-
21
- gem.required_ruby_version = '>= 2.2'
22
-
23
- gem.add_runtime_dependency 'jwt', '~> 2.0'
24
- gem.add_runtime_dependency 'omniauth-oauth2', '~> 1.6'
25
- end