gamecenter-auth 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fdf562542b694b74c953cb181097610dc52dc489
4
+ data.tar.gz: a65aca8f3058c1cdbc36381b4c164575b9d56fae
5
+ SHA512:
6
+ metadata.gz: 9b479c43be9c3e9ad7a8998c50333fe16feaaf0c9f703154180bc3d6b1714f3b3737a208901d2426df4a0d5c56279f15e9a960f50f3c8ae92bf4eb858256c61f
7
+ data.tar.gz: 93a436eeb3f928f5730aa61d93528ae78066ea2a799c77cfed4bda4b5c7037d8194ca56984d53c0d73120a0dfa73f1b36746d11bad71c2382ee879ad429259c3
data/.gitignore ADDED
@@ -0,0 +1,38 @@
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /test/tmp/
9
+ /test/version_tmp/
10
+ /tmp/
11
+
12
+ ## Specific to RubyMotion:
13
+ .dat*
14
+ .repl_history
15
+ build/
16
+
17
+ ## Documentation cache and generated files:
18
+ /.yardoc/
19
+ /_yardoc/
20
+ /doc/
21
+ /rdoc/
22
+
23
+ ## Environment normalisation:
24
+ /.bundle/
25
+ /vendor/bundle
26
+ /lib/bundler/man/
27
+
28
+ # for a library or gem, you might want to ignore these files since the code is
29
+ # intended to run in multiple environments; otherwise, check them in:
30
+ Gemfile.lock
31
+ .ruby-version
32
+ .ruby-gemset
33
+
34
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
35
+ .rvmrc
36
+
37
+ # RubyMine
38
+ /.idea
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ before_install: gem install bundler -v 1.10.6
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in gamecenter-auth.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Bichinger Software & Consulting
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
data/README.md ADDED
@@ -0,0 +1,85 @@
1
+ # gamecenter-auth
2
+
3
+ Ruby gem for iOS GameKit/Game Center player authentication using the "Identity Verification Signature" provided by the generateIdentityVerificationSignatureWithCompletionHandler method in Apple's GameKit framework
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'gamecenter-auth'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install gamecenter-auth
20
+
21
+ ## Usage
22
+
23
+ Gamecenter::Auth takes all parameters your iOS-App receives from the call generateIdentityVerificationSignatureWithCompletionHandler.
24
+
25
+ See https://developer.apple.com/library/prerelease/ios/documentation/GameKit/Reference/GKLocalPlayer_Ref/index.html
26
+
27
+ ### Configuration
28
+
29
+ !This is likely to be changed a little in future versions!
30
+
31
+ Gamecenter::Auth can be statically configured using the following parameters (values show the default values):
32
+
33
+ ```ruby
34
+ # if for some reason you don't want the public key certificate verified
35
+ # against the issuer's (Apple) certificate, set this to false
36
+ Gamecenter::Auth.verify_issuer_certificate = true
37
+
38
+ # public keys won't change often, this saves a lot of HTTP requests
39
+ Gamecenter::Auth.cache_public_keys = true
40
+ # cache this many public keys (has to be 1 at least!)
41
+ Gamecenter::Auth.public_key_cache_entries = 10
42
+
43
+ # if the salt is already base64-decoded, set this to false
44
+ Gamecenter::Auth.base64_decode_salt = true
45
+ # if the signature is already base64-decoded, set this to false
46
+ Gamecenter::Auth.base64_decode_signature = true
47
+
48
+ # HTTP timeouts in seconds
49
+ Gamecenter::Auth.request_public_key_open_timeout = 5
50
+ Gamecenter::Auth.request_public_key_read_timeout = 5
51
+ Gamecenter::Auth.request_public_key_ssl_timeout = 5
52
+
53
+ ```
54
+
55
+ ### Example usage
56
+
57
+ ```ruby
58
+ player_id = 'G:123148854'
59
+ bundle_id = 'de.bichinger.test.gamekit-auth'
60
+ public_key_url = 'https://static.gc.apple.com/public-key/gc-prod-2.cer'
61
+ signature = 'SGKgszgKffUshV4aMe0aQHAvzSointPjBlfF2MK34gHY50DycZlC5gwKDpRb+gBCS2OHQNLSRctYV5WORYsDbjAcNdrzR2Tl0oDMptpBiVJQX+kCilv45Fbs7szEJ2jw/4Xl/CAFlX/HtRxYZKb4oeC/knB5ueuDGcAyjFZJkl8FmFvyRn2ZeO0pGfefzQ2lz3bgHkwgcY+w8ZMQ5wIoHkgt4x44H21hnI5he/G0q48Il0lc3frWiojeZn2UWIo8j601svFHSDkX3mx9SJrYeP4f8goJ8ax1/fVVHxSdh2+uKW+9Zz/gAbrAC4xtVUiz12DjHZf9G6hxZ0etrjZYBQ=='
62
+ salt = 'Yt1c3Q=='
63
+ timestamp = 1445940012818
64
+
65
+ auth = Gamecenter::Auth.new
66
+ success = auth.verify_player(player_id, bundle_id, public_key_url, signature, salt, timestamp)
67
+
68
+ puts success ? 'player verified' : 'player not verified'
69
+ ```
70
+
71
+ ## Development
72
+
73
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
74
+
75
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
76
+
77
+ ## Contributing
78
+
79
+ Bug reports and pull requests are very welcome on GitHub at https://github.com/bichinger/gamecenter-auth.
80
+
81
+
82
+ ## License
83
+
84
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
85
+
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "gamecenter/auth"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'gamecenter/auth/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'gamecenter-auth'
8
+ spec.version = Gamecenter::Auth::VERSION
9
+ spec.authors = ['Niklas Bichinger', 'Kai Machemehl']
10
+ spec.email = %w(niklas@bichinger.de k.machemehl@bichinger.de)
11
+
12
+ spec.summary = %q{Server-side iOS GameKit/Game Center player authentication}
13
+ spec.description = %q{Server-side iOS GameKit/Game Center player authentication using the "Identity Verification Signature" provided by the method generateIdentityVerificationSignatureWithCompletionHandler in Apple's GameKit framework}
14
+ spec.homepage = 'https://github.com/bichinger/gamecenter-auth'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = 'exe'
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ['lib']
21
+
22
+ spec.add_development_dependency 'bundler', '~> 1.10'
23
+ spec.add_development_dependency 'rake', '~> 10.0'
24
+ spec.add_development_dependency 'rspec'
25
+ end
@@ -0,0 +1,5 @@
1
+ module Gamecenter
2
+ class Auth
3
+ VERSION = '1.0.0'
4
+ end
5
+ end
@@ -0,0 +1,192 @@
1
+ require 'gamecenter/auth/version'
2
+ require 'uri'
3
+ require 'logger'
4
+ require 'base64'
5
+
6
+ module Gamecenter
7
+ class Auth
8
+
9
+ @@verify_issuer_certificate = true
10
+
11
+ @@cache_public_keys = true
12
+ @@public_key_cache_entries = 10 # 1+: cache this many public keys (has to be 1 at least!)
13
+
14
+ @@base64_decode_salt = true
15
+ @@base64_decode_signature = true
16
+
17
+ @@request_public_key_open_timeout = 5 # seconds
18
+ @@request_public_key_read_timeout = 5 # seconds
19
+ @@request_public_key_ssl_timeout = 5 # seconds
20
+
21
+ @@ca_certificate = OpenSSL::X509::Certificate.new <<EOCACERT
22
+ -----BEGIN CERTIFICATE-----
23
+ MIIFWTCCBEGgAwIBAgIQPXjX+XZJYLJhffTwHsqGKjANBgkqhkiG9w0BAQsFADCB
24
+ yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
25
+ ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
26
+ U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
27
+ ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
28
+ aG9yaXR5IC0gRzUwHhcNMTMxMjEwMDAwMDAwWhcNMjMxMjA5MjM1OTU5WjB/MQsw
29
+ CQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNV
30
+ BAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxMDAuBgNVBAMTJ1N5bWFudGVjIENs
31
+ YXNzIDMgU0hBMjU2IENvZGUgU2lnbmluZyBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
32
+ ggEPADCCAQoCggEBAJeDHgAWryyx0gjE12iTUWAecfbiR7TbWE0jYmq0v1obUfej
33
+ DRh3aLvYNqsvIVDanvPnXydOC8KXyAlwk6naXA1OpA2RoLTsFM6RclQuzqPbROlS
34
+ Gz9BPMpK5KrA6DmrU8wh0MzPf5vmwsxYaoIV7j02zxzFlwckjvF7vjEtPW7ctZlC
35
+ n0thlV8ccO4XfduL5WGJeMdoG68ReBqYrsRVR1PZszLWoQ5GQMWXkorRU6eZW4U1
36
+ V9Pqk2JhIArHMHckEU1ig7a6e2iCMe5lyt/51Y2yNdyMK29qclxghJzyDJRewFZS
37
+ AEjM0/ilfd4v1xPkOKiE1Ua4E4bCG53qWjjdm9sCAwEAAaOCAYMwggF/MC8GCCsG
38
+ AQUFBwEBBCMwITAfBggrBgEFBQcwAYYTaHR0cDovL3MyLnN5bWNiLmNvbTASBgNV
39
+ HRMBAf8ECDAGAQH/AgEAMGwGA1UdIARlMGMwYQYLYIZIAYb4RQEHFwMwUjAmBggr
40
+ BgEFBQcCARYaaHR0cDovL3d3dy5zeW1hdXRoLmNvbS9jcHMwKAYIKwYBBQUHAgIw
41
+ HBoaaHR0cDovL3d3dy5zeW1hdXRoLmNvbS9ycGEwMAYDVR0fBCkwJzAloCOgIYYf
42
+ aHR0cDovL3MxLnN5bWNiLmNvbS9wY2EzLWc1LmNybDAdBgNVHSUEFjAUBggrBgEF
43
+ BQcDAgYIKwYBBQUHAwMwDgYDVR0PAQH/BAQDAgEGMCkGA1UdEQQiMCCkHjAcMRow
44
+ GAYDVQQDExFTeW1hbnRlY1BLSS0xLTU2NzAdBgNVHQ4EFgQUljtT8Hkzl699g+8u
45
+ K8zKt4YecmYwHwYDVR0jBBgwFoAUf9Nlp8Ld7LvwMAnzQzn6Aq8zMTMwDQYJKoZI
46
+ hvcNAQELBQADggEBABOFGh5pqTf3oL2kr34dYVP+nYxeDKZ1HngXI9397BoDVTn7
47
+ cZXHZVqnjjDSRFph23Bv2iEFwi5zuknx0ZP+XcnNXgPgiZ4/dB7X9ziLqdbPuzUv
48
+ M1ioklbRyE07guZ5hBb8KLCxR/Mdoj7uh9mmf6RWpT+thC4p3ny8qKqjPQQB6rqT
49
+ og5QIikXTIfkOhFf1qQliZsFay+0yQFMJ3sLrBkFIqBgFT/ayftNTI/7cmd3/SeU
50
+ x7o1DohJ/o39KK9KEr0Ns5cF3kQMFfo2KwPcwVAB8aERXRTl4r0nS1S+K4ReD6bD
51
+ dAUK75fDiSKxH3fzvc1D1PFMqT+1i4SvZPLQFCE=
52
+ -----END CERTIFICATE-----
53
+ EOCACERT
54
+
55
+ # Verifies the identity of the given player. Takes all return values from GameKit's generateIdentityVerificationSignatureWithCompletionHandler method.
56
+ # @see https://developer.apple.com/library/prerelease/ios/documentation/GameKit/Reference/GKLocalPlayer_Ref/index.html#//apple_ref/occ/instm/GKLocalPlayer/generateIdentityVerificationSignatureWithCompletionHandler:
57
+ # @param [String] player_id the playerID from the player to verify identity of
58
+ # @param [String] bundle_id the app's bundleID
59
+ # @param [String] public_key_url the publicKeyURL property returned from the GameKit framework
60
+ # @param [String] signature the signature property returned from the GameKit framework
61
+ # @param [String] salt the salt property returned from the GameKit framework
62
+ # @param [Integer] timestamp the timestamp property returned from the GameKit framework
63
+ # @return [Boolean] true if player could be verified, false if not
64
+ def verify_player(player_id, bundle_id, public_key_url, signature, salt, timestamp)
65
+ unless verify_public_key_url public_key_url
66
+ logger.debug { "public key url invalid: #{public_key_url}" }
67
+ return false
68
+ end
69
+
70
+ cert = get_public_key_certificate public_key_url
71
+ unless cert
72
+ logger.debug { "could not get certificate from: #{public_key_url}" }
73
+ return false
74
+ end
75
+ if @@verify_issuer_certificate && !verify_public_key_certificate(cert)
76
+ logger.debug { "failed verification of public key certificate from: #{public_key_url}" }
77
+ return false
78
+ end
79
+
80
+ salt_decoded = @@base64_decode_salt ? Base64.decode64(salt) : salt
81
+ payload = "#{player_id}#{bundle_id}#{[timestamp.to_i].pack('Q>')}#{salt_decoded}"
82
+ signature_decoded = @@base64_decode_signature ? Base64.decode64(signature) : signature
83
+ unless verify_signature cert, signature_decoded, payload
84
+ logger.debug { "failed signature validation for player id #{player_id}, bundle id #{bundle_id}, timestamp #{timestamp}, salt #{salt} (decode: #{@@base64_decode_salt}), signature #{signature} (decode: #{@@base64_decode_signature}) with certificate from: #{public_key_url}" }
85
+ return false
86
+ end
87
+
88
+ true
89
+ end
90
+
91
+ # Verifies that the public key url originates from one of Apple's secured servers
92
+ # @param [String] public_key_url The publicKeyURL property returned from the GameKit framework
93
+ # @return [Boolean] true if url verification was successful, false if url fails verification
94
+ def verify_public_key_url(public_key_url)
95
+ url_ok = false
96
+ begin
97
+ uri = URI.parse public_key_url
98
+ url_ok = uri.scheme == 'https' && !!(uri.host =~ /\.apple\.com$/i)
99
+ rescue URI::InvalidURIError => e
100
+ logger.error e
101
+ end
102
+
103
+ url_ok
104
+ end
105
+
106
+ # Checks if given public key certificate can be verified with the CA certificate
107
+ # @param [OpenSSL::X509::Certificate] public_key_cert a previously fetched public key certificate object
108
+ # @return [Boolean] true if certificate could be verified against the CA certificate, false if it couldn't
109
+ def verify_public_key_certificate(public_key_cert)
110
+ verified = public_key_cert.verify(@@ca_certificate.public_key)
111
+ no_errors = OpenSSL.errors.empty? # this method has to be called always as it empties the OpenSSL error stack
112
+
113
+ verified && no_errors
114
+ end
115
+
116
+ # Verifies the signature of given payload with given public key certificate
117
+ # @param [OpenSSL:X509::Certificate] public_key_cert a previously fetched public key certificate object
118
+ # @param [String] signature the signature to be verified
119
+ # @param [String] payload the payload to verify the signature for
120
+ # @return [Boolean] true if signature is valid for given certificate and payload, false if it isn't
121
+ def verify_signature(public_key_cert, signature, payload)
122
+ verified = public_key_cert.public_key.verify(OpenSSL::Digest::SHA256.new, signature, payload)
123
+ no_errors = OpenSSL.errors.empty? # this method has to be called always as it empties the OpenSSL error stack
124
+
125
+ verified && no_errors
126
+ end
127
+
128
+ # Get a public key certificate for given URL. Caches the results, depending on the configuration.
129
+ # @param [String] public_key_url the URL of the certificate to fetch
130
+ # @return [OpenSSL::X509::Certificate] certificate found at given URL or nil if there was an error
131
+ def get_public_key_certificate(public_key_url)
132
+ if @@cache_public_keys
133
+ # caching is enabled
134
+ cache = (@@_public_key_cache ||= {})
135
+ unless cert = cache[public_key_url] && cert.not_after > Time.now
136
+ # no cache hit or certificate expired
137
+ cache.delete public_key_url
138
+
139
+ cert = request_public_key_certificate public_key_url
140
+
141
+ available_entries = @@public_key_cache_entries - cache.size
142
+ # check if there are free entries
143
+ unless available_entries > 0
144
+ # there are not, randomly delete enough to make room for this certificate
145
+ cache.keys.sample(available_entries.abs + 1).each { |key|
146
+ cache.delete key
147
+ }
148
+ end
149
+ cache[public_key_url] = cert
150
+ end
151
+
152
+ cert
153
+ else
154
+ # caching is disabled
155
+ request_public_key_certificate public_key_url
156
+ end
157
+ end
158
+
159
+ # Fetch a certificate from given URL.
160
+ # @param [String] public_key_url the URL to fetch the certificate from
161
+ # @return [OpenSSL::X509::Certificate] certificate found at given URL or nil if there was an error
162
+ def request_public_key_certificate(public_key_url)
163
+ uri = URI.parse public_key_url
164
+ begin
165
+ Net::HTTP.start(uri.host, uri.port,
166
+ use_ssl: uri.scheme == 'https',
167
+ open_timeout: @@request_public_key_open_timeout,
168
+ read_timeout: @@request_public_key_read_timeout,
169
+ ssl_timeout: @@request_public_key_ssl_timeout) do |http|
170
+ request = Net::HTTP::Get.new uri.request_uri
171
+ response = http.request request # Net::HTTPResponse object
172
+ begin
173
+ return OpenSSL::X509::Certificate.new(response.body) if response.body
174
+ rescue OpenSSL::X509::CertificateError => e
175
+ logger.error e
176
+ end
177
+ end
178
+ rescue Net::OpenTimeout, Net::ReadTimeout, OpenSSL::SSL::SSLError => e
179
+ logger.error e
180
+ end
181
+
182
+ nil
183
+ end
184
+
185
+ private
186
+
187
+ def logger
188
+ @@logger ||= Logger.new(STDERR)
189
+ end
190
+
191
+ end
192
+ end
metadata ADDED
@@ -0,0 +1,102 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gamecenter-auth
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Niklas Bichinger
8
+ - Kai Machemehl
9
+ autorequire:
10
+ bindir: exe
11
+ cert_chain: []
12
+ date: 2015-11-19 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '1.10'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '1.10'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rake
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '10.0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '10.0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rspec
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ description: Server-side iOS GameKit/Game Center player authentication using the "Identity
57
+ Verification Signature" provided by the method generateIdentityVerificationSignatureWithCompletionHandler
58
+ in Apple's GameKit framework
59
+ email:
60
+ - niklas@bichinger.de
61
+ - k.machemehl@bichinger.de
62
+ executables: []
63
+ extensions: []
64
+ extra_rdoc_files: []
65
+ files:
66
+ - ".gitignore"
67
+ - ".rspec"
68
+ - ".travis.yml"
69
+ - Gemfile
70
+ - LICENSE
71
+ - README.md
72
+ - Rakefile
73
+ - bin/console
74
+ - bin/setup
75
+ - gamecenter-auth.gemspec
76
+ - lib/gamecenter/auth.rb
77
+ - lib/gamecenter/auth/version.rb
78
+ homepage: https://github.com/bichinger/gamecenter-auth
79
+ licenses:
80
+ - MIT
81
+ metadata: {}
82
+ post_install_message:
83
+ rdoc_options: []
84
+ require_paths:
85
+ - lib
86
+ required_ruby_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ required_rubygems_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ requirements: []
97
+ rubyforge_project:
98
+ rubygems_version: 2.4.8
99
+ signing_key:
100
+ specification_version: 4
101
+ summary: Server-side iOS GameKit/Game Center player authentication
102
+ test_files: []