gle 1.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.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +9 -0
- data/CHANGELOG.md +70 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +123 -0
- data/Rakefile +9 -0
- data/bin/console +10 -0
- data/bin/setup +8 -0
- data/gle.gemspec +34 -0
- data/lib/gle.rb +143 -0
- metadata +152 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 7a59e3dfbe071b099b9d543b9fea4c6a5bccbde1b285dc451c2fa011b4e4c07a
|
|
4
|
+
data.tar.gz: e6ace1b16d3f4ed687b8947c782d4bc46b4fcdc009345b39a76edfa78dd86d35
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 40d36942ad6a9896a5b6ae0f7399fa9459843860dd210ab9d4c9fa1cfd18f879774fa48612c03d0fe4532da56c568cd34b95dbe3c294a9d090c2fab88c511200
|
|
7
|
+
data.tar.gz: d598f16213f60e12d98b81e3d5c65e8b4c2fa7c876d1a4164e4817611f7900fa36a70865c47ec5e4373cbb5396518a21a4f9364e9263cb29a50763ad13c18559
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
For more information about changelogs, check
|
|
6
|
+
[Keep a Changelog](http://keepachangelog.com) and
|
|
7
|
+
[Vandamme](http://tech-angels.github.io/vandamme).
|
|
8
|
+
|
|
9
|
+
## 1.2.0 - 2026-05-24
|
|
10
|
+
|
|
11
|
+
* Renamed to Gle
|
|
12
|
+
|
|
13
|
+
## 1.1.0 - 2024-12-10
|
|
14
|
+
|
|
15
|
+
* [FEATURE] Support mocking
|
|
16
|
+
|
|
17
|
+
- Use `Yt.configuration.mock_auth_error` to mock an error response
|
|
18
|
+
- Use `Yt.configuration.mock_auth_email` to mock authenticating as an email
|
|
19
|
+
- If the value of `mock_auth_email` is `invalid-email`, raise a Yt::HTTPError
|
|
20
|
+
|
|
21
|
+
## 1.0.0 - 2024-11-26
|
|
22
|
+
|
|
23
|
+
Released major version. No breaking changes.
|
|
24
|
+
|
|
25
|
+
## 0.3.1 - 2017-08-26
|
|
26
|
+
|
|
27
|
+
* [ENHANCEMENT] Add placeholder method to be notified when token is refreshed.
|
|
28
|
+
|
|
29
|
+
## 0.3.0 - 2017-08-25
|
|
30
|
+
|
|
31
|
+
**How to upgrade**
|
|
32
|
+
|
|
33
|
+
If your code uses `Gle#url` then you must use `Gle.url_for` instead.
|
|
34
|
+
If your code uses `Gle.new(code:)` then you must use `Gle.create(code:)` instead.
|
|
35
|
+
If your code uses `Gle.new(refresh_token:)` then you must use `Gle.find_by(refresh_token:)` instead.
|
|
36
|
+
|
|
37
|
+
* [ENHANCEMENT] Extract `Auth#url` into `Auth.url_for`
|
|
38
|
+
* [ENHANCEMENT] Rename `Auth.new(code:)` into `Auth.create(code:)`
|
|
39
|
+
* [ENHANCEMENT] Rename `Auth.new(refresh_token:)` into `Auth.find_by(refresh_token:)`
|
|
40
|
+
* [FEATURE] Gle.url_for now accepts the scope to authenticate
|
|
41
|
+
* [FEATURE] Gle.url_for now accepts an option to force re-authentication
|
|
42
|
+
* [FEATURE] Add `Auth#revoke` to revoke a refresh token
|
|
43
|
+
|
|
44
|
+
## 0.2.3 - 2017-08-24
|
|
45
|
+
|
|
46
|
+
* [FEATURE] Add the ability to generate access token from a refresh token
|
|
47
|
+
|
|
48
|
+
## 0.2.2 - 2017-05-31
|
|
49
|
+
|
|
50
|
+
* [FEATURE] Add `Auth#access_token`
|
|
51
|
+
|
|
52
|
+
## 0.2.1 - 2017-03-29
|
|
53
|
+
|
|
54
|
+
* [ENHANCEMENT] Speed up process by fetching email with 1 HTTP request (not 2).
|
|
55
|
+
|
|
56
|
+
## 0.2.0 - 2017-03-29
|
|
57
|
+
|
|
58
|
+
**How to upgrade**
|
|
59
|
+
|
|
60
|
+
If your code uses `GleError` then you must use `Yt::HTTPError` instead.
|
|
61
|
+
If your code uses `GleRequest` then you must use `Yt::HTTPRequest` instead.
|
|
62
|
+
|
|
63
|
+
* [ENHANCEMENT] Extract `AuthError` to `HTTPError` in yt-support gem
|
|
64
|
+
* [ENHANCEMENT] Extract `AuthRequest` to `HTTPRequest` in yt-support gem
|
|
65
|
+
|
|
66
|
+
## 0.1.0 - 2017-03-27
|
|
67
|
+
|
|
68
|
+
* [FEATURE] Add `AuthError`
|
|
69
|
+
* [FEATURE] Add `email`
|
|
70
|
+
* [FEATURE] Add `url`
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2017 Fullscreen, Inc.
|
|
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
|
|
13
|
+
all 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
|
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
Authenticate users with their Google account
|
|
2
|
+
============================================
|
|
3
|
+
|
|
4
|
+
Gle lets you easily authenticate users of your website by means of
|
|
5
|
+
their Google-based email address.
|
|
6
|
+
|
|
7
|
+
With Gle, it is easy to limit access to your app to a few users without
|
|
8
|
+
the need for them to create a username and password.
|
|
9
|
+
|
|
10
|
+
The **source code** is available on [GitHub](https://github.com/claudiob/gle) and the **documentation** on [RubyDoc](http://www.rubydoc.info/gems/gle/frames).
|
|
11
|
+
|
|
12
|
+
[](https://travis-ci.org/claudiob/gle)
|
|
13
|
+
[](https://coveralls.io/r/claudiob/gle)
|
|
14
|
+
[](https://gemnasium.com/claudiob/gle)
|
|
15
|
+
[](https://codeclimate.com/github/claudiob/gle)
|
|
16
|
+
[](http://www.rubydoc.info/gems/gle/frames)
|
|
17
|
+
[](http://rubygems.org/gems/gle)
|
|
18
|
+
|
|
19
|
+
Gle.url_for
|
|
20
|
+
----------------
|
|
21
|
+
|
|
22
|
+
With the `url_for` class method, you can obtain a URL where to redirect users
|
|
23
|
+
who need to authenticate with their Google account in order to use your
|
|
24
|
+
application:
|
|
25
|
+
|
|
26
|
+
```ruby
|
|
27
|
+
redirect_uri = 'https://example.com/auth' # REPLACE WITH REAL ONE
|
|
28
|
+
scope = %i(yt-analytics.readonly youtube)
|
|
29
|
+
Gle.url_for(redirect_uri: redirect_uri, scope: scope, force: true)
|
|
30
|
+
# => https://accounts.google.com/o/oauth2/auth?client_id=...&scope=email&redirect_uri=https%3A%2F%2Fexample.com%2Fauth&response_type=code
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Gle.create
|
|
34
|
+
----------------
|
|
35
|
+
|
|
36
|
+
After users have authenticated with their Google account, they will be
|
|
37
|
+
redirected to the `redirect_uri` you indicated, with an extra `code` query
|
|
38
|
+
parameter, e.g. `https://example.com/auth?code=1234`
|
|
39
|
+
|
|
40
|
+
With the `create` class method, you can create an instance for that
|
|
41
|
+
authentication:
|
|
42
|
+
|
|
43
|
+
```ruby
|
|
44
|
+
redirect_uri = 'https://example.com/auth' # REPLACE WITH REAL ONE
|
|
45
|
+
code = 'dfwe7r9djd234ffdjf3009dfknfd98re' # REPLACE WITH REAL ONE
|
|
46
|
+
auth = Gle.create(redirect_uri: redirect_uri, code: code)
|
|
47
|
+
# => #<Gle:0x007fe61d…>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Gle#email
|
|
51
|
+
--------------
|
|
52
|
+
|
|
53
|
+
Once you have an instance of `Gle`, you can obtain the verified email
|
|
54
|
+
of the authenticated user:
|
|
55
|
+
|
|
56
|
+
```ruby
|
|
57
|
+
auth.email
|
|
58
|
+
# => "user@example.com"
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Gle#access_token
|
|
62
|
+
---------------------
|
|
63
|
+
|
|
64
|
+
Once you have an instance of `Gle`, you can also obtain the access token
|
|
65
|
+
of the authenticated user:
|
|
66
|
+
|
|
67
|
+
```ruby
|
|
68
|
+
auth.access_token
|
|
69
|
+
# => "ya29.df8er8e9r89er"
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Gle#refresh_token
|
|
73
|
+
----------------------
|
|
74
|
+
|
|
75
|
+
Once you have an instance of `Gle`, you can also obtain the refresh token
|
|
76
|
+
of the authenticated user:
|
|
77
|
+
|
|
78
|
+
```ruby
|
|
79
|
+
auth.refresh_token
|
|
80
|
+
# => "sdf7f7erre98df"
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Gle.find_by
|
|
84
|
+
----------------
|
|
85
|
+
|
|
86
|
+
If you already know the refresh token of a Google account, you can obtain its
|
|
87
|
+
complete authentication object:
|
|
88
|
+
|
|
89
|
+
```ruby
|
|
90
|
+
auth = Gle.find_by(refresh_token: "sdf7f7erre98df")
|
|
91
|
+
auth.email
|
|
92
|
+
# => "user@example.com"
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
Yt::HTTPError
|
|
97
|
+
-------------
|
|
98
|
+
|
|
99
|
+
`Yt::HTTPError` will be raised whenever something goes wrong during the
|
|
100
|
+
authentication process. The message of the error will include the details:
|
|
101
|
+
|
|
102
|
+
```ruby
|
|
103
|
+
redirect_uri = 'https://example.com/auth' # REPLACE WITH REAL ONE
|
|
104
|
+
code = 'this-is-not-a-valid-code'
|
|
105
|
+
Gle.new(redirect_uri: redirect_uri, code: code).email
|
|
106
|
+
# => Yt::HTTPError: Invalid authorization code.
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
How to contribute
|
|
110
|
+
=================
|
|
111
|
+
|
|
112
|
+
Contribute to the code by forking the project, adding the missing code,
|
|
113
|
+
writing the appropriate tests and submitting a pull request.
|
|
114
|
+
|
|
115
|
+
To run the tests correctly, set up the environment variables `YT_ACCOUNT_CLIENT_ID`
|
|
116
|
+
and `YT_ACCOUNT_CLIENT_SECRET` with the credentials of an existing Google OAuth app.
|
|
117
|
+
|
|
118
|
+
In order for a PR to be approved, all the tests need to pass and all the public
|
|
119
|
+
methods need to be documented and listed in the guides. Remember:
|
|
120
|
+
|
|
121
|
+
- to run all tests locally: `bundle exec rspec`
|
|
122
|
+
- to generate the docs locally: `bundle exec yard`
|
|
123
|
+
- to list undocumented methods: `bundle exec yard stats --list-undoc`
|
data/Rakefile
ADDED
data/bin/console
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'bundler/setup'
|
|
4
|
+
require 'gle'
|
|
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
|
+
require 'irb'
|
|
10
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
data/gle.gemspec
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |spec|
|
|
6
|
+
spec.name = 'gle'
|
|
7
|
+
spec.version = '1.1.0'
|
|
8
|
+
spec.authors = ['claudiob']
|
|
9
|
+
spec.email = ['claudiob@users.noreply.github.com']
|
|
10
|
+
|
|
11
|
+
spec.summary = %q{Google Authentication Ruby client}
|
|
12
|
+
spec.description = %q{Gle makes it easy to authenticate users to any
|
|
13
|
+
web application by means of their Google account.}
|
|
14
|
+
spec.homepage = 'https://github.com/claudiob/gle'
|
|
15
|
+
spec.license = 'MIT'
|
|
16
|
+
|
|
17
|
+
spec.required_ruby_version = '>= 2.2.2'
|
|
18
|
+
|
|
19
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
|
20
|
+
f.match(%r{^(test|spec|features)/})
|
|
21
|
+
end
|
|
22
|
+
spec.bindir = 'exe'
|
|
23
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
24
|
+
spec.require_paths = ['lib']
|
|
25
|
+
|
|
26
|
+
spec.add_dependency 'yt-support'
|
|
27
|
+
spec.add_dependency 'jwt'
|
|
28
|
+
|
|
29
|
+
spec.add_development_dependency 'bundler'
|
|
30
|
+
spec.add_development_dependency 'rspec'
|
|
31
|
+
spec.add_development_dependency 'rake'
|
|
32
|
+
spec.add_development_dependency 'coveralls'
|
|
33
|
+
spec.add_development_dependency 'yard'
|
|
34
|
+
end
|
data/lib/gle.rb
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
require 'jwt'
|
|
2
|
+
require 'yt/config'
|
|
3
|
+
require 'yt/http_request'
|
|
4
|
+
|
|
5
|
+
# Provides methods to authenticate a user with the Google OAuth flow.
|
|
6
|
+
# @see https://developers.google.com/accounts/docs/OAuth2
|
|
7
|
+
class Gle
|
|
8
|
+
# @param [Hash] options the options to initialize an instance of Gle.
|
|
9
|
+
# @option options [String] :redirect_uri The URI to redirect users to
|
|
10
|
+
# after they have completed the Google OAuth flow.
|
|
11
|
+
# @option options [String] :code A single-use authorization code provided
|
|
12
|
+
# by Google OAuth to obtain an access token to access Google API.
|
|
13
|
+
def self.create(options = {})
|
|
14
|
+
new options.merge(grant_type: :authorization_code)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# @param [Hash] options the options to initialize an instance of Gle.
|
|
18
|
+
# @option options [String] :refresh_token A multi-use refresh token to
|
|
19
|
+
# obtain an access token to access Google API.
|
|
20
|
+
def self.find_by(options = {})
|
|
21
|
+
new options.merge(grant_type: :refresh_token)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @return [String] the URL where to authenticate with a Google account.
|
|
25
|
+
# @param [Hash] options the options to initialize an instance of Gle.
|
|
26
|
+
# @option options [String] :redirect_uri The URI to redirect users to
|
|
27
|
+
# after they have completed the Google OAuth flow.
|
|
28
|
+
# @option options [Boolean] :force whether to force users to re-authenticate
|
|
29
|
+
# an account that was previously authenticated.
|
|
30
|
+
# @option options [Array<String>] :scopes The list of scopes that users
|
|
31
|
+
# are requested to authorize.
|
|
32
|
+
def self.url_for(options = {})
|
|
33
|
+
if Yt.configuration.mock_auth_error
|
|
34
|
+
options[:redirect_uri] + '?error=' + Yt.configuration.mock_auth_error
|
|
35
|
+
elsif Yt.configuration.mock_auth_email
|
|
36
|
+
options[:redirect_uri] + '?code=mock-email'
|
|
37
|
+
else
|
|
38
|
+
host = 'accounts.google.com'
|
|
39
|
+
path = '/o/oauth2/auth'
|
|
40
|
+
query = URI.encode_www_form url_params(options)
|
|
41
|
+
URI::HTTPS.build(host: host, path: path, query: query).to_s
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# @param [Hash] options the options to initialize an instance of Gle.
|
|
46
|
+
# @option options [String] :grant_type
|
|
47
|
+
# @option options [String] :redirect_uri
|
|
48
|
+
# @option options [String] :code
|
|
49
|
+
# @option options [String] :refresh_token
|
|
50
|
+
def initialize(options = {})
|
|
51
|
+
@tokens_body = options
|
|
52
|
+
@tokens_body[:client_id] = Yt.configuration.client_id
|
|
53
|
+
@tokens_body[:client_secret] = Yt.configuration.client_secret
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# @return [Boolean] whether the authentication was revoked.
|
|
57
|
+
def revoke
|
|
58
|
+
!!Yt::HTTPRequest.new(revoke_params).run
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# @return [String] the email of an authenticated Google account.
|
|
62
|
+
def email
|
|
63
|
+
if Yt.configuration.mock_auth_email
|
|
64
|
+
if Yt.configuration.mock_auth_email.eql? 'invalid-email'
|
|
65
|
+
raise Yt::HTTPError, 'Malformed auth code'
|
|
66
|
+
else
|
|
67
|
+
Yt.configuration.mock_auth_email
|
|
68
|
+
end
|
|
69
|
+
else
|
|
70
|
+
profile['email']
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# @return [String] the access token of an authenticated Google account.
|
|
75
|
+
def access_token
|
|
76
|
+
tokens['access_token']
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# @return [String] the refresh token of an authenticated Google account.
|
|
80
|
+
def refresh_token
|
|
81
|
+
tokens['refresh_token']
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Placeholder method that can be invoked after a refresh token is used
|
|
85
|
+
# to generate a new access token. Applications can override this method,
|
|
86
|
+
# for instance to store the new token in a database
|
|
87
|
+
def access_token_was_refreshed
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
private
|
|
91
|
+
|
|
92
|
+
def self.url_params(options)
|
|
93
|
+
{}.tap do |params|
|
|
94
|
+
params[:client_id] = Yt.configuration.client_id
|
|
95
|
+
params[:scope] = scope_for(options.fetch :scopes, [])
|
|
96
|
+
params[:access_type] = :offline
|
|
97
|
+
params[:approval_prompt] = options[:force] ? :force : :auto
|
|
98
|
+
params[:redirect_uri] = options[:redirect_uri]
|
|
99
|
+
params[:response_type] = :code
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def self.scope_for(scopes)
|
|
104
|
+
['userinfo.email'].concat(scopes).map do |scope|
|
|
105
|
+
"https://www.googleapis.com/auth/#{scope}"
|
|
106
|
+
end.join(' ')
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# @return [Hash] the tokens of an authenticated Google account.
|
|
110
|
+
def tokens
|
|
111
|
+
@tokens ||= Yt::HTTPRequest.new(tokens_params).run.body
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# @return [Hash] the profile of an authenticated Google account.
|
|
115
|
+
def profile
|
|
116
|
+
decoded_tokens = JWT.decode tokens['id_token'], nil, false
|
|
117
|
+
decoded_tokens[0]
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def tokens_params
|
|
121
|
+
{}.tap do |params|
|
|
122
|
+
params[:host] = 'oauth2.googleapis.com'
|
|
123
|
+
params[:path] = '/token'
|
|
124
|
+
params[:method] = :post
|
|
125
|
+
params[:request_format] = :form
|
|
126
|
+
params[:body] = @tokens_body
|
|
127
|
+
params[:error_message] = ->(code) { error_message_for code }
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def revoke_params
|
|
132
|
+
{}.tap do |params|
|
|
133
|
+
params[:host] = 'oauth2.googleapis.com'
|
|
134
|
+
params[:path] = '/revoke'
|
|
135
|
+
params[:params] = {token: refresh_token || access_token}
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def error_message_for(code)
|
|
140
|
+
key = @tokens_body[:grant_type].to_s.tr '_', ' '
|
|
141
|
+
JSON(@tokens_body)['error_description'] || "Invalid #{key}."
|
|
142
|
+
end
|
|
143
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: gle
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- claudiob
|
|
8
|
+
bindir: exe
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: yt-support
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '0'
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - ">="
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '0'
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: jwt
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - ">="
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '0'
|
|
33
|
+
type: :runtime
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - ">="
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '0'
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: bundler
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - ">="
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '0'
|
|
47
|
+
type: :development
|
|
48
|
+
prerelease: false
|
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - ">="
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: '0'
|
|
54
|
+
- !ruby/object:Gem::Dependency
|
|
55
|
+
name: rspec
|
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
|
57
|
+
requirements:
|
|
58
|
+
- - ">="
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: '0'
|
|
61
|
+
type: :development
|
|
62
|
+
prerelease: false
|
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - ">="
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: '0'
|
|
68
|
+
- !ruby/object:Gem::Dependency
|
|
69
|
+
name: rake
|
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
|
71
|
+
requirements:
|
|
72
|
+
- - ">="
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
version: '0'
|
|
75
|
+
type: :development
|
|
76
|
+
prerelease: false
|
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - ">="
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: '0'
|
|
82
|
+
- !ruby/object:Gem::Dependency
|
|
83
|
+
name: coveralls
|
|
84
|
+
requirement: !ruby/object:Gem::Requirement
|
|
85
|
+
requirements:
|
|
86
|
+
- - ">="
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: '0'
|
|
89
|
+
type: :development
|
|
90
|
+
prerelease: false
|
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
92
|
+
requirements:
|
|
93
|
+
- - ">="
|
|
94
|
+
- !ruby/object:Gem::Version
|
|
95
|
+
version: '0'
|
|
96
|
+
- !ruby/object:Gem::Dependency
|
|
97
|
+
name: yard
|
|
98
|
+
requirement: !ruby/object:Gem::Requirement
|
|
99
|
+
requirements:
|
|
100
|
+
- - ">="
|
|
101
|
+
- !ruby/object:Gem::Version
|
|
102
|
+
version: '0'
|
|
103
|
+
type: :development
|
|
104
|
+
prerelease: false
|
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
106
|
+
requirements:
|
|
107
|
+
- - ">="
|
|
108
|
+
- !ruby/object:Gem::Version
|
|
109
|
+
version: '0'
|
|
110
|
+
description: |-
|
|
111
|
+
Gle makes it easy to authenticate users to any
|
|
112
|
+
web application by means of their Google account.
|
|
113
|
+
email:
|
|
114
|
+
- claudiob@users.noreply.github.com
|
|
115
|
+
executables: []
|
|
116
|
+
extensions: []
|
|
117
|
+
extra_rdoc_files: []
|
|
118
|
+
files:
|
|
119
|
+
- ".gitignore"
|
|
120
|
+
- ".rspec"
|
|
121
|
+
- ".travis.yml"
|
|
122
|
+
- CHANGELOG.md
|
|
123
|
+
- Gemfile
|
|
124
|
+
- LICENSE.txt
|
|
125
|
+
- README.md
|
|
126
|
+
- Rakefile
|
|
127
|
+
- bin/console
|
|
128
|
+
- bin/setup
|
|
129
|
+
- gle.gemspec
|
|
130
|
+
- lib/gle.rb
|
|
131
|
+
homepage: https://github.com/claudiob/gle
|
|
132
|
+
licenses:
|
|
133
|
+
- MIT
|
|
134
|
+
metadata: {}
|
|
135
|
+
rdoc_options: []
|
|
136
|
+
require_paths:
|
|
137
|
+
- lib
|
|
138
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
139
|
+
requirements:
|
|
140
|
+
- - ">="
|
|
141
|
+
- !ruby/object:Gem::Version
|
|
142
|
+
version: 2.2.2
|
|
143
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
144
|
+
requirements:
|
|
145
|
+
- - ">="
|
|
146
|
+
- !ruby/object:Gem::Version
|
|
147
|
+
version: '0'
|
|
148
|
+
requirements: []
|
|
149
|
+
rubygems_version: 4.0.3
|
|
150
|
+
specification_version: 4
|
|
151
|
+
summary: Google Authentication Ruby client
|
|
152
|
+
test_files: []
|