google-authenticator-rails 0.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.
- data/.gitignore +19 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +102 -0
- data/Rakefile +2 -0
- data/google-authenticator.gemspec +25 -0
- data/lib/google-authenticator-rails.rb +13 -0
- data/lib/google-authenticator-rails/active_record.rb +66 -0
- data/lib/google-authenticator-rails/active_record/acts_as_google_authenticated.rb +35 -0
- data/lib/google-authenticator-rails/active_record/google_authentication.rb +34 -0
- data/lib/google-authenticator-rails/google.rb +1 -0
- data/lib/google-authenticator-rails/google/rails.rb +1 -0
- data/lib/google-authenticator-rails/google/rails/rotp_integration.rb +26 -0
- data/lib/google-authenticator-rails/version.rb +7 -0
- data/spec/google_authenticator_spec.rb +122 -0
- data/spec/spec_helper.rb +27 -0
- metadata +160 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Jared McFarland
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
# Google::Authenticator
|
2
|
+
|
3
|
+
Rails (ActiveRecord) integration with the Google Authenticator apps for Android and the iPhone.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'google-authenticator-rails'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install google-authenticator-rails
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
Example:
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
class User
|
25
|
+
acts_as_google_authenticated
|
26
|
+
end
|
27
|
+
|
28
|
+
@user = User.new
|
29
|
+
@user.set_google_secret! # => true
|
30
|
+
@user.google_qr_uri # => http://path.to.google/qr?with=params
|
31
|
+
@user.google_authenticate(123456) # => true
|
32
|
+
```
|
33
|
+
|
34
|
+
Google Labels
|
35
|
+
When setting up an account with the GoogleAuthenticator you need to provide
|
36
|
+
a label for that account (to distinguish it from other accounts).
|
37
|
+
|
38
|
+
GoogleAuthenticatorRails allows you to customize how the record will create
|
39
|
+
that label. There are three options:
|
40
|
+
- The default just uses the column "email" on the model
|
41
|
+
- You can specify a custom column with the :column_name option
|
42
|
+
- You can specify a custom method via a symbol or a proc
|
43
|
+
|
44
|
+
Examples:
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
class User
|
48
|
+
acts_as_google_authenticated :column => :user_name
|
49
|
+
end
|
50
|
+
|
51
|
+
@user = User.new(:user_name => "ted")
|
52
|
+
@user.google_label # => "ted"
|
53
|
+
|
54
|
+
class User
|
55
|
+
acts_as_google_authenticated :method => :user_name_with_label
|
56
|
+
|
57
|
+
def user_name_with_label
|
58
|
+
"#{user_name}@mysweetservice.com"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
@user = User.new(:user_name => "ted")
|
63
|
+
@user.google_label # => "ted@mysweetservice.com"
|
64
|
+
|
65
|
+
class User
|
66
|
+
acts_as_google_authenticated :method => Proc.new { |user| user.user_name_with_label.upcase }
|
67
|
+
|
68
|
+
def user_name_with_label
|
69
|
+
"#{user_name}@mysweetservice.com"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
@user = User.new(:user_name => "ted")
|
74
|
+
@user.google_label # => "TED@MYSWEETSERVICE.COM"
|
75
|
+
```
|
76
|
+
|
77
|
+
You can also sepcify a column for storing the google secret. The default is `google_secret`.
|
78
|
+
|
79
|
+
Example
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
class User
|
83
|
+
acts_as_google_authenticated :google_secret_column => :mfa_secret
|
84
|
+
end
|
85
|
+
|
86
|
+
@user = User.new
|
87
|
+
@user.set_google_secret!
|
88
|
+
@user.mfa_secret # => "56ahi483"
|
89
|
+
```
|
90
|
+
|
91
|
+
|
92
|
+
## Contributing
|
93
|
+
|
94
|
+
1. Fork it
|
95
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
96
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
97
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
98
|
+
5. Create new Pull Request
|
99
|
+
|
100
|
+
## License
|
101
|
+
|
102
|
+
MIT.
|
data/Rakefile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/google-authenticator-rails/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Jared McFarland"]
|
6
|
+
gem.email = ["jared.online@gmail.com"]
|
7
|
+
gem.description = %q{Add the ability to use the Google Authenticator with ActiveRecord.}
|
8
|
+
gem.summary = %q{Add the ability to use the Google Authenticator with ActiveRecord.}
|
9
|
+
gem.homepage = "http://github.com/jaredonline/google-authenticator-rails"
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = "google-authenticator-rails"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = Google::Authenticator::Rails::VERSION
|
17
|
+
|
18
|
+
gem.add_dependency "activesupport", "~> 3.2.0"
|
19
|
+
gem.add_dependency "rotp"
|
20
|
+
gem.add_dependency "activerecord", "~> 3.2.0"
|
21
|
+
gem.add_dependency "google-qr"
|
22
|
+
|
23
|
+
gem.add_development_dependency "rspec", "~> 2.8.0"
|
24
|
+
gem.add_development_dependency "sqlite3"
|
25
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# Stuff the gem requireds
|
2
|
+
#
|
3
|
+
require 'active_support'
|
4
|
+
require 'active_record'
|
5
|
+
require 'openssl'
|
6
|
+
require 'rotp'
|
7
|
+
require 'google-qr'
|
8
|
+
|
9
|
+
# Stuff the gem is
|
10
|
+
#
|
11
|
+
require "google-authenticator-rails/version"
|
12
|
+
require 'google-authenticator-rails/google'
|
13
|
+
require 'google-authenticator-rails/active_record'
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'google-authenticator-rails/active_record/google_authentication'
|
2
|
+
require 'google-authenticator-rails/active_record/acts_as_google_authenticated'
|
3
|
+
|
4
|
+
class ActiveRecord::Base # :nodoc:
|
5
|
+
|
6
|
+
# This is the single integration point. Monkey patch ActiveRecord::Base
|
7
|
+
# to include the ActsAsGoogleAuthenticated module, which allows a user
|
8
|
+
# to call User.acts_as_google_authenticated.
|
9
|
+
#
|
10
|
+
# The model being used must have a string column named "google_secret", or an explicitly
|
11
|
+
# named column.
|
12
|
+
#
|
13
|
+
# Example:
|
14
|
+
#
|
15
|
+
# class User
|
16
|
+
# acts_as_google_authenticated
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# @user = user.new
|
20
|
+
# @user.set_google_secret! # => true
|
21
|
+
# @user.google_qr_uri # => http://path.to.google/qr?with=params
|
22
|
+
# @user.google_authenticate(123456) # => true
|
23
|
+
#
|
24
|
+
# Google Labels
|
25
|
+
# When setting up an account with the GoogleAuthenticator you need to provide
|
26
|
+
# a label for that account (to distinguish it from other accounts).
|
27
|
+
#
|
28
|
+
# GoogleAuthenticatorRails allows you to customize how the record will create
|
29
|
+
# that label. There are three options:
|
30
|
+
# - The default just uses the column "email" on the model
|
31
|
+
# - You can specify a custom column with the :column_name option
|
32
|
+
# - You can specify a custom method via a symbol or a proc
|
33
|
+
#
|
34
|
+
# Examples:
|
35
|
+
#
|
36
|
+
# class User
|
37
|
+
# acts_as_google_authenticated :column => :user_name
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
# @user = User.new(:user_name => "ted")
|
41
|
+
# @user.google_label # => "ted"
|
42
|
+
#
|
43
|
+
# class User
|
44
|
+
# acts_as_google_authenticated :method => :user_name_with_label
|
45
|
+
#
|
46
|
+
# def user_name_with_label
|
47
|
+
# "#{user_name}@mysweetservice.com"
|
48
|
+
# end
|
49
|
+
# end
|
50
|
+
#
|
51
|
+
# @user = User.new(:user_name => "ted")
|
52
|
+
# @user.google_label # => "ted@mysweetservice.com"
|
53
|
+
#
|
54
|
+
# class User
|
55
|
+
# acts_as_google_authenticated :method => Proc.new { |user| user.user_name_with_label.upcase }
|
56
|
+
#
|
57
|
+
# def user_name_with_label
|
58
|
+
# "#{user_name}@mysweetservice.com"
|
59
|
+
# end
|
60
|
+
# end
|
61
|
+
#
|
62
|
+
# @user = User.new(:user_name => "ted")
|
63
|
+
# @user.google_label # => "TED@MYSWEETSERVICE.COM"
|
64
|
+
#
|
65
|
+
include ActiveRecord::ActsAsGoogleAuthenticated
|
66
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module ActiveRecord # :nodoc:
|
2
|
+
module ActsAsGoogleAuthenticated # :nodoc:
|
3
|
+
def self.included(base)
|
4
|
+
base.extend ClassMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module ClassMethods # :nodoc
|
8
|
+
|
9
|
+
# Initializes the class attributes with the specified options and includes the
|
10
|
+
# GoogleAuthentication module
|
11
|
+
#
|
12
|
+
# Options:
|
13
|
+
# [:column_name] the name of the column used to create the google_label
|
14
|
+
# [:method] name of the method to call to created the google_label
|
15
|
+
# it supercedes :column_name
|
16
|
+
# [:google_secret_column] the column the secret will be stored in, defaults
|
17
|
+
# to "google_secret"
|
18
|
+
def acts_as_google_authenticated(options = {})
|
19
|
+
@google_label_column = options[:column_name] || :email
|
20
|
+
@google_label_method = options[:method] || :default_google_label_method
|
21
|
+
@google_secret_column = options[:google_secret_column] || :google_secret
|
22
|
+
|
23
|
+
attr_accessible @google_secret_column
|
24
|
+
|
25
|
+
[:google_label_column, :google_label_method, :google_secret_column].each do |cattr|
|
26
|
+
self.class.__send__(:define_method, cattr) do
|
27
|
+
instance_variable_get("@#{cattr}")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
include ActiveRecord::GoogleAuthentication
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module ActiveRecord # :nodoc:
|
2
|
+
module GoogleAuthentication # :nodoc:
|
3
|
+
def set_google_secret!
|
4
|
+
update_attributes("#{self.class.google_secret_column}" => Google::Authenticator::Rails::generate_secret)
|
5
|
+
end
|
6
|
+
|
7
|
+
def google_authenticate(code)
|
8
|
+
Google::Authenticator::Rails.valid?(code, google_secret_value)
|
9
|
+
end
|
10
|
+
|
11
|
+
def google_qr_uri
|
12
|
+
GoogleQR.new(data: ROTP::TOTP.new(google_secret_value).provisioning_uri(google_label), size: "200x200").to_s
|
13
|
+
end
|
14
|
+
|
15
|
+
def google_label
|
16
|
+
method = self.class.google_label_method
|
17
|
+
case method
|
18
|
+
when Proc
|
19
|
+
method.call(self)
|
20
|
+
when Symbol, String
|
21
|
+
self.__send__(method)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
def default_google_label_method
|
27
|
+
self.__send__(self.class.google_label_column)
|
28
|
+
end
|
29
|
+
|
30
|
+
def google_secret_value
|
31
|
+
self.__send__(self.class.google_secret_column)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'google-authenticator-rails/google/rails'
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'google-authenticator-rails/google/rails/rotp_integration'
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# Sets up some basic accessors for use with the ROTP module
|
2
|
+
#
|
3
|
+
module Google
|
4
|
+
module Authenticator # :nodoc:
|
5
|
+
module Rails # :nodoc:
|
6
|
+
# Drift is set to 6 because ROTP drift is not inclusive. This allows a drift of 5 seconds.
|
7
|
+
DRIFT = 6
|
8
|
+
|
9
|
+
def self.generate_password(secret, iteration)
|
10
|
+
ROTP::HOTP.new(secret).at(iteration)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.time_based_password(secret)
|
14
|
+
ROTP::TOTP.new(secret).now
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.valid?(code, secret)
|
18
|
+
ROTP::TOTP.new(secret).verify_with_drift(code, DRIFT)
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.generate_secret
|
22
|
+
ROTP::Base32.random_base32
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class User < ActiveRecord::Base
|
4
|
+
attr_accessible :email, :user_name
|
5
|
+
|
6
|
+
acts_as_google_authenticated
|
7
|
+
end
|
8
|
+
|
9
|
+
class CustomUser < ActiveRecord::Base
|
10
|
+
attr_accessible :email, :user_name
|
11
|
+
|
12
|
+
acts_as_google_authenticated :google_secret_column => :mfa_secret
|
13
|
+
end
|
14
|
+
|
15
|
+
describe Google::Authenticator::Rails do
|
16
|
+
before do
|
17
|
+
ROTP::Base32.stub!(:random_base32).and_return("5qlcip7azyjuwm36")
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'implements counter based passwords' do
|
21
|
+
Google::Authenticator::Rails::generate_password("test", 1).should == 812658
|
22
|
+
Google::Authenticator::Rails::generate_password("test", 2).should == 73348
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'implements time based password' do
|
26
|
+
time = Time.parse("2012-08-07 11:11:11 AM +0700")
|
27
|
+
Time.stub!(:now).and_return(time)
|
28
|
+
Google::Authenticator::Rails::time_based_password("test").should == 472374
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'can validate a code' do
|
32
|
+
time = Time.parse("2012-08-07 11:11:11 AM +0700")
|
33
|
+
Time.stub!(:now).and_return(time)
|
34
|
+
Google::Authenticator::Rails::valid?(472374, "test").should be_true
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'can create a secret' do
|
38
|
+
Google::Authenticator::Rails::generate_secret.should == "5qlcip7azyjuwm36"
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'integration with ActiveRecord' do
|
42
|
+
|
43
|
+
before do
|
44
|
+
time = Time.parse("2012-08-07 11:11:00 AM +0700")
|
45
|
+
Time.stub!(:now).and_return(time)
|
46
|
+
@user = User.create(email: "test@test.com", user_name: "test_user")
|
47
|
+
@user.google_secret = "test"
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'validates codes' do
|
51
|
+
@user.google_authenticate(472374).should be_true
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'validates with 5 seconds of drift' do
|
55
|
+
time = Time.parse("2012-08-07 11:11:34 AM +0700")
|
56
|
+
Time.stub!(:now).and_return(time)
|
57
|
+
@user.google_authenticate(472374).should be_true
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'does not validate with 6 seconds of drift' do
|
61
|
+
time = Time.parse("2012-08-07 11:11:36 AM +0700")
|
62
|
+
Time.stub!(:now).and_return(time)
|
63
|
+
@user.google_authenticate(472374).should be_false
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'creates a secret' do
|
67
|
+
@user.set_google_secret!
|
68
|
+
@user.google_secret.should == "5qlcip7azyjuwm36"
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'secret column' do
|
72
|
+
before do
|
73
|
+
Google::Authenticator::Rails.stub!(:generate_secret).and_return("test")
|
74
|
+
@user = CustomUser.create(email: "test@test.com", user_name: "test_user")
|
75
|
+
@user.set_google_secret!
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'validates code' do
|
79
|
+
@user.google_authenticate(472374).should be_true
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'generates a url for a qr code' do
|
83
|
+
@user.google_qr_uri.should == "https://chart.googleapis.com/chart?cht=qr&chl=otpauth%3A%2F%2Ftotp%2Ftest%40test.com%3Fsecret%3Dtest&chs=200x200"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
context 'qr codes' do
|
88
|
+
|
89
|
+
it 'generates a url for a qr code' do
|
90
|
+
@user.set_google_secret!
|
91
|
+
@user.google_qr_uri.should == "https://chart.googleapis.com/chart?cht=qr&chl=otpauth%3A%2F%2Ftotp%2Ftest%40test.com%3Fsecret%3D5qlcip7azyjuwm36&chs=200x200"
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'can generate off any column' do
|
95
|
+
@user.class.acts_as_google_authenticated :column_name => :user_name
|
96
|
+
@user.set_google_secret!
|
97
|
+
@user.google_qr_uri.should == "https://chart.googleapis.com/chart?cht=qr&chl=otpauth%3A%2F%2Ftotp%2Ftest_user%3Fsecret%3D5qlcip7azyjuwm36&chs=200x200"
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'can generate with a custom proc' do
|
101
|
+
@user.class.acts_as_google_authenticated :method => Proc.new { |user| "#{user.user_name}@futureadvisor-admin" }
|
102
|
+
@user.set_google_secret!
|
103
|
+
@user.google_qr_uri.should == "https://chart.googleapis.com/chart?cht=qr&chl=otpauth%3A%2F%2Ftotp%2Ftest_user%40futureadvisor-admin%3Fsecret%3D5qlcip7azyjuwm36&chs=200x200"
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'can generate with a method symbol' do
|
107
|
+
@user.class.acts_as_google_authenticated :method => :email
|
108
|
+
@user.set_google_secret!
|
109
|
+
@user.google_qr_uri.should == "https://chart.googleapis.com/chart?cht=qr&chl=otpauth%3A%2F%2Ftotp%2Ftest%40test.com%3Fsecret%3D5qlcip7azyjuwm36&chs=200x200"
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'can generate with a method string' do
|
113
|
+
@user.class.acts_as_google_authenticated :method => "email"
|
114
|
+
@user.set_google_secret!
|
115
|
+
@user.google_qr_uri.should == "https://chart.googleapis.com/chart?cht=qr&chl=otpauth%3A%2F%2Ftotp%2Ftest%40test.com%3Fsecret%3D5qlcip7azyjuwm36&chs=200x200"
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'google-authenticator-rails'
|
2
|
+
require 'time'
|
3
|
+
require 'active_record'
|
4
|
+
require 'rotp'
|
5
|
+
|
6
|
+
ActiveRecord::Base.establish_connection(
|
7
|
+
:adapter => 'sqlite3',
|
8
|
+
:database => ':memory:'
|
9
|
+
)
|
10
|
+
|
11
|
+
ActiveRecord::Schema.define do
|
12
|
+
self.verbose = false
|
13
|
+
|
14
|
+
create_table :users, :force => true do |t|
|
15
|
+
t.string :google_secret
|
16
|
+
t.string :email
|
17
|
+
t.string :user_name
|
18
|
+
t.timestamps
|
19
|
+
end
|
20
|
+
|
21
|
+
create_table :custom_users, :force => true do |t|
|
22
|
+
t.string :mfa_secret
|
23
|
+
t.string :email
|
24
|
+
t.string :user_name
|
25
|
+
t.timestamps
|
26
|
+
end
|
27
|
+
end
|
metadata
ADDED
@@ -0,0 +1,160 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: google-authenticator-rails
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jared McFarland
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-08-28 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activesupport
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 3.2.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: 3.2.0
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rotp
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: activerecord
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 3.2.0
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 3.2.0
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: google-qr
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: rspec
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 2.8.0
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 2.8.0
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: sqlite3
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
description: Add the ability to use the Google Authenticator with ActiveRecord.
|
111
|
+
email:
|
112
|
+
- jared.online@gmail.com
|
113
|
+
executables: []
|
114
|
+
extensions: []
|
115
|
+
extra_rdoc_files: []
|
116
|
+
files:
|
117
|
+
- .gitignore
|
118
|
+
- .rspec
|
119
|
+
- Gemfile
|
120
|
+
- LICENSE
|
121
|
+
- README.md
|
122
|
+
- Rakefile
|
123
|
+
- google-authenticator.gemspec
|
124
|
+
- lib/google-authenticator-rails.rb
|
125
|
+
- lib/google-authenticator-rails/active_record.rb
|
126
|
+
- lib/google-authenticator-rails/active_record/acts_as_google_authenticated.rb
|
127
|
+
- lib/google-authenticator-rails/active_record/google_authentication.rb
|
128
|
+
- lib/google-authenticator-rails/google.rb
|
129
|
+
- lib/google-authenticator-rails/google/rails.rb
|
130
|
+
- lib/google-authenticator-rails/google/rails/rotp_integration.rb
|
131
|
+
- lib/google-authenticator-rails/version.rb
|
132
|
+
- spec/google_authenticator_spec.rb
|
133
|
+
- spec/spec_helper.rb
|
134
|
+
homepage: http://github.com/jaredonline/google-authenticator-rails
|
135
|
+
licenses: []
|
136
|
+
post_install_message:
|
137
|
+
rdoc_options: []
|
138
|
+
require_paths:
|
139
|
+
- lib
|
140
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
141
|
+
none: false
|
142
|
+
requirements:
|
143
|
+
- - ! '>='
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
147
|
+
none: false
|
148
|
+
requirements:
|
149
|
+
- - ! '>='
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '0'
|
152
|
+
requirements: []
|
153
|
+
rubyforge_project:
|
154
|
+
rubygems_version: 1.8.24
|
155
|
+
signing_key:
|
156
|
+
specification_version: 3
|
157
|
+
summary: Add the ability to use the Google Authenticator with ActiveRecord.
|
158
|
+
test_files:
|
159
|
+
- spec/google_authenticator_spec.rb
|
160
|
+
- spec/spec_helper.rb
|