apple_id 0.1.0 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e000f6003a2baeecbb6683a9636b311cac3eec9ec20df988f79f0bbd50231135
4
- data.tar.gz: e4890bdb603981bcd9d4489915e607029490c221210816315f96dd3d6fccfd9d
3
+ metadata.gz: d5d84152da940b14a875e1e927bf5660b3b7a625ca3f84e5f9c5e4e8f0815ae2
4
+ data.tar.gz: 1d8cfa5bf964c5bf482e327a8f205c6e46b54c836622ce4bf4391a399d11d061
5
5
  SHA512:
6
- metadata.gz: 1bb4b14f28e1906cf6517e2382422a5dd44c864479ea550bf2ad54a2758b166ab0464e0e04539f0e2f26c592daae932eba81d4f82f508b0aae2d45f956d1bcce
7
- data.tar.gz: 406ae5c6dca6868bfac746b83b3422b1a92876e6f6d75ced236f2b653b88e8d6469ca5544b33afae387d8bca78aa2237608e1557022daff8d3f334667c8e1663
6
+ metadata.gz: 34ea5191c7f74a974195d6acc31be3684ae5dd6cc325a46771debbbab1bdcd0fc0252669a8ddcb130499a5043363ad63120bdf5a65bbefc9fe1efaef1ac70887
7
+ data.tar.gz: 1b950617cdfce0691403c63f464c32654a99279ecce7f9587575a5303f61426d6bb39a6a6b88e237e7a406669f79e72da144e70fac464ee067367727c07559ad
@@ -2,6 +2,8 @@
2
2
  sudo: false
3
3
  language: ruby
4
4
  cache: bundler
5
+ before_install: gem install bundler
5
6
  rvm:
6
- - 2.6.2
7
- before_install: gem install bundler -v 1.17.2
7
+ - 2.4.6
8
+ - 2.5.5
9
+ - 2.6.2
data/README.md CHANGED
@@ -2,9 +2,7 @@
2
2
 
3
3
  "Sign-in with Apple" is an implementation of OpenID Connect with small custom features.
4
4
 
5
- This gem handles such custom features.
6
-
7
- Basically, this gem is based on my [OpenID Connect gem](https://github.com/nov/openid_connect) and [OAuth2 gem](https://github.com/nov/rack-oauth2), so the usage is almost same with them.
5
+ This gem handles these Apple custom features.
8
6
 
9
7
  ## Installation
10
8
 
@@ -26,52 +24,9 @@ Or install it yourself as:
26
24
 
27
25
  There is [a sample rails app](https://github.com/nov/signin-with-apple) running at [signin-with-apple.herokuapp.com](https://signin-with-apple.herokuapp.com).
28
26
 
29
- If you run script in your terminal only, do like below.
27
+ If you run script in your terminal only, [do like this](https://gist.github.com/nov/993a303aa6badd8447f7b96fb952088e).
30
28
 
31
- ```ruby
32
- require 'apple_id'
33
-
34
- # NOTE: in debugging mode, you can see all HTTPS request & response in the log.
35
- # AppleID.debug!
36
-
37
- pem = <<-PEM
38
- -----BEGIN PRIVATE KEY-----
39
- :
40
- :
41
- -----END PRIVATE KEY-----
42
- PEM
43
- private_key = OpenSSL::PKey::EC.new pem
44
-
45
- client = AppleID::Client.new(
46
- identifier: '<YOUR-CLIENT-ID>',
47
- team_id: '<YOUR-TEAM-ID>',
48
- key_id: '<YOUR-KEY-ID>',
49
- private_key: private_key,
50
- redirect_uri: '<YOUR-REDIRECT-URI>'
51
- )
52
-
53
- authorization_uri = client.authorization_uri(scope: [:email, :name])
54
- puts authorization_uri
55
- `open "#{authorization_uri}"`
56
-
57
- print 'code: ' and STDOUT.flush
58
- code = gets.chop
59
-
60
- client.authorization_code = code
61
- response = client.access_token!
62
-
63
- response.id_token.verify!(
64
- client,
65
- access_token: response.access_token,
66
-
67
- # NOTE:
68
- # When verifying signature, one http request to Apple's JWKs are required.
69
- # You can skip ID Token signature verification when you got the token directly from the token endpoint in TLS channel.
70
- verify_signature: false
71
- )
72
- puts response.id_token.sub # => OpenID Connect Subject Identifier (= Apple User ID)
73
- puts response.id_token.original_jwt.pretty_generate
74
- ```
29
+ For more details, see [AppleID Wiki](https://github.com/nov/apple_id/wiki).
75
30
 
76
31
  ## Development
77
32
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ['lib']
20
20
 
21
21
  spec.add_runtime_dependency 'rack-oauth2', '~> 1.9.3'
22
- spec.add_runtime_dependency 'openid_connect', '~> 1.0'
22
+ spec.add_runtime_dependency 'openid_connect', '~> 1.1.7'
23
23
  spec.add_development_dependency 'bundler'
24
24
  spec.add_development_dependency 'rake'
25
25
  spec.add_development_dependency 'rspec'
@@ -4,9 +4,9 @@ module AppleID
4
4
 
5
5
  alias_method :original_jwt, :raw_attributes
6
6
 
7
- def verify!(expected_client, access_token: nil, code: nil, verify_signature: true)
7
+ def verify!(verify_signature: true, client: nil, nonce: nil, state: nil, access_token: nil, code: nil)
8
8
  verify_signature! if verify_signature
9
- verify_claims! expected_client, access_token, code
9
+ verify_claims! client, nonce, state, access_token, code
10
10
  self
11
11
  end
12
12
 
@@ -31,14 +31,52 @@ module AppleID
31
31
  raise VerificationFailed, 'Signature Verification Failed'
32
32
  end
33
33
 
34
- def verify_claims!(expected_client, access_token, code)
35
- # TODO: verify at_hash & c_hash
36
- unless (
37
- iss == ISSUER &&
38
- aud == expected_client.identifier &&
39
- Time.now.to_i.between?(iat, exp)
40
- )
41
- raise VerificationFailed, 'Claims Verification Failed'
34
+ def verify_claims!(client, nonce, state, access_token, code)
35
+ aud = if client.respond_to?(:identifier)
36
+ client.identifier
37
+ else
38
+ client
39
+ end
40
+
41
+ hash_length = original_jwt.alg.to_s[2, 3].to_i
42
+ s_hash = if state.present?
43
+ left_half_hash_of state, hash_length
44
+ end
45
+ at_hash = if access_token.present?
46
+ left_half_hash_of access_token, hash_length
47
+ end
48
+ c_hash = if code.present?
49
+ left_half_hash_of code, hash_length
50
+ end
51
+
52
+ failure_reasons = []
53
+ if self.iss != ISSUER
54
+ failure_reasons << :iss
55
+ end
56
+ if aud.present? && self.aud != aud
57
+ failure_reasons << :aud
58
+ end
59
+ if nonce.present? && self.nonce != nonce
60
+ failure_reasons << :nonce
61
+ end
62
+ if s_hash.present? && self.s_hash != s_hash
63
+ failure_reasons << :s_hash
64
+ end
65
+ if at_hash.present? && self.at_hash != at_hash
66
+ failure_reasons << :at_hash
67
+ end
68
+ if c_hash.present? && self.c_hash != c_hash
69
+ failure_reasons << :c_hash
70
+ end
71
+ if Time.now.to_i < iat
72
+ failure_reasons << :iat
73
+ end
74
+ if Time.now.to_i >= exp
75
+ failure_reasons << :exp
76
+ end
77
+
78
+ if failure_reasons.present?
79
+ raise VerificationFailed, "Claims Verification Failed at #{failure_reasons}"
42
80
  end
43
81
  end
44
82
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: apple_id
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - nov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-06-05 00:00:00.000000000 Z
11
+ date: 2019-06-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack-oauth2
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.0'
33
+ version: 1.1.7
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.0'
40
+ version: 1.1.7
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement