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 CHANGED
@@ -7,3 +7,7 @@ bundler_args: "--without development"
7
7
  before_install:
8
8
  - "gem install bundler -v 1.2.3"
9
9
  script: "bundle exec rake --trace"
10
+ notifications:
11
+ email:
12
+ on_success: never
13
+ on_failure: change
data/Gemfile CHANGED
@@ -4,6 +4,8 @@ source 'https://rubygems.org'
4
4
  gemspec
5
5
 
6
6
  gem 'rake'
7
+ #To avoid warnings from JWT
8
+ gem 'json', '~> 1.7.7'
7
9
 
8
10
  group :test do
9
11
  gem 'guard-rspec'
@@ -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
@@ -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 = options[:token] || Zendesk2.defaults[: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
@@ -1,3 +1,3 @@
1
1
  module Zendesk2
2
- VERSION = "0.2.4"
2
+ VERSION = "0.2.5"
3
3
  end
data/lib/zendesk2.rb CHANGED
@@ -5,7 +5,7 @@ require 'addressable/uri'
5
5
  require 'cistern'
6
6
  require 'faraday'
7
7
  require 'faraday_middleware'
8
-
8
+ require 'jwt'
9
9
  # stdlib
10
10
  require 'forwardable'
11
11
  require 'logger'
@@ -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
@@ -19,4 +19,5 @@ Gem::Specification.new do |gem|
19
19
  gem.add_dependency "faraday"
20
20
  gem.add_dependency "faraday_middleware"
21
21
  gem.add_dependency "addressable"
22
+ gem.add_dependency "jwt"
22
23
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: zendesk2
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.2.4
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