emailauth 0.0.2
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/Rakefile +8 -0
- data/lib/emailauth/authenticator.rb +44 -0
- data/lib/emailauth.rb +19 -0
- data/test/test_emailauth.rb +25 -0
- metadata +65 -0
data/Rakefile
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
require 'base64'
|
3
|
+
require 'rotp'
|
4
|
+
|
5
|
+
class EmailAuth::Authenticator
|
6
|
+
##
|
7
|
+
# Generates SAW tokens in base64 that are the provided number of bytes
|
8
|
+
##
|
9
|
+
def self.generateTokens(bytes = 16)
|
10
|
+
complete_token = SecureRandom.random_bytes(bytes)
|
11
|
+
complete_token_s = Base64.urlsafe_encode64(complete_token)
|
12
|
+
email_token = SecureRandom.random_bytes(bytes)
|
13
|
+
email_token_s = Base64.urlsafe_encode64(email_token)
|
14
|
+
|
15
|
+
user_token_s = Base64.urlsafe_encode64(complete_token.unpack('C*').zip(email_token.unpack('C*')).map{ |a,b| a ^ b }.pack('C*'))
|
16
|
+
|
17
|
+
return [user_token_s,email_token_s,complete_token_s]
|
18
|
+
end
|
19
|
+
|
20
|
+
##
|
21
|
+
# Validates whether the provided tokens are correct using SAW protocol
|
22
|
+
##
|
23
|
+
def self.authenticate(user_token, email_token, complete_token)
|
24
|
+
email_token_e = Base64.urlsafe_decode64(email_token)
|
25
|
+
complete_token_e = Base64.urlsafe_decode64(complete_token)
|
26
|
+
|
27
|
+
calculated_user_token = Base64.urlsafe_encode64(complete_token_e.unpack('C*').zip(email_token_e.unpack('C*')).map{ |a,b| a ^ b }.pack('C*'))
|
28
|
+
return user_token==calculated_user_token
|
29
|
+
end
|
30
|
+
|
31
|
+
##
|
32
|
+
# Validates whether a TOTP code is valid for a particular secret
|
33
|
+
##
|
34
|
+
def self.validateTOTP(auth_secret, code)
|
35
|
+
return code == ROTP::TOTP.new(auth_secret).now.to_s
|
36
|
+
end
|
37
|
+
|
38
|
+
##
|
39
|
+
# Generates a TOTP secret
|
40
|
+
##
|
41
|
+
def self.generateTOTPSecret
|
42
|
+
ROTP::Base32.random_base32
|
43
|
+
end
|
44
|
+
end
|
data/lib/emailauth.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
class EmailAuth
|
2
|
+
def self.generateTokens(bytes = 16)
|
3
|
+
EmailAuth::Authenticator.generateTokens(bytes)
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.authenticate(user_token, email_token, complete_token)
|
7
|
+
EmailAuth::Authenticator.authenticate(user_token, email_token, complete_token)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.validateTOTP(auth_secret, code)
|
11
|
+
EmailAuth::Authenticator.validateTOTP(auth_secret, code)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.generateTOTPSecret
|
15
|
+
EmailAuth::Authenticator.generateTOTPSecret
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
require 'emailauth/authenticator'
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'emailauth'
|
3
|
+
|
4
|
+
class EmailAuthTest < Test::Unit::TestCase
|
5
|
+
def test_generate_token
|
6
|
+
user_token, email_token, complete_token = EmailAuth.generateTokens
|
7
|
+
assert_not_nil user_token
|
8
|
+
assert_not_nil email_token
|
9
|
+
assert_not_nil complete_token
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_authenticate
|
13
|
+
user_token, email_token, complete_token = EmailAuth.generateTokens
|
14
|
+
assert EmailAuth.authenticate(user_token, email_token, complete_token)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_totp
|
18
|
+
secret = ROTP::Base32.random_base32
|
19
|
+
assert !EmailAuth.validate_totp(secret, secret)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_totp
|
23
|
+
assert_not_nil EmailAuth.generateTOTPSecret
|
24
|
+
end
|
25
|
+
end
|
metadata
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: emailauth
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Brian Lubben
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-03-27 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rotp
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
description: Email based authentication with mobile devices
|
31
|
+
email: blubben@gmail.com
|
32
|
+
executables: []
|
33
|
+
extensions: []
|
34
|
+
extra_rdoc_files: []
|
35
|
+
files:
|
36
|
+
- Rakefile
|
37
|
+
- lib/emailauth.rb
|
38
|
+
- lib/emailauth/authenticator.rb
|
39
|
+
- test/test_emailauth.rb
|
40
|
+
homepage:
|
41
|
+
licenses: []
|
42
|
+
post_install_message:
|
43
|
+
rdoc_options: []
|
44
|
+
require_paths:
|
45
|
+
- lib
|
46
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
+
none: false
|
48
|
+
requirements:
|
49
|
+
- - ! '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ! '>='
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: 0.0.2
|
58
|
+
requirements: []
|
59
|
+
rubyforge_project:
|
60
|
+
rubygems_version: 1.8.23
|
61
|
+
signing_key:
|
62
|
+
specification_version: 3
|
63
|
+
summary: Hola Auth
|
64
|
+
test_files:
|
65
|
+
- test/test_emailauth.rb
|