yt-auth 0.2.3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: afed44e061a6b8add2141e57e0df78187b79e368
4
- data.tar.gz: af818f5dd4c4a129d835887403c44315cb9e133e
3
+ metadata.gz: 90acfd2ff7bdc68980c0c12c9e72761981cecb55
4
+ data.tar.gz: 863100fe5cfcf1429428980fd18f0df8c8b1c2c5
5
5
  SHA512:
6
- metadata.gz: 77fd0226d1aa626a4e82a9245fa1a5a8c6a86303f1deca4d46b5bc29bedf6571e2568737019e2361dd9c1fbe73f009037bfc9fe730a09a99080e87525322b89b
7
- data.tar.gz: 0b7b546dcaa6f80dc4e25524b7c5cc65860860bb16466a3e65240ba0adff94f26f1062e7c7990985075500baa7114b423b6d6070521c5d5c5545ddadd2c837e2
6
+ metadata.gz: 21301ea2bd24299adc34767cdbc33d21fd96c622bd562ded4c420a4ccfd237a32b3c5b708a9e64ae2dffdd1e1296fcb3ff041eff71db8e5ef0da564f0299f2b8
7
+ data.tar.gz: 1da658c63db79a7908f6ba1ba11052e1835eb6bc1b82b5753be318b4d5c2a002beb547406f73280094e4ee405af622dd74d3ca87948f2f9d1efcb66d050d3cb0
@@ -6,6 +6,21 @@ For more information about changelogs, check
6
6
  [Keep a Changelog](http://keepachangelog.com) and
7
7
  [Vandamme](http://tech-angels.github.io/vandamme).
8
8
 
9
+ ## 0.3.0 - 2017-08-25
10
+
11
+ **How to upgrade**
12
+
13
+ If your code uses `Yt::Auth#url` then you must use `Yt::Auth.url_for` instead.
14
+ If your code uses `Yt::Auth.new(code:)` then you must use `Yt::Auth.create(code:)` instead.
15
+ If your code uses `Yt::Auth.new(refresh_token:)` then you must use `Yt::Auth.find_by(refresh_token:)` instead.
16
+
17
+ * [ENHANCEMENT] Extract `Auth#url` into `Auth.url_for`
18
+ * [ENHANCEMENT] Rename `Auth.new(code:)` into `Auth.create(code:)`
19
+ * [ENHANCEMENT] Rename `Auth.new(refresh_token:)` into `Auth.create(refresh_token:)`
20
+ * [FEATURE] Yt::Auth.url_for now accepts the scope to authenticate
21
+ * [FEATURE] Yt::Auth.url_for now accepts an option to force re-authentication
22
+ * [FEATURE] Add `Auth#revoke` to revoke a refresh token
23
+
9
24
  ## 0.2.3 - 2017-08-24
10
25
 
11
26
  * [FEATURE] Add the ability to generate access token from a refresh token
data/README.md CHANGED
@@ -16,48 +16,83 @@ The **source code** is available on [GitHub](https://github.com/fullscreen/yt-au
16
16
  [![Online docs](http://img.shields.io/badge/docs-✓-green.svg)](http://www.rubydoc.info/gems/yt-auth/frames)
17
17
  [![Gem Version](http://img.shields.io/gem/v/yt-auth.svg)](http://rubygems.org/gems/yt-auth)
18
18
 
19
- The Yt::Auth class provides three public methods: `url`, `email`, and `access_token`.
19
+ Yt::Auth.url_for
20
+ ----------------
20
21
 
21
- Yt::Auth#url
22
- ------------
23
-
24
- With the `url` method, you can obtain a URL where to redirect users who need to
25
- authenticate with their Google account in order to use your application:
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:
26
25
 
27
26
  ```ruby
28
27
  redirect_uri = 'https://example.com/auth' # REPLACE WITH REAL ONE
29
- Yt::Auth.new(redirect_uri: redirect_uri).url
28
+ scope = %i(yt-analytics.readonly youtube)
29
+ Yt::Auth.url_for(redirect_uri: redirect_uri, scope: scope, force: true)
30
30
  # => https://accounts.google.com/o/oauth2/auth?client_id=...&scope=email&redirect_uri=https%3A%2F%2Fexample.com%2Fauth&response_type=code
31
31
  ```
32
32
 
33
- Yt::Auth#email
34
- --------------
33
+ Yt::Auth.create
34
+ ----------------
35
35
 
36
36
  After users have authenticated with their Google account, they will be
37
37
  redirected to the `redirect_uri` you indicated, with an extra `code` query
38
38
  parameter, e.g. `https://example.com/auth?code=1234`
39
39
 
40
- With the `email` method, you can obtain the verified email of the users:
40
+ With the `create` class method, you can create an instance for that
41
+ authentication:
41
42
 
42
43
  ```ruby
43
44
  redirect_uri = 'https://example.com/auth' # REPLACE WITH REAL ONE
44
- code = '1234' # REPLACE WITH REAL ONE
45
- Yt::Auth.new(redirect_uri: redirect_uri, code: code).email
45
+ code = 'dfwe7r9djd234ffdjf3009dfknfd98re' # REPLACE WITH REAL ONE
46
+ auth = Yt::Auth.create(redirect_uri: redirect_uri, code: code)
47
+ # => #<Yt::Auth:0x007fe61d…>
48
+ ```
49
+
50
+ Yt::Auth#email
51
+ --------------
52
+
53
+ Once you have an instance of `Yt::Auth`, you can obtain the verified email
54
+ of the authenticated user:
55
+
56
+ ```ruby
57
+ auth.email
46
58
  # => "user@example.com"
47
59
  ```
48
60
 
49
61
  Yt::Auth#access_token
50
62
  ---------------------
51
63
 
52
- Similarly, with the `access_token` method, you can obtain an access token of the users:
64
+ Once you have an instance of `Yt::Auth`, you can also obtain the access token
65
+ of the authenticated user:
53
66
 
54
67
  ```ruby
55
- redirect_uri = 'https://example.com/auth' # REPLACE WITH REAL ONE
56
- code = '1234' # REPLACE WITH REAL ONE
57
- Yt::Auth.new(redirect_uri: redirect_uri, code: code).access_token
58
- # => "ya29.GltbBLXt74GrwX8S_xr70aX"
68
+ auth.access_token
69
+ # => "ya29.df8er8e9r89er"
59
70
  ```
60
71
 
72
+ Yt::Auth#refresh_token
73
+ ----------------------
74
+
75
+ Once you have an instance of `Yt::Auth`, you can also obtain the refresh token
76
+ of the authenticated user:
77
+
78
+ ```ruby
79
+ auth.refresh_token
80
+ # => "sdf7f7erre98df"
81
+ ```
82
+
83
+ Yt::Auth.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 = Auth.find_by(refresh_token: "sdf7f7erre98df")
91
+ auth.email
92
+ # => "user@example.com"
93
+ ```
94
+
95
+
61
96
  Yt::HTTPError
62
97
  -------------
63
98
 
@@ -13,20 +13,48 @@ module Yt
13
13
  # after they have completed the Google OAuth flow.
14
14
  # @option options [String] :code A single-use authorization code provided
15
15
  # by Google OAuth to obtain an access token to access Google API.
16
- def initialize(options = {})
17
- @redirect_uri = options[:redirect_uri]
18
- @code = options[:code]
19
- @refresh_token = options[:refresh_token]
16
+ def self.create(options = {})
17
+ new options.merge(grant_type: :authorization_code)
18
+ end
19
+
20
+ # @param [Hash] options the options to initialize an instance of Yt::Auth.
21
+ # @option options [String] :refresh_token A multi-use refresh token to
22
+ # obtain an access token to access Google API.
23
+ def self.find_by(options = {})
24
+ new options.merge(grant_type: :refresh_token)
20
25
  end
21
26
 
22
27
  # @return [String] the URL where to authenticate with a Google account.
23
- def url
28
+ # @param [Hash] options the options to initialize an instance of Yt::Auth.
29
+ # @option options [String] :redirect_uri The URI to redirect users to
30
+ # after they have completed the Google OAuth flow.
31
+ # @option options [Boolean] :force whether to force users to re-authenticate
32
+ # an account that was previously authenticated.
33
+ # @option options [Array<String>] :scopes The list of scopes that users
34
+ # are requested to authorize.
35
+ def self.url_for(options = {})
24
36
  host = 'accounts.google.com'
25
37
  path = '/o/oauth2/auth'
26
- query = URI.encode_www_form url_params
38
+ query = URI.encode_www_form url_params(options)
27
39
  URI::HTTPS.build(host: host, path: path, query: query).to_s
28
40
  end
29
41
 
42
+ # @param [Hash] options the options to initialize an instance of Yt::Auth.
43
+ # @option options [String] :grant_type
44
+ # @option options [String] :redirect_uri
45
+ # @option options [String] :code
46
+ # @option options [String] :refresh_token
47
+ def initialize(options = {})
48
+ @tokens_body = options
49
+ @tokens_body[:client_id] = Yt.configuration.client_id
50
+ @tokens_body[:client_secret] = Yt.configuration.client_secret
51
+ end
52
+
53
+ # @return [Boolean] whether the authentication was revoked.
54
+ def revoke
55
+ !!HTTPRequest.new(revoke_params).run
56
+ end
57
+
30
58
  # @return [String] the email of an authenticated Google account.
31
59
  def email
32
60
  profile['email']
@@ -37,21 +65,33 @@ module Yt
37
65
  tokens['access_token']
38
66
  end
39
67
 
68
+ # @return [String] the refresh token of an authenticated Google account.
69
+ def refresh_token
70
+ tokens['refresh_token']
71
+ end
72
+
40
73
  private
41
74
 
42
- def url_params
75
+ def self.url_params(options)
43
76
  {}.tap do |params|
44
77
  params[:client_id] = Yt.configuration.client_id
45
- params[:scope] = :email
78
+ params[:scope] = scope_for(options.fetch :scopes, [])
46
79
  params[:access_type] = :offline
47
- params[:redirect_uri] = @redirect_uri
80
+ params[:approval_prompt] = options[:force] ? :force : :auto
81
+ params[:redirect_uri] = options[:redirect_uri]
48
82
  params[:response_type] = :code
49
83
  end
50
84
  end
51
85
 
86
+ def self.scope_for(scopes)
87
+ ['userinfo.email'].concat(scopes).map do |scope|
88
+ "https://www.googleapis.com/auth/#{scope}"
89
+ end.join(' ')
90
+ end
91
+
52
92
  # @return [Hash] the tokens of an authenticated Google account.
53
93
  def tokens
54
- HTTPRequest.new(tokens_params).run.body
94
+ @tokens ||= HTTPRequest.new(tokens_params).run.body
55
95
  end
56
96
 
57
97
  # @return [Hash] the profile of an authenticated Google account.
@@ -66,34 +106,22 @@ module Yt
66
106
  params[:path] = '/o/oauth2/token'
67
107
  params[:method] = :post
68
108
  params[:request_format] = :form
69
- params[:body] = tokens_body
70
- params[:error_message] = ->(body) {
71
- JSON(body)['error_description'] || token_error_message
72
- }
109
+ params[:body] = @tokens_body
110
+ params[:error_message] = ->(body) { error_message_for body }
73
111
  end
74
112
  end
75
113
 
76
- def tokens_body
114
+ def revoke_params
77
115
  {}.tap do |params|
78
- params[:client_id] = Yt.configuration.client_id
79
- params[:client_secret] = Yt.configuration.client_secret
80
- if @refresh_token
81
- params[:refresh_token] = @refresh_token
82
- params[:grant_type] = :refresh_token
83
- else
84
- params[:code] = @code
85
- params[:redirect_uri] = @redirect_uri
86
- params[:grant_type] = :authorization_code
87
- end
116
+ params[:host] = 'accounts.google.com'
117
+ params[:path] = '/o/oauth2/revoke'
118
+ params[:params] = {token: refresh_token || access_token}
88
119
  end
89
120
  end
90
121
 
91
- def token_error_message
92
- if @refresh_token
93
- 'Invalid refresh token.'
94
- else
95
- 'Invalid authorization code.'
96
- end
122
+ def error_message_for(body)
123
+ key = @tokens_body[:grant_type].to_s.tr '_', ' '
124
+ JSON(body)['error_description'] || "Invalid #{key}."
97
125
  end
98
126
  end
99
127
  end
@@ -2,6 +2,6 @@ module Yt
2
2
  class Auth
3
3
  # @return [String] the SemVer-compatible gem version.
4
4
  # @see http://semver.org
5
- VERSION = '0.2.3'
5
+ VERSION = '0.3.0'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yt-auth
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Claudio Baccigalupo
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2017-08-24 00:00:00.000000000 Z
12
+ date: 2017-08-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: yt-support