zendesk2 0.2.4 → 0.2.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|