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 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