yt-auth 0.2.3 → 0.3.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
  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