pusher-platform 0.6.0 → 0.7.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
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3f8fa664613e2b4227ca919b6412f448a41b83b6879907344118badaaf31bc6d
|
4
|
+
data.tar.gz: f6e2d2ed0058baa06c8b1cb0cb6d258b33a1b19ab4a54ebf903203dfb0327cf5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 01366e9a6c2d267985f5b92d8e88a1d37aaf553caf12fe38eb397ecc0718e82b557efcb193b72eeb960932f2085bfa67b4cf9607d292207cbfc2cdb87efc25ba
|
7
|
+
data.tar.gz: cc826fbcdeed2ac0fe95970306e9bc8b1122101d83d998ceb332f45a64fea7be230c8a4fe40f193c52fbb3754473a42e6bfe7515e347ed40e85141686e9407fe
|
@@ -1,7 +1,8 @@
|
|
1
1
|
require 'jwt'
|
2
2
|
require 'rack'
|
3
|
+
require_relative './error_response'
|
3
4
|
|
4
|
-
module
|
5
|
+
module PusherPlatform
|
5
6
|
TOKEN_EXPIRY = 24*60*60
|
6
7
|
|
7
8
|
class Authenticator
|
@@ -11,25 +12,13 @@ module Pusher
|
|
11
12
|
@key_secret = key_secret
|
12
13
|
end
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
# @param request [Rack::Request] the request to authenticate
|
18
|
-
# @return the response object
|
19
|
-
def authenticate(request, options)
|
20
|
-
form_data = Rack::Utils.parse_nested_query request.body.read
|
21
|
-
grant_type = form_data['grant_type']
|
15
|
+
def authenticate(auth_payload, options)
|
16
|
+
authenticate_based_on_grant_type(auth_payload, options)
|
17
|
+
end
|
22
18
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
old_refresh_jwt = form_data['refresh_token']
|
27
|
-
return authenticate_with_refresh_token(old_refresh_jwt, options)
|
28
|
-
else
|
29
|
-
return response(401, {
|
30
|
-
error: "unsupported_grant_type"
|
31
|
-
})
|
32
|
-
end
|
19
|
+
def authenticate_with_request(request, options)
|
20
|
+
auth_data = Rack::Utils.parse_nested_query request.body.read
|
21
|
+
authenticate_based_on_grant_type(auth_data, options)
|
33
22
|
end
|
34
23
|
|
35
24
|
def generate_access_token(options)
|
@@ -53,66 +42,82 @@ module Pusher
|
|
53
42
|
|
54
43
|
private
|
55
44
|
|
45
|
+
def authenticate_based_on_grant_type(auth_data, options)
|
46
|
+
grant_type = auth_data['grant_type'] || auth_data[:grant_type]
|
47
|
+
|
48
|
+
if grant_type == "client_credentials"
|
49
|
+
return authenticate_with_client_credentials(options)
|
50
|
+
elsif grant_type == "refresh_token"
|
51
|
+
refresh_token = auth_data['refresh_token'] || auth_data[:refresh_token]
|
52
|
+
return authenticate_with_refresh_token(refresh_token, options)
|
53
|
+
else
|
54
|
+
err = ErrorResponse.new({
|
55
|
+
status: 401,
|
56
|
+
error: 'invalid_grant_type',
|
57
|
+
error_description: "Unsupported grant_type #{grant_type}"
|
58
|
+
})
|
59
|
+
return err
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
56
63
|
def authenticate_with_client_credentials(options)
|
57
|
-
return
|
64
|
+
return new_token_pair(options)
|
58
65
|
end
|
59
66
|
|
60
|
-
def authenticate_with_refresh_token(
|
67
|
+
def authenticate_with_refresh_token(refresh_token, options)
|
61
68
|
old_refresh_token = begin
|
62
|
-
JWT.decode(
|
69
|
+
JWT.decode(refresh_token, @key_secret, true, {
|
63
70
|
iss: "api_keys/#{@key_id}",
|
64
71
|
verify_iss: true,
|
65
72
|
}).first
|
66
73
|
rescue => e
|
67
74
|
error_description = if e.is_a?(JWT::InvalidIssuerError)
|
68
|
-
"
|
75
|
+
"Refresh token issuer is invalid"
|
69
76
|
elsif e.is_a?(JWT::ImmatureSignature)
|
70
|
-
"
|
77
|
+
"Refresh token is not valid yet"
|
71
78
|
elsif e.is_a?(JWT::ExpiredSignature)
|
72
|
-
"
|
79
|
+
"Refresh tokan has expired"
|
73
80
|
else
|
74
|
-
"
|
81
|
+
"Refresh token is invalid"
|
75
82
|
end
|
76
83
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
84
|
+
err = ErrorResponse.new({
|
85
|
+
status: 401,
|
86
|
+
error: 'invalid_refresh_token',
|
87
|
+
error_description: error_description
|
81
88
|
})
|
89
|
+
return err
|
82
90
|
end
|
83
91
|
|
84
92
|
if old_refresh_token["refresh"] != true
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
93
|
+
err = ErrorResponse.new({
|
94
|
+
status: 401,
|
95
|
+
error: 'invalid_refresh_token',
|
96
|
+
error_description: "Refresh token does not have a refresh claim"
|
89
97
|
})
|
98
|
+
return err
|
90
99
|
end
|
91
100
|
|
92
101
|
if options[:user_id] != old_refresh_token["sub"]
|
93
|
-
return
|
94
|
-
error: "invalid_grant",
|
95
|
-
error_description: "refresh token has an invalid user id",
|
96
|
-
# TODO error_uri
|
97
|
-
})
|
102
|
+
return ErrorResponse.new(401, "refresh token has an invalid user id")
|
98
103
|
end
|
99
104
|
|
100
|
-
return
|
105
|
+
return new_token_pair(options)
|
101
106
|
end
|
102
107
|
|
103
108
|
# Creates a payload dictionary made out of access and refresh token pair and TTL for the access token.
|
104
109
|
#
|
105
110
|
# @param user_id [String] optional id of the user, ignore for anonymous users
|
106
111
|
# @return [Hash] Payload as a hash
|
107
|
-
def
|
112
|
+
def new_token_pair(options)
|
108
113
|
access_token = generate_access_token(options)[:token]
|
109
114
|
refresh_token = generate_refresh_token(options)[:token]
|
110
|
-
|
115
|
+
{
|
111
116
|
access_token: access_token,
|
112
117
|
token_type: "bearer",
|
113
118
|
expires_in: TOKEN_EXPIRY,
|
114
119
|
refresh_token: refresh_token,
|
115
|
-
}
|
120
|
+
}
|
116
121
|
end
|
117
122
|
|
118
123
|
def generate_refresh_token(options)
|
@@ -128,12 +133,5 @@ module Pusher
|
|
128
133
|
|
129
134
|
{ token: JWT.encode(claims, @key_secret, 'HS256') }
|
130
135
|
end
|
131
|
-
|
132
|
-
def response(status, body)
|
133
|
-
return {
|
134
|
-
status: status,
|
135
|
-
json: body,
|
136
|
-
}
|
137
|
-
end
|
138
136
|
end
|
139
137
|
end
|
@@ -1,15 +1,35 @@
|
|
1
|
-
|
1
|
+
require_relative './common'
|
2
|
+
|
3
|
+
module PusherPlatform
|
2
4
|
class ErrorResponse < Error
|
3
|
-
|
5
|
+
attr_reader :status, :headers, :error_description, :error, :error_uri
|
4
6
|
|
5
|
-
def initialize(
|
6
|
-
@status = status
|
7
|
-
@headers = headers
|
8
|
-
@
|
7
|
+
def initialize(options)
|
8
|
+
@status = options[:status]
|
9
|
+
@headers = options[:headers] || {}
|
10
|
+
@error = options[:error]
|
11
|
+
@error_description = options[:error_description]
|
12
|
+
@error_uri = options[:error_uri]
|
9
13
|
end
|
10
14
|
|
11
15
|
def to_s
|
12
|
-
"
|
16
|
+
"PusherPlatform::ErrorResponse - status: #{@status} description: #{@error_description}"
|
17
|
+
end
|
18
|
+
|
19
|
+
def as_json(options = {})
|
20
|
+
json = {
|
21
|
+
status: @status,
|
22
|
+
headers: @headers,
|
23
|
+
error: @error,
|
24
|
+
error_description: @error_description,
|
25
|
+
}
|
26
|
+
json[:error_uri] = @error_uri unless @error_uri.nil?
|
27
|
+
json
|
13
28
|
end
|
29
|
+
|
30
|
+
def to_json(*options)
|
31
|
+
as_json(*options).to_json(*options)
|
32
|
+
end
|
33
|
+
|
14
34
|
end
|
15
35
|
end
|
@@ -3,7 +3,7 @@ require_relative './base_client'
|
|
3
3
|
require_relative './common'
|
4
4
|
require_relative './error_response'
|
5
5
|
|
6
|
-
module
|
6
|
+
module PusherPlatform
|
7
7
|
|
8
8
|
HOST_BASE = 'pusherplatform.io'
|
9
9
|
|
@@ -52,8 +52,12 @@ module Pusher
|
|
52
52
|
@client.request(options)
|
53
53
|
end
|
54
54
|
|
55
|
-
def authenticate(
|
56
|
-
@authenticator.authenticate(
|
55
|
+
def authenticate(auth_payload, options)
|
56
|
+
@authenticator.authenticate(auth_payload, options)
|
57
|
+
end
|
58
|
+
|
59
|
+
def authenticate_with_request(request, options)
|
60
|
+
@authenticator.authenticate_with_request(request, options)
|
57
61
|
end
|
58
62
|
|
59
63
|
def generate_access_token(options)
|
data/lib/pusher-platform.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
require_relative 'pusher-platform/instance'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pusher-platform
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pusher
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-04-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: excon
|
@@ -90,7 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
90
90
|
version: '0'
|
91
91
|
requirements: []
|
92
92
|
rubyforge_project:
|
93
|
-
rubygems_version: 2.
|
93
|
+
rubygems_version: 2.7.3
|
94
94
|
signing_key:
|
95
95
|
specification_version: 4
|
96
96
|
summary: Pusher Platform Ruby SDK
|