telesign 1.0.1
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 +7 -0
- data/lib/telesign.rb +305 -0
- data/lib/telesign/rest.rb +181 -0
- metadata +44 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c5e4faab130d077bd865c8b11d76e3873a04646b
|
4
|
+
data.tar.gz: fd647261f558b13ce9908f59bc2afdc2e2ce94e5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 19d28c08bc21a28bd27f33599e71946545f57b46b8139383fbeafbef20b5b75ae8e254fcdffcf55dcb19c6aac7c145c17efb11fc8029d18743964d1bebc3dd29
|
7
|
+
data.tar.gz: 8c14d197c6e50361813cf5f087df058df90f4199d9298cfc31c19308783bbdc85b502254353e24b67dcf525d4d7ff07a4fb832209ee466df5af874fa20620e8e
|
data/lib/telesign.rb
ADDED
@@ -0,0 +1,305 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2016 TeleSign
|
3
|
+
#
|
4
|
+
# TeleSign Ruby SDK REST API endpoints.
|
5
|
+
#
|
6
|
+
# The api module contains Python classes and methods that allow you to
|
7
|
+
# use the Ruby programming language to programmatically access the
|
8
|
+
# Verify and PhoneId TeleSign web services.
|
9
|
+
#
|
10
|
+
|
11
|
+
require 'telesign/rest'
|
12
|
+
|
13
|
+
module Telesign
|
14
|
+
|
15
|
+
module API
|
16
|
+
|
17
|
+
# The PhoneId class exposes services that each provide detailed
|
18
|
+
# information about a specified phone number.
|
19
|
+
class PhoneId < Telesign::API::Rest
|
20
|
+
|
21
|
+
def initialize(customer_id,
|
22
|
+
secret_key,
|
23
|
+
ssl=true,
|
24
|
+
api_host='rest.telesign.com',
|
25
|
+
timeout=nil)
|
26
|
+
|
27
|
+
super(customer_id,
|
28
|
+
secret_key,
|
29
|
+
ssl,
|
30
|
+
api_host,
|
31
|
+
timeout)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Retrieves the standard set of details about the specified phone number.
|
35
|
+
# This includes the type of phone (e.g., land line or mobile), and it's
|
36
|
+
# approximate geographic location.
|
37
|
+
def standard(phone_number,
|
38
|
+
use_case_code=nil,
|
39
|
+
extra=nil,
|
40
|
+
timeout=nil)
|
41
|
+
|
42
|
+
params = {}
|
43
|
+
|
44
|
+
unless use_case_code.nil?
|
45
|
+
params[:ucid] = use_case_code
|
46
|
+
end
|
47
|
+
|
48
|
+
unless extra.nil?
|
49
|
+
params.merge!(extra)
|
50
|
+
end
|
51
|
+
|
52
|
+
execute(Net::HTTP::Get,
|
53
|
+
"/v1/phoneid/standard/#{phone_number}",
|
54
|
+
params,
|
55
|
+
nil,
|
56
|
+
timeout)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Retrieves a score for the specified phone number. This ranks the phone number's
|
60
|
+
# "risk level" on a scale from 0 to 1000, so you can code your web application to
|
61
|
+
# handle particular use cases (e.g., to stop things like chargebacks, identity
|
62
|
+
# theft, fraud, and spam).
|
63
|
+
def score(phone_number,
|
64
|
+
use_case_code,
|
65
|
+
extra=nil,
|
66
|
+
timeout=nil)
|
67
|
+
|
68
|
+
params = {:ucid => use_case_code}
|
69
|
+
|
70
|
+
unless extra.nil?
|
71
|
+
params.merge!(extra)
|
72
|
+
end
|
73
|
+
|
74
|
+
execute(Net::HTTP::Get,
|
75
|
+
"/v1/phoneid/score/#{phone_number}",
|
76
|
+
params,
|
77
|
+
nil,
|
78
|
+
timeout)
|
79
|
+
end
|
80
|
+
|
81
|
+
# In addition to the information retrieved by standard, this service provides the
|
82
|
+
# Name & Address associated with the specified phone number.
|
83
|
+
def contact(phone_number,
|
84
|
+
use_case_code,
|
85
|
+
extra=nil,
|
86
|
+
timeout=nil)
|
87
|
+
|
88
|
+
params = {:ucid => use_case_code}
|
89
|
+
|
90
|
+
unless extra.nil?
|
91
|
+
params.merge!(extra)
|
92
|
+
end
|
93
|
+
|
94
|
+
execute(Net::HTTP::Get,
|
95
|
+
"/v1/phoneid/contact/#{phone_number}",
|
96
|
+
params,
|
97
|
+
nil,
|
98
|
+
timeout)
|
99
|
+
end
|
100
|
+
|
101
|
+
# In addition to the information retrieved by standard, this service provides
|
102
|
+
# actionable data associated with the specified phone number.
|
103
|
+
def live(phone_number,
|
104
|
+
use_case_code,
|
105
|
+
extra=nil,
|
106
|
+
timeout=nil)
|
107
|
+
|
108
|
+
params = {:ucid => use_case_code}
|
109
|
+
|
110
|
+
unless extra.nil?
|
111
|
+
params.merge!(extra)
|
112
|
+
end
|
113
|
+
|
114
|
+
execute(Net::HTTP::Get,
|
115
|
+
"/v1/phoneid/live/#{phone_number}",
|
116
|
+
params,
|
117
|
+
nil,
|
118
|
+
timeout)
|
119
|
+
end
|
120
|
+
|
121
|
+
# In addition to the information retrieved by standard, this service provides
|
122
|
+
# data about potential sim_swaps associated with the specified phone number.
|
123
|
+
def sim_swap(phone_number,
|
124
|
+
use_case_code,
|
125
|
+
extra=nil,
|
126
|
+
timeout=nil)
|
127
|
+
|
128
|
+
params = {:ucid => use_case_code}
|
129
|
+
|
130
|
+
unless extra.nil?
|
131
|
+
params.merge!(extra)
|
132
|
+
end
|
133
|
+
|
134
|
+
execute(Net::HTTP::Get,
|
135
|
+
"/v1/phoneid/sim_swap/check/#{phone_number}",
|
136
|
+
params,
|
137
|
+
nil,
|
138
|
+
timeout)
|
139
|
+
end
|
140
|
+
|
141
|
+
# In addition to the information retrieved by standard, this service provides
|
142
|
+
# information on call forwarding for the phone number provided.
|
143
|
+
def call_forward(phone_number,
|
144
|
+
use_case_code,
|
145
|
+
extra=nil,
|
146
|
+
timeout=nil)
|
147
|
+
|
148
|
+
params = {:ucid => use_case_code}
|
149
|
+
|
150
|
+
unless extra.nil?
|
151
|
+
params.merge!(extra)
|
152
|
+
end
|
153
|
+
|
154
|
+
execute(Net::HTTP::Get,
|
155
|
+
"/v1/phoneid/call_forward/#{phone_number}",
|
156
|
+
params,
|
157
|
+
nil,
|
158
|
+
timeout)
|
159
|
+
end
|
160
|
+
|
161
|
+
end
|
162
|
+
|
163
|
+
# The Verify class exposes several services for sending users a verification
|
164
|
+
# token. You can use this mechanism to simply test whether you can reach users
|
165
|
+
# at the phone number they supplied, or you can have them use the token to
|
166
|
+
# authenticate themselves with your web application.
|
167
|
+
#
|
168
|
+
# This class also exposes a service that is used in conjunction with the first
|
169
|
+
# two services, in that it allows you to confirm the result of the authentication.
|
170
|
+
#
|
171
|
+
# You can use this verification factor in combination with username & password to
|
172
|
+
# provide two-factor authentication for higher security.
|
173
|
+
class Verify < Telesign::API::Rest
|
174
|
+
|
175
|
+
def initialize(customer_id,
|
176
|
+
secret_key,
|
177
|
+
ssl=true,
|
178
|
+
api_host='rest.telesign.com',
|
179
|
+
timeout=nil)
|
180
|
+
|
181
|
+
super(customer_id,
|
182
|
+
secret_key,
|
183
|
+
ssl,
|
184
|
+
api_host,
|
185
|
+
timeout)
|
186
|
+
end
|
187
|
+
|
188
|
+
# Sends a text message containing the verification code, to the specified
|
189
|
+
# phone number (supported for mobile phones only).
|
190
|
+
def sms(phone_number,
|
191
|
+
use_case_code=nil,
|
192
|
+
extra=nil,
|
193
|
+
timeout=nil)
|
194
|
+
|
195
|
+
params = {:phone_number => phone_number}
|
196
|
+
|
197
|
+
unless use_case_code.nil?
|
198
|
+
params[:use_case_code] = use_case_code
|
199
|
+
end
|
200
|
+
|
201
|
+
unless extra.nil?
|
202
|
+
params.merge!(extra)
|
203
|
+
end
|
204
|
+
|
205
|
+
execute(Net::HTTP::Post,
|
206
|
+
"/v1/verify/sms",
|
207
|
+
nil,
|
208
|
+
params,
|
209
|
+
timeout)
|
210
|
+
end
|
211
|
+
|
212
|
+
# Calls the specified phone number, and using speech synthesis, speaks the
|
213
|
+
# verification code to the user.
|
214
|
+
def call(phone_number,
|
215
|
+
use_case_code=nil,
|
216
|
+
extra=nil,
|
217
|
+
timeout=nil)
|
218
|
+
|
219
|
+
params = {:phone_number => phone_number}
|
220
|
+
|
221
|
+
unless use_case_code.nil?
|
222
|
+
params[:use_case_code] = use_case_code
|
223
|
+
end
|
224
|
+
|
225
|
+
unless extra.nil?
|
226
|
+
params.merge!(extra)
|
227
|
+
end
|
228
|
+
|
229
|
+
execute(Net::HTTP::Post,
|
230
|
+
"/v1/verify/call",
|
231
|
+
nil,
|
232
|
+
params,
|
233
|
+
timeout)
|
234
|
+
end
|
235
|
+
|
236
|
+
# Calls the specified phone number, and using speech synthesis, speaks the
|
237
|
+
# verification code to the user.
|
238
|
+
def smart(phone_number,
|
239
|
+
use_case_code,
|
240
|
+
extra=nil,
|
241
|
+
timeout=nil)
|
242
|
+
|
243
|
+
params = {:phone_number => phone_number,
|
244
|
+
:ucid => use_case_code}
|
245
|
+
|
246
|
+
unless extra.nil?
|
247
|
+
params.merge!(extra)
|
248
|
+
end
|
249
|
+
|
250
|
+
execute(Net::HTTP::Post,
|
251
|
+
"/v1/verify/smart",
|
252
|
+
nil,
|
253
|
+
params,
|
254
|
+
timeout)
|
255
|
+
|
256
|
+
end
|
257
|
+
|
258
|
+
# The **push** method sends a push notification containing the verification
|
259
|
+
# code to the specified phone number (supported for mobile phones only).
|
260
|
+
def push(phone_number,
|
261
|
+
use_case_code,
|
262
|
+
extra=nil,
|
263
|
+
timeout=nil)
|
264
|
+
|
265
|
+
params = {:phone_number => phone_number,
|
266
|
+
:ucid => use_case_code}
|
267
|
+
|
268
|
+
unless extra.nil?
|
269
|
+
params.merge!(extra)
|
270
|
+
end
|
271
|
+
|
272
|
+
execute(Net::HTTP::Post,
|
273
|
+
"/v1/verify/push",
|
274
|
+
nil,
|
275
|
+
params,
|
276
|
+
timeout)
|
277
|
+
|
278
|
+
end
|
279
|
+
|
280
|
+
# Retrieves the verification result. You make this call in your web application
|
281
|
+
# after users complete the authentication transaction (using either a call or sms).
|
282
|
+
def status(reference_id,
|
283
|
+
verify_code=nil,
|
284
|
+
extra=nil,
|
285
|
+
timeout=nil)
|
286
|
+
|
287
|
+
params = {}
|
288
|
+
|
289
|
+
unless verify_code.nil?
|
290
|
+
params[:verify_code] = verify_code
|
291
|
+
end
|
292
|
+
|
293
|
+
unless extra.nil?
|
294
|
+
params.merge!(extra)
|
295
|
+
end
|
296
|
+
|
297
|
+
execute(Net::HTTP::Get,
|
298
|
+
"/v1/verify/#{reference_id}",
|
299
|
+
params,
|
300
|
+
nil,
|
301
|
+
timeout)
|
302
|
+
end
|
303
|
+
end
|
304
|
+
end
|
305
|
+
end
|
@@ -0,0 +1,181 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2016 TeleSign
|
3
|
+
#
|
4
|
+
# TeleSign Ruby SDK HMAC REST Auth.
|
5
|
+
#
|
6
|
+
|
7
|
+
require 'pp'
|
8
|
+
require 'json'
|
9
|
+
require 'time'
|
10
|
+
require 'base64'
|
11
|
+
require 'openssl'
|
12
|
+
require 'net/http'
|
13
|
+
|
14
|
+
module Telesign
|
15
|
+
|
16
|
+
module API
|
17
|
+
|
18
|
+
# == TeleSign Ruby SDK REST API Helper
|
19
|
+
#
|
20
|
+
# Telesign::API::Rest provides helper classes and functions
|
21
|
+
# to handle the HMAC REST authentication.
|
22
|
+
#
|
23
|
+
# You can use these helper functions directly or via the Telesign::API::PhoneId
|
24
|
+
# and Telesign::API::Verify classes. Please see the TeleSign REST API docs at
|
25
|
+
# http://docs.telesign.com/rest/index.html for implementation details.
|
26
|
+
#
|
27
|
+
class Rest
|
28
|
+
|
29
|
+
# Creates a new Telesign::API::Rest object with the specified credentials
|
30
|
+
# and HTTP configuration.
|
31
|
+
# The +api_host+ should be a DNS hostname or IP address.
|
32
|
+
def initialize(customer_id,
|
33
|
+
secret_key,
|
34
|
+
ssl,
|
35
|
+
api_host,
|
36
|
+
timeout=nil)
|
37
|
+
|
38
|
+
@customer_id = customer_id
|
39
|
+
@secret_key = secret_key
|
40
|
+
@ssl = ssl
|
41
|
+
@base_uri = URI("http#{ssl ? 's' : ''}://#{api_host}")
|
42
|
+
@timeout = timeout
|
43
|
+
@user_agent = 'Net::HTTP TeleSignSDK/ruby-1.0.0'
|
44
|
+
end
|
45
|
+
|
46
|
+
# Executes the REST API request based on the given configuration.
|
47
|
+
# See Telesign::API::PhoneId and Telesign::API::Verify for specific
|
48
|
+
# usage.
|
49
|
+
def execute(verb,
|
50
|
+
resource,
|
51
|
+
params=nil,
|
52
|
+
form_data=nil,
|
53
|
+
timeout=nil)
|
54
|
+
|
55
|
+
# generate the headers
|
56
|
+
headers = generate_auth_headers(
|
57
|
+
@customer_id,
|
58
|
+
@secret_key,
|
59
|
+
resource,
|
60
|
+
verb,
|
61
|
+
form_data.nil? ? nil : URI.encode_www_form(form_data))
|
62
|
+
|
63
|
+
uri = URI.join(@base_uri, resource)
|
64
|
+
|
65
|
+
# set query params
|
66
|
+
uri.query = URI.encode_www_form(params) unless params.nil?
|
67
|
+
|
68
|
+
# configure HTTP object
|
69
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
70
|
+
http.use_ssl = @ssl
|
71
|
+
|
72
|
+
http.open_timeout = timeout.nil? ? @timeout : timeout
|
73
|
+
http.read_timeout = http.open_timeout
|
74
|
+
http.ssl_timeout = http.open_timeout
|
75
|
+
http.continue_timeout = http.open_timeout
|
76
|
+
|
77
|
+
#set headers
|
78
|
+
request = verb.new uri.request_uri
|
79
|
+
headers.each do |k, v|
|
80
|
+
request[k] = v
|
81
|
+
end
|
82
|
+
|
83
|
+
# set post data
|
84
|
+
request.set_form_data(form_data) unless form_data.nil?
|
85
|
+
|
86
|
+
# do the request
|
87
|
+
http_response = http.request(request)
|
88
|
+
|
89
|
+
# check response
|
90
|
+
unless http_response.is_a? Net::HTTPSuccess
|
91
|
+
if http_response.is_a? Net::HTTPUnauthorized
|
92
|
+
raise Telesign::API::AuthError.new(http_response)
|
93
|
+
else
|
94
|
+
raise Telesign::API::APIError.new(http_response)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
Telesign::API::APIResponse.new(http_response)
|
99
|
+
end
|
100
|
+
|
101
|
+
# Function to generate the REST API authentication headers. A signature is
|
102
|
+
# computed based on the contents of the request and the client's secret key.
|
103
|
+
def generate_auth_headers (customer_id,
|
104
|
+
secret_key,
|
105
|
+
resource,
|
106
|
+
verb,
|
107
|
+
form_data=nil,
|
108
|
+
content_type='')
|
109
|
+
|
110
|
+
datetime_stamp = Time.now.utc.to_datetime.rfc822
|
111
|
+
nonce = rand.to_s
|
112
|
+
|
113
|
+
content_type = 'application/x-www-form-urlencoded' if verb == Net::HTTP::Post or verb == Net::HTTP::Put
|
114
|
+
|
115
|
+
string_to_sign = "#{verb.name.split('::').last.upcase}\n" +
|
116
|
+
"#{content_type}\n\n" +
|
117
|
+
"x-ts-auth-method:#{'HMAC-SHA256'}\n" +
|
118
|
+
"x-ts-date:#{datetime_stamp}\n" +
|
119
|
+
"x-ts-nonce:#{nonce}"
|
120
|
+
|
121
|
+
string_to_sign = "#{string_to_sign}\n#{form_data}" unless form_data.nil?
|
122
|
+
|
123
|
+
string_to_sign = string_to_sign + "\n#{resource}"
|
124
|
+
|
125
|
+
signature = Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'),
|
126
|
+
Base64.decode64(secret_key), string_to_sign)).chomp
|
127
|
+
|
128
|
+
{
|
129
|
+
'Authorization' => "TSA #{customer_id}:#{signature}",
|
130
|
+
'x-ts-date' => datetime_stamp,
|
131
|
+
'x-ts-auth-method' => 'HMAC-SHA256',
|
132
|
+
'x-ts-nonce' => nonce,
|
133
|
+
'User-Agent' => @user_agent
|
134
|
+
}
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
class APIResponse
|
139
|
+
|
140
|
+
attr_accessor :body, :headers, :status, :verify_code
|
141
|
+
|
142
|
+
def initialize(http_response,
|
143
|
+
verify_code=nil)
|
144
|
+
|
145
|
+
@body = JSON.parse(http_response.body)
|
146
|
+
@headers = http_response.to_hash
|
147
|
+
@status = http_response.code
|
148
|
+
@verify_code = verify_code
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
class APIError < StandardError
|
153
|
+
|
154
|
+
attr_accessor :errors, :headers, :status, :body
|
155
|
+
|
156
|
+
def initialize(http_response)
|
157
|
+
|
158
|
+
@errors = JSON.parse(http_response.body)['errors']
|
159
|
+
@headers = http_response.to_hash
|
160
|
+
@status = http_response.code
|
161
|
+
@body = http_response.body
|
162
|
+
end
|
163
|
+
|
164
|
+
def to_s
|
165
|
+
result = ''
|
166
|
+
@errors.each do |error|
|
167
|
+
result = "#{result}#{error['description']}\n"
|
168
|
+
end
|
169
|
+
|
170
|
+
result
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
class AuthError < Telesign::API::APIError
|
175
|
+
|
176
|
+
def initialize(http_response)
|
177
|
+
super(http_response)
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
metadata
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: telesign
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jarrad Lee
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-03-02 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: TeleSign Ruby SDK
|
14
|
+
email: jarrad@telesign.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- lib/telesign.rb
|
20
|
+
- lib/telesign/rest.rb
|
21
|
+
homepage: http://rubygems.org/gems/telesign
|
22
|
+
licenses: []
|
23
|
+
metadata: {}
|
24
|
+
post_install_message:
|
25
|
+
rdoc_options: []
|
26
|
+
require_paths:
|
27
|
+
- lib
|
28
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - ">="
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
requirements: []
|
39
|
+
rubyforge_project:
|
40
|
+
rubygems_version: 2.5.1
|
41
|
+
signing_key:
|
42
|
+
specification_version: 4
|
43
|
+
summary: TeleSign Ruby SDK
|
44
|
+
test_files: []
|