omniauth-apple 0.0.3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of omniauth-apple might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9209606bc989d401e7a3b4df233f14b0d126a25a8e5fa4aaf39e52bdc86f8518
4
- data.tar.gz: 863dbd6c01b45573d5e2fba5fc84078bff8415a265c4e99098495d49737b4bb2
3
+ metadata.gz: 41d5662d5a5e982f5c81c143ea79beb20fcfaab848ec2c6bcfacb5b9495d3046
4
+ data.tar.gz: 6b7c3a2463cbc7587a782689cb515a5dbf046290033ec48ba06fc50025a98847
5
5
  SHA512:
6
- metadata.gz: ec26c40908a1c669daa5adb25d985ce9d583466544e35094d0dc81089a3fe973bc71f1182cdbbe83614aa426de3a99560f28691d3f35b9641969d8c824b28511
7
- data.tar.gz: b51d3b1ea9738f76cdc383cb5a616fe71b4d1e0a3acb72f16145e5c1d71556d0b0082d6b724a3c9c82c8ab28e8c3711c4489772a00b897941896a881e7d82aaa
6
+ metadata.gz: d14394af75cb4d4b0dc144a2b6bdae4937da6e82244e41c0ba8ee2aa2b11a1643de51e3021bde630f9d0a21a6ae452ffbe8ca229637f882ffd958cf771196b7e
7
+ data.tar.gz: 64774e5e62eb203c01e3a080f76e02463e64526722e6d036155d4b89ecf2ba2e80453320c5f128cf16192f263ce840e98121f0bd581c13d5ecf707968cb491b0
@@ -0,0 +1,26 @@
1
+ name: RSpec
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ pull_request:
8
+
9
+ jobs:
10
+ build:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ fail-fast: false
14
+ matrix:
15
+ ruby: ['2.5', '2.6', '2.7']
16
+ steps:
17
+ - uses: actions/checkout@v2
18
+ - name: Set up Ruby ${{ matrix.ruby }}
19
+ uses: actions/setup-ruby@v1
20
+ with:
21
+ ruby-version: ${{ matrix.ruby }}
22
+ - name: Build and test with Rake on Ruby ${{ matrix.ruby }}
23
+ run: |
24
+ gem install bundler
25
+ bundle install --jobs 4 --retry 3
26
+ bundle exec rake spec
@@ -0,0 +1,35 @@
1
+ ## [Unreleased]
2
+
3
+ ## [1.0.0] - 2020-06-26
4
+
5
+ ### Added
6
+
7
+ - [#26](https://github.com/nhosoya/omniauth-apple/pull/26) Support ID Token verification
8
+ - [#40](https://github.com/nhosoya/omniauth-apple/pull/40) Add rspec test cases
9
+ - [#42](https://github.com/nhosoya/omniauth-apple/pull/42) [#43](https://github.com/nhosoya/omniauth-apple/pull/43) Setup CI
10
+
11
+
12
+ ### Fixed
13
+
14
+ - [#31](https://github.com/nhosoya/omniauth-apple/pull/31) Stop relying on ActiveSupport
15
+ - [#37](https://github.com/nhosoya/omniauth-apple/pull/37) Fix nonce validation
16
+ - [#41](https://github.com/nhosoya/omniauth-apple/pull/41) Fix where the RoR extension is used
17
+ - [#46](https://github.com/nhosoya/omniauth-apple/pull/46) Fix naming of Omniauth module to OmniAuth
18
+ - [#48](https://github.com/nhosoya/omniauth-apple/pull/48) Remove .rakeTasks
19
+
20
+
21
+ ### Changed
22
+
23
+ - [#27](https://github.com/nhosoya/omniauth-apple/pull/27) Update development dependency
24
+ - [#28](https://github.com/nhosoya/omniauth-apple/pull/28) Update README.md
25
+ - [#38](https://github.com/nhosoya/omniauth-apple/pull/38) Refine AuthHash
26
+ - [#39](https://github.com/nhosoya/omniauth-apple/pull/39) Set the default scope to 'email name'
27
+
28
+ ## [0.0.3] - 2020-05-15
29
+
30
+ ## [0.0.2] - 2020-01-16
31
+
32
+ ## [0.0.1] - 2019-06-07
33
+
34
+ [Unreleased]: https://github.com/nhosoya/omniauth-apple/compare/v1.0.0...master
35
+ [1.0.0]: https://github.com/nhosoya/omniauth-apple/compare/v0.0.3...v1.0.0
data/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ ![build](https://github.com/nhosoya/omniauth-apple/workflows/RSpec/badge.svg?branch=master&event=push)
2
+
1
3
  # OmniAuth::Apple
2
4
 
3
5
  OmniAuth strategy for [Sign In with Apple](https://developer.apple.com/sign-in-with-apple/).
@@ -7,7 +9,7 @@ OmniAuth strategy for [Sign In with Apple](https://developer.apple.com/sign-in-w
7
9
  Add this line to your application's Gemfile:
8
10
 
9
11
  ```ruby
10
- gem 'omniauth-apple', github: 'nhosoya/omniauth-apple', branch: 'master'
12
+ gem 'omniauth-apple'
11
13
  ```
12
14
 
13
15
  And then execute:
data/Rakefile CHANGED
@@ -1,2 +1,6 @@
1
1
  require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new
5
+
2
6
  task :default => :spec
@@ -1,5 +1,5 @@
1
- module Omniauth
1
+ module OmniAuth
2
2
  module Apple
3
- VERSION = "0.0.3"
3
+ VERSION = "1.0.0"
4
4
  end
5
5
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'omniauth-oauth2'
4
+ require 'net/https'
4
5
 
5
6
  module OmniAuth
6
7
  module Strategies
@@ -12,57 +13,94 @@ module OmniAuth
12
13
  authorize_url: '/auth/authorize',
13
14
  token_url: '/auth/token'
14
15
  option :authorize_params,
15
- response_mode: 'form_post'
16
+ response_mode: 'form_post',
17
+ scope: 'email name'
16
18
  option :authorized_client_ids, []
17
-
19
+
18
20
  uid { id_info['sub'] }
19
21
 
20
22
  info do
21
- {
23
+ prune!(
22
24
  sub: id_info['sub'],
23
25
  email: email,
24
26
  first_name: first_name,
25
- last_name: last_name
26
- }
27
+ last_name: last_name,
28
+ name: (first_name || last_name) ? [first_name, last_name].join(' ') : email,
29
+ )
27
30
  end
28
31
 
29
32
  extra do
30
- {
31
- raw_info: id_info.merge(user_info)
32
- }
33
+ id_token = request.params['id_token'] || access_token&.params&.dig('id_token')
34
+ prune!(raw_info: {id_info: id_info, user_info: user_info, id_token: id_token})
33
35
  end
34
36
 
35
37
  def client
36
38
  ::OAuth2::Client.new(client_id, client_secret, deep_symbolize(options.client_options))
37
39
  end
38
40
 
41
+ def authorize_params
42
+ super.merge(nonce: new_nonce)
43
+ end
44
+
39
45
  def callback_url
40
46
  options[:redirect_uri] || (full_host + script_name + callback_path)
41
47
  end
42
48
 
43
49
  private
44
50
 
51
+ def new_nonce
52
+ session['omniauth.nonce'] = SecureRandom.urlsafe_base64(16)
53
+ end
54
+
55
+ def stored_nonce
56
+ session.delete('omniauth.nonce')
57
+ end
58
+
45
59
  def id_info
46
- if request.params&.key?('id_token') || access_token&.params&.key?('id_token')
47
- id_token = request.params['id_token'] || access_token.params['id_token']
48
- log(:info, "id_token: #{id_token}")
49
- @id_info ||= ::JWT.decode(id_token, nil, false)[0] # payload after decoding
50
- end
60
+ @id_info ||= if request.params&.key?('id_token') || access_token&.params&.key?('id_token')
61
+ id_token = request.params['id_token'] || access_token.params['id_token']
62
+ jwt_options = {
63
+ verify_iss: true,
64
+ iss: 'https://appleid.apple.com',
65
+ verify_iat: true,
66
+ verify_aud: true,
67
+ aud: [options.client_id].concat(options.authorized_client_ids),
68
+ algorithms: ['RS256'],
69
+ jwks: fetch_jwks
70
+ }
71
+ payload, _header = ::JWT.decode(id_token, nil, true, jwt_options)
72
+ verify_nonce!(payload)
73
+ payload
74
+ end
51
75
  end
52
76
 
53
- def client_id
54
- unless id_info.nil?
55
- return id_info['aud'] if options.authorized_client_ids.include? id_info['aud']
56
- end
77
+ def fetch_jwks
78
+ uri = URI.parse('https://appleid.apple.com/auth/keys')
79
+ response = Net::HTTP.get_response(uri)
80
+ JSON.parse(response.body, symbolize_names: true)
81
+ end
82
+
83
+ def verify_nonce!(payload)
84
+ return unless payload['nonce_supported']
85
+
86
+ return if payload['nonce'] && payload['nonce'] == stored_nonce
87
+
88
+ fail!(:nonce_mismatch, CallbackError.new(:nonce_mismatch, 'nonce mismatch'))
89
+ end
57
90
 
58
- options.client_id
91
+ def client_id
92
+ @client_id ||= if id_info.nil?
93
+ options.client_id
94
+ else
95
+ id_info['aud'] if options.authorized_client_ids.include? id_info['aud']
96
+ end
59
97
  end
60
98
 
61
99
  def user_info
62
- return {} unless request.params['user'].present?
100
+ user = request.params['user']
101
+ return {} if user.nil?
63
102
 
64
- log(:info, "user_info: #{request.params['user']}")
65
- @user_info ||= JSON.parse(request.params['user'])
103
+ @user_info ||= JSON.parse(user)
66
104
  end
67
105
 
68
106
  def email
@@ -77,6 +115,13 @@ module OmniAuth
77
115
  user_info.dig('name', 'lastName')
78
116
  end
79
117
 
118
+ def prune!(hash)
119
+ hash.delete_if do |_, v|
120
+ prune!(v) if v.is_a?(Hash)
121
+ v.nil? || (v.respond_to?(:empty?) && v.empty?)
122
+ end
123
+ end
124
+
80
125
  def client_secret
81
126
  payload = {
82
127
  iss: options.team_id,
@@ -5,7 +5,7 @@ require "omniauth/apple/version"
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "omniauth-apple"
8
- spec.version = Omniauth::Apple::VERSION
8
+ spec.version = OmniAuth::Apple::VERSION
9
9
  spec.authors = ["nhosoya", "Fabian Jäger"]
10
10
  spec.email = ["hnhnnhnh@gmail.com", "fabian@mailbutler.io"]
11
11
 
@@ -39,5 +39,8 @@ Gem::Specification.new do |spec|
39
39
  spec.add_dependency 'omniauth-oauth2'
40
40
  spec.add_dependency 'jwt'
41
41
  spec.add_development_dependency "bundler", "~> 2.0"
42
- spec.add_development_dependency "rake", "~> 10.0"
42
+ spec.add_development_dependency "rake", "~> 13.0"
43
+ spec.add_development_dependency "rspec", "~> 3.9"
44
+ spec.add_development_dependency "webmock", "~> 3.8"
45
+ spec.add_development_dependency 'simplecov', "~> 0.18"
43
46
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omniauth-apple
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - nhosoya
8
8
  - Fabian Jäger
9
- autorequire:
9
+ autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2020-05-15 00:00:00.000000000 Z
12
+ date: 2020-06-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: omniauth-oauth2
@@ -59,14 +59,56 @@ dependencies:
59
59
  requirements:
60
60
  - - "~>"
61
61
  - !ruby/object:Gem::Version
62
- version: '10.0'
62
+ version: '13.0'
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
- version: '10.0'
69
+ version: '13.0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rspec
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '3.9'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '3.9'
84
+ - !ruby/object:Gem::Dependency
85
+ name: webmock
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: '3.8'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '3.8'
98
+ - !ruby/object:Gem::Dependency
99
+ name: simplecov
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '0.18'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: '0.18'
70
112
  description: OmniAuth strategy for Sign In with Apple
71
113
  email:
72
114
  - hnhnnhnh@gmail.com
@@ -75,8 +117,9 @@ executables: []
75
117
  extensions: []
76
118
  extra_rdoc_files: []
77
119
  files:
120
+ - ".github/workflows/rspec.yml"
78
121
  - ".gitignore"
79
- - ".rakeTasks"
122
+ - CHANGELOG.md
80
123
  - Gemfile
81
124
  - LICENSE
82
125
  - README.md
@@ -92,7 +135,7 @@ homepage: https://github.com/nhosoya/omniauth-apple
92
135
  licenses:
93
136
  - MIT
94
137
  metadata: {}
95
- post_install_message:
138
+ post_install_message:
96
139
  rdoc_options: []
97
140
  require_paths:
98
141
  - lib
@@ -107,8 +150,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
107
150
  - !ruby/object:Gem::Version
108
151
  version: '0'
109
152
  requirements: []
110
- rubygems_version: 3.0.3
111
- signing_key:
153
+ rubygems_version: 3.1.2
154
+ signing_key:
112
155
  specification_version: 4
113
156
  summary: OmniAuth strategy for Sign In with Apple
114
157
  test_files: []
data/.rakeTasks DELETED
@@ -1,7 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <Settings><!--This file was automatically generated by Ruby plugin.
3
- You are allowed to:
4
- 1. Remove rake task
5
- 2. Add existing rake tasks
6
- To add existing rake tasks automatically delete this file and reload the project.
7
- --><RakeGroup description="" fullCmd="" taksId="rake" /></Settings>