authy 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.4
1
+ 0.0.5
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "authy"
8
- s.version = "0.0.4"
8
+ s.version = "0.0.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Authy", "David A. Cuadrado"]
12
- s.date = "2012-05-21"
12
+ s.date = "2012-05-25"
13
13
  s.description = "Ruby library to access Authy services"
14
14
  s.email = "krawek@gmail.com"
15
15
  s.executables = ["authy-api-console"]
@@ -28,6 +28,7 @@ Gem::Specification.new do |s|
28
28
  "VERSION",
29
29
  "authy.gemspec",
30
30
  "bin/authy-api-console",
31
+ "examples/demo.rb",
31
32
  "lib/authy.rb",
32
33
  "lib/authy/api.rb",
33
34
  "lib/authy/config.rb",
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'authy' # gem install authy
4
+ require 'sqlite3'
5
+ require 'active_record'
6
+ require 'highline/import' # gem install highline
7
+
8
+ Authy.api_url = "http://sandbox-api.authy.com"
9
+ Authy.api_key = "a1ffc30aa2d775c7ebebe45585727fe0"
10
+
11
+ # setup db
12
+ ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => "db")
13
+ class AddUsers < ActiveRecord::Migration
14
+ def self.up
15
+ create_table :users do |t|
16
+ t.string :email
17
+ t.string :authy_id
18
+ end
19
+ end
20
+
21
+ def self.down
22
+ drop_table :users
23
+ end
24
+ end
25
+ AddUsers.migrate(:up) if !File.exist?("db")
26
+
27
+ class User < ActiveRecord::Base
28
+ validates_uniqueness_of :email
29
+ end
30
+
31
+
32
+ choose do |menu|
33
+ menu.prompt = "what do you want to do? "
34
+
35
+ menu.choice(:register) do
36
+ loop do
37
+ email = ask("email: ")
38
+ country_code = ask("country code: ")
39
+ cellphone = ask("cellphone: ")
40
+
41
+ if user = User.where(:email => email).first
42
+ puts "You're already registered with authy id: #{user.authy_id}"
43
+ break
44
+ end
45
+
46
+ authy_user = Authy::API.register_user(:email => email, :country_code => country_code, :cellphone => cellphone)
47
+ if authy_user.ok?
48
+ puts "User was registered. its authy id is #{authy_user.id}"
49
+ User.create!(:authy_id => authy_user.id, :email => email)
50
+ break
51
+ else
52
+ puts "Failed to register user: #{authy_user.errors}"
53
+ end
54
+ end
55
+ end
56
+
57
+ menu.choice(:login) do
58
+ email = ask("email: ")
59
+ token = ask("token: ")
60
+
61
+ user = User.where(:email => email).first
62
+ otp = Authy::API.verify(:id => user.authy_id, :token => token)
63
+
64
+ if otp.ok?
65
+ puts "Welcome back!"
66
+ else
67
+ puts "Wrong email or token :("
68
+ end
69
+ end
70
+
71
+ menu.choice(:request_token) do
72
+ email = ask("email: ")
73
+
74
+ user = User.where(:email => email).first
75
+ response = Authy::API.request_sms(:id => user.authy_id, :force => true)
76
+
77
+ if response.ok?
78
+ puts "Message was sent"
79
+ else
80
+ puts "Failed to send message: #{response.errors.inspect}"
81
+ end
82
+ end
83
+ end
@@ -20,22 +20,30 @@ module Authy
20
20
  # options:
21
21
  # :id user id
22
22
  # :token authy token entered by the user
23
- def self.verify(attributes)
24
- token = attributes[:token] || attributes['token']
25
- user_id = attributes[:id] || attributes['id']
26
- response = Typhoeus::Request.get("#{Authy.api_uri}/protected/json/verify/#{token}/#{user_id}", :params => {:api_key => Authy.api_key})
23
+ # :force (true|false) force to check even if the cellphone is not confirmed
24
+ #
25
+ def self.verify(params)
26
+ token = params.delete(:token) || params.delete('token')
27
+ user_id = params.delete(:id) || params.delete('id')
28
+
29
+ response = Typhoeus::Request.get("#{Authy.api_uri}/protected/json/verify/#{escape_for_url(token)}/#{escape_for_url(user_id)}", :params => params.merge({:api_key => Authy.api_key}))
27
30
 
28
31
  Authy::Response.new(response)
29
32
  end
30
33
 
31
34
  # options:
32
35
  # :id user id
33
- def self.request_sms(attributes)
34
- user_id = attributes[:id] || attributes['id']
36
+ def self.request_sms(params)
37
+ user_id = params.delete(:id) || params.delete('id')
35
38
 
36
- response = Typhoeus::Request.get("#{Authy.api_uri}/protected/json/sms/#{user_id}", :params => {:api_key => Authy.api_key})
39
+ response = Typhoeus::Request.get("#{Authy.api_uri}/protected/json/sms/#{escape_for_url(user_id)}", :params => params.merge({:api_key => Authy.api_key}))
37
40
 
38
41
  Authy::Response.new(response)
39
42
  end
43
+
44
+ private
45
+ def self.escape_for_url(field)
46
+ URI.escape(field.to_s.strip, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
47
+ end
40
48
  end
41
49
  end
@@ -11,7 +11,7 @@ module Authy
11
11
  def api_uri=(uri)
12
12
  @api_uri = uri
13
13
  end
14
- alias :api_url= :api_key=
14
+ alias :api_url= :api_uri=
15
15
 
16
16
  def api_uri
17
17
  @api_uri || "https://api.authy.com"
@@ -3,6 +3,7 @@ module Authy
3
3
  attr_reader :raw_response
4
4
  def initialize(response)
5
5
  @raw_response = response
6
+ @errors = {}
6
7
  parse_body
7
8
  end
8
9
 
@@ -27,7 +28,7 @@ module Authy
27
28
  end
28
29
 
29
30
  def errors
30
- self['errors'] || {}
31
+ self['errors'] || @errors
31
32
  end
32
33
 
33
34
  protected
@@ -20,6 +20,15 @@ describe "Authy::API" do
20
20
  response.body.should == 'valid token'
21
21
  end
22
22
 
23
+ it "should fail to validate a given token when force=true is given" do
24
+ user = Authy::API.register_user(:email => generate_email, :cellphone => generate_cellphone, :country_code => 1)
25
+ response = Authy::API.verify(:token => 'invalid_token', :id => user['id'], :force => true)
26
+
27
+ response.should be_kind_of(Authy::Response)
28
+ response.ok?.should be_false
29
+ response.body.should == 'invalid token'
30
+ end
31
+
23
32
  it "should return the error messages as a hash" do
24
33
  user = Authy::API.register_user(:email => generate_email, :cellphone => "abc-1234", :country_code => 1)
25
34
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: authy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-05-21 00:00:00.000000000 Z
13
+ date: 2012-05-25 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: typhoeus
17
- requirement: &70133947788640 !ruby/object:Gem::Requirement
17
+ requirement: &70093065684660 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - =
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 0.3.3
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70133947788640
25
+ version_requirements: *70093065684660
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: pry
28
- requirement: &70133947797280 !ruby/object:Gem::Requirement
28
+ requirement: &70093065683380 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - =
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: 0.9.8.1
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *70133947797280
36
+ version_requirements: *70093065683380
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: rspec
39
- requirement: &70133947829020 !ruby/object:Gem::Requirement
39
+ requirement: &70093065681480 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ~>
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: 2.8.0
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *70133947829020
47
+ version_requirements: *70093065681480
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: yard
50
- requirement: &70133947843780 !ruby/object:Gem::Requirement
50
+ requirement: &70093065893320 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ~>
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: '0.7'
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *70133947843780
58
+ version_requirements: *70093065893320
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: rdoc
61
- requirement: &70133947850600 !ruby/object:Gem::Requirement
61
+ requirement: &70093065886620 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ~>
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: '3.12'
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *70133947850600
69
+ version_requirements: *70093065886620
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: bundler
72
- requirement: &70133947848220 !ruby/object:Gem::Requirement
72
+ requirement: &70093065963440 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - ~>
@@ -77,10 +77,10 @@ dependencies:
77
77
  version: 1.1.0
78
78
  type: :development
79
79
  prerelease: false
80
- version_requirements: *70133947848220
80
+ version_requirements: *70093065963440
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: jeweler
83
- requirement: &70133947871480 !ruby/object:Gem::Requirement
83
+ requirement: &70093066181600 !ruby/object:Gem::Requirement
84
84
  none: false
85
85
  requirements:
86
86
  - - ~>
@@ -88,10 +88,10 @@ dependencies:
88
88
  version: 1.8.3
89
89
  type: :development
90
90
  prerelease: false
91
- version_requirements: *70133947871480
91
+ version_requirements: *70093066181600
92
92
  - !ruby/object:Gem::Dependency
93
93
  name: simplecov
94
- requirement: &70133947883720 !ruby/object:Gem::Requirement
94
+ requirement: &70093066179060 !ruby/object:Gem::Requirement
95
95
  none: false
96
96
  requirements:
97
97
  - - ! '>='
@@ -99,10 +99,10 @@ dependencies:
99
99
  version: '0'
100
100
  type: :development
101
101
  prerelease: false
102
- version_requirements: *70133947883720
102
+ version_requirements: *70093066179060
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: reek
105
- requirement: &70133947909680 !ruby/object:Gem::Requirement
105
+ requirement: &70093066176760 !ruby/object:Gem::Requirement
106
106
  none: false
107
107
  requirements:
108
108
  - - ~>
@@ -110,7 +110,7 @@ dependencies:
110
110
  version: 1.2.8
111
111
  type: :development
112
112
  prerelease: false
113
- version_requirements: *70133947909680
113
+ version_requirements: *70093066176760
114
114
  description: Ruby library to access Authy services
115
115
  email: krawek@gmail.com
116
116
  executables:
@@ -130,6 +130,7 @@ files:
130
130
  - VERSION
131
131
  - authy.gemspec
132
132
  - bin/authy-api-console
133
+ - examples/demo.rb
133
134
  - lib/authy.rb
134
135
  - lib/authy/api.rb
135
136
  - lib/authy/config.rb
@@ -153,7 +154,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
153
154
  version: '0'
154
155
  segments:
155
156
  - 0
156
- hash: 600584506253976133
157
+ hash: 3694718674118841425
157
158
  required_rubygems_version: !ruby/object:Gem::Requirement
158
159
  none: false
159
160
  requirements: