zendesk2 0.2.4 → 0.2.5
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.
- data/.travis.yml +4 -0
- data/Gemfile +2 -0
- data/lib/zendesk2/client/models/user.rb +34 -0
- data/lib/zendesk2/client.rb +9 -7
- data/lib/zendesk2/version.rb +1 -1
- data/lib/zendesk2.rb +1 -1
- data/spec/config_spec.rb +17 -0
- data/spec/users_spec.rb +17 -2
- data/zendesk2.gemspec +1 -0
- metadata +19 -1
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -93,6 +93,7 @@ class Zendesk2::Client::User < Zendesk2::Model
|
|
93
93
|
# @param [Time] timestamp time sent with intial handshake
|
94
94
|
# @option options [String] :return_to (nil) url to return to after handshake
|
95
95
|
# @return [String] remote authentication login url
|
96
|
+
# Using this method requires you to implement the additional (user-defined) /handshake endpoint
|
96
97
|
# @see http://www.zendesk.com/support/api/remote-authentication
|
97
98
|
def login_url(timestamp, options={})
|
98
99
|
requires :name, :email
|
@@ -120,6 +121,39 @@ class Zendesk2::Client::User < Zendesk2::Model
|
|
120
121
|
uri.to_s
|
121
122
|
end
|
122
123
|
|
124
|
+
# @option options [String] :return_to (nil) url to return to after initial auth
|
125
|
+
# @return [String] url to redirect your user's browser to for login
|
126
|
+
# @see https://support.zendesk.com/entries/23675367-Setting-up-single-sign-on-with-JWT-JSON-Web-Token-
|
127
|
+
# Cargo-culted from: https://github.com/zendesk/zendesk_jwt_sso_examples/blob/master/ruby_on_rails_jwt.rb
|
128
|
+
def jwt_login_url(options = {})
|
129
|
+
requires :name, :email
|
130
|
+
|
131
|
+
return_to = options[:return_to]
|
132
|
+
jwt_token = self.connection.jwt_token || options[:jwt_token]
|
133
|
+
|
134
|
+
uri = Addressable::URI.parse(self.connection.url)
|
135
|
+
uri.path = "/access/jwt"
|
136
|
+
|
137
|
+
iat = Time.now.to_i
|
138
|
+
jti = "#{iat}/#{rand(36**64).to_s(36)}"
|
139
|
+
payload = JWT.encode({
|
140
|
+
:iat => iat, # Seconds since epoch, determine when this token is stale
|
141
|
+
:jti => jti, # Unique token id, helps prevent replay attacks
|
142
|
+
:name => self.name,
|
143
|
+
:email => self.email,
|
144
|
+
}, jwt_token)
|
145
|
+
|
146
|
+
query_values = {
|
147
|
+
'jwt' => payload
|
148
|
+
}
|
149
|
+
unless Zendesk2.blank?(return_to)
|
150
|
+
query_values['return_to'] = return_to
|
151
|
+
end
|
152
|
+
uri.query_values = query_values
|
153
|
+
|
154
|
+
uri.to_s
|
155
|
+
end
|
156
|
+
|
123
157
|
# @return [Zendesk2::Client::Tickets] tickets this user requested
|
124
158
|
def tickets
|
125
159
|
requires :identity
|
data/lib/zendesk2/client.rb
CHANGED
@@ -92,11 +92,11 @@ class Zendesk2::Client < Cistern::Service
|
|
92
92
|
request :update_user
|
93
93
|
request :update_user_identity
|
94
94
|
|
95
|
-
recognizes :url, :subdomain, :host, :port, :path, :scheme, :logger, :adapter, :username, :password, :token
|
95
|
+
recognizes :url, :subdomain, :host, :port, :path, :scheme, :logger, :adapter, :username, :password, :token, :jwt_token
|
96
96
|
|
97
97
|
class Real
|
98
98
|
|
99
|
-
attr_accessor :username, :url, :token, :logger
|
99
|
+
attr_accessor :username, :url, :token, :logger, :jwt_token
|
100
100
|
|
101
101
|
def initialize(options={})
|
102
102
|
url = options[:url] || Zendesk2.defaults[:url] || begin
|
@@ -116,13 +116,14 @@ class Zendesk2::Client < Cistern::Service
|
|
116
116
|
adapter = options[:adapter] || :net_http
|
117
117
|
connection_options = options[:connection_options] || {ssl: {verify: false}}
|
118
118
|
@username = options[:username] || Zendesk2.defaults[:username]
|
119
|
-
token
|
119
|
+
@token = options[:token] || Zendesk2.defaults[:token]
|
120
120
|
password = options[:password] || Zendesk2.defaults[:password]
|
121
|
-
@auth_token = password || token
|
122
|
-
@username += "/token" if @auth_token == token
|
121
|
+
@auth_token = password || @token
|
122
|
+
@username += "/token" if @auth_token == @token
|
123
|
+
@jwt_token = options[:jwt_token]
|
123
124
|
|
124
125
|
raise "Missing required options: :username" unless @username
|
125
|
-
raise "Missing required options: :password or :token" unless password || token
|
126
|
+
raise "Missing required options: :password or :token" unless password || @token
|
126
127
|
|
127
128
|
@connection = Faraday.new({url: @url}.merge(connection_options)) do |builder|
|
128
129
|
# response
|
@@ -159,7 +160,7 @@ class Zendesk2::Client < Cistern::Service
|
|
159
160
|
|
160
161
|
class Mock
|
161
162
|
|
162
|
-
attr_reader :username, :url, :token
|
163
|
+
attr_reader :username, :url, :token, :jwt_token
|
163
164
|
|
164
165
|
def self.data
|
165
166
|
@data ||= {
|
@@ -203,6 +204,7 @@ class Zendesk2::Client < Cistern::Service
|
|
203
204
|
@path = URI.parse(url).path
|
204
205
|
@username, @password = options[:username], options[:password]
|
205
206
|
@token = options[:token]
|
207
|
+
@jwt_token = options[:jwt_token]
|
206
208
|
|
207
209
|
@current_user ||= self.create_user("email" => @username, "name" => "Mock Agent").body["user"]
|
208
210
|
@current_user_identity ||= self.data[:identities].values.first
|
data/lib/zendesk2/version.rb
CHANGED
data/lib/zendesk2.rb
CHANGED
data/spec/config_spec.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "client" do
|
4
|
+
|
5
|
+
it "can be configured" do
|
6
|
+
client = Zendesk2::Client.new(:url => "https://myzen.zendesk.com",
|
7
|
+
:username => "person@place.com",
|
8
|
+
:password => "wickedsecure",
|
9
|
+
:token => "12345678901234567890",
|
10
|
+
:jwt_token => "234823472398472938423234")
|
11
|
+
client.url.should eq "https://myzen.zendesk.com"
|
12
|
+
client.username.should eq "person@place.com"
|
13
|
+
client.token.should eq "12345678901234567890"
|
14
|
+
client.jwt_token.should eq "234823472398472938423234"
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
data/spec/users_spec.rb
CHANGED
@@ -120,10 +120,25 @@ describe "users" do
|
|
120
120
|
user.reload.email.should == original_email
|
121
121
|
end
|
122
122
|
|
123
|
-
it "should form login url" do
|
123
|
+
it "should form 'legacy' login url" do
|
124
124
|
return_to = "http://engineyard.com"
|
125
|
-
uri = Addressable::URI.parse(user.login_url(Time.now.to_s, return_to: return_to))
|
125
|
+
uri = Addressable::URI.parse(user.login_url(Time.now.to_s, return_to: return_to, token: "in-case-you-dont-have-it-in ~/.zendesk2 (aka ci)"))
|
126
126
|
uri.query_values["return_to"].should == return_to
|
127
|
+
uri.query_values["name"].should eq user.name
|
128
|
+
uri.query_values["email"].should eq user.email
|
129
|
+
uri.query_values["hash"].should_not be_nil
|
127
130
|
end
|
131
|
+
|
132
|
+
it "should form jwt login url" do
|
133
|
+
return_to = "http://engineyard.com"
|
134
|
+
uri = Addressable::URI.parse(user.jwt_login_url(return_to: return_to, jwt_token: "in-case-you-dont-have-it-in ~/.zendesk2 (aka ci)"))
|
135
|
+
uri.query_values["return_to"].should == return_to
|
136
|
+
uri.query_values["name"].should be_nil
|
137
|
+
uri.query_values["email"].should be_nil
|
138
|
+
uri.query_values["jwt"].should_not be_nil
|
139
|
+
|
140
|
+
#TODO: try JWT.decode
|
141
|
+
end
|
142
|
+
|
128
143
|
end
|
129
144
|
end
|
data/zendesk2.gemspec
CHANGED
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: zendesk2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.2.
|
5
|
+
version: 0.2.5
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Josh Lane
|
@@ -75,6 +75,22 @@ dependencies:
|
|
75
75
|
version: '0'
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: jwt
|
80
|
+
version_requirements: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
none: false
|
88
|
+
requirements:
|
89
|
+
- - ! '>='
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
type: :runtime
|
93
|
+
prerelease: false
|
78
94
|
description: Zendesk V2 API client
|
79
95
|
email:
|
80
96
|
- me@joshualane.com
|
@@ -186,6 +202,7 @@ files:
|
|
186
202
|
- lib/zendesk2/searchable.rb
|
187
203
|
- lib/zendesk2/version.rb
|
188
204
|
- spec/categories_spec.rb
|
205
|
+
- spec/config_spec.rb
|
189
206
|
- spec/forums_spec.rb
|
190
207
|
- spec/groups_spec.rb
|
191
208
|
- spec/organizations_spec.rb
|
@@ -224,6 +241,7 @@ specification_version: 3
|
|
224
241
|
summary: Zendesk V2 API client
|
225
242
|
test_files:
|
226
243
|
- spec/categories_spec.rb
|
244
|
+
- spec/config_spec.rb
|
227
245
|
- spec/forums_spec.rb
|
228
246
|
- spec/groups_spec.rb
|
229
247
|
- spec/organizations_spec.rb
|