google_authentication 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.rspec +1 -0
- data/.rvmrc +1 -0
- data/Gemfile +28 -0
- data/Guardfile +20 -0
- data/LICENSE.txt +20 -0
- data/README.markdown +150 -0
- data/Rakefile +45 -0
- data/VERSION +1 -0
- data/app/controllers/google_authentication/omniauth_callbacks_controller.rb +11 -0
- data/app/controllers/google_authentication/sessions_controller.rb +10 -0
- data/config/routes.rb +11 -0
- data/features/google_authentication.feature +27 -0
- data/features/step_definitions/google_authentication_steps.rb +19 -0
- data/features/support/env.rb +24 -0
- data/google_authentication.gemspec +155 -0
- data/lib/generators/google_authentication/google_authentication_generator.rb +46 -0
- data/lib/generators/google_authentication/install_generator.rb +27 -0
- data/lib/generators/templates/MODEL.warning +10 -0
- data/lib/generators/templates/README +11 -0
- data/lib/generators/templates/google_authentication.rb +14 -0
- data/lib/generators/templates/migration.rb +27 -0
- data/lib/google_authentication.rb +43 -0
- data/lib/google_authentication/acts_as_google_user.rb +77 -0
- data/lib/google_authentication/engine.rb +19 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/controllers/posts_controller.rb +83 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/helpers/posts_helper.rb +2 -0
- data/spec/dummy/app/models/post.rb +2 -0
- data/spec/dummy/app/models/user.rb +5 -0
- data/spec/dummy/app/views/layouts/application.html.erb +23 -0
- data/spec/dummy/app/views/posts/_form.html.erb +25 -0
- data/spec/dummy/app/views/posts/edit.html.erb +6 -0
- data/spec/dummy/app/views/posts/index.html.erb +25 -0
- data/spec/dummy/app/views/posts/new.html.erb +5 -0
- data/spec/dummy/app/views/posts/show.html.erb +15 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +45 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +22 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +26 -0
- data/spec/dummy/config/environments/production.rb +49 -0
- data/spec/dummy/config/environments/test.rb +35 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/devise.rb +204 -0
- data/spec/dummy/config/initializers/inflections.rb +10 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/locales/devise.en.yml +53 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +6 -0
- data/spec/dummy/db/migrate/20110630105039_create_posts.rb +14 -0
- data/spec/dummy/db/migrate/20110630111038_devise_create_users.rb +18 -0
- data/spec/dummy/db/schema.rb +34 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +26 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/public/javascripts/application.js +2 -0
- data/spec/dummy/public/javascripts/controls.js +965 -0
- data/spec/dummy/public/javascripts/dragdrop.js +974 -0
- data/spec/dummy/public/javascripts/effects.js +1123 -0
- data/spec/dummy/public/javascripts/prototype.js +6001 -0
- data/spec/dummy/public/javascripts/rails.js +191 -0
- data/spec/dummy/public/stylesheets/.gitkeep +0 -0
- data/spec/dummy/public/stylesheets/scaffold.css +56 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/generators/google_authentication_generator_spec.rb +39 -0
- data/spec/generators/install_generator_spec.rb +23 -0
- data/spec/google_authentication_spec.rb +28 -0
- data/spec/integration/navigation_spec.rb +22 -0
- data/spec/models/acts_as_google_user_spec.rb +67 -0
- data/spec/spec_helper.rb +37 -0
- metadata +289 -0
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'rails/generators/active_record'
|
2
|
+
require 'generators/devise/orm_helpers'
|
3
|
+
|
4
|
+
module GoogleAuthentication
|
5
|
+
module Generators # :nodoc:
|
6
|
+
class GoogleAuthenticationGenerator < ActiveRecord::Generators::Base # :nodoc:
|
7
|
+
namespace "google_authentication"
|
8
|
+
source_root File.expand_path("../../templates", __FILE__)
|
9
|
+
|
10
|
+
# include some helpers from devise
|
11
|
+
include Devise::Generators::OrmHelpers
|
12
|
+
|
13
|
+
# accept same arguments as devise generator with google tuned defaults
|
14
|
+
argument :attributes, :type => :array, :default => ['first_name:string', 'last_name:string'], :banner => "field:type field:type"
|
15
|
+
|
16
|
+
desc "Generates a model with the given NAME with google_authentication " <<
|
17
|
+
"configuration plus a migration file which create it."
|
18
|
+
|
19
|
+
# Generate the model without a migration file using the active_record generator
|
20
|
+
def generate_model
|
21
|
+
invoke "active_record:model", [name], :migration => false unless model_exists? && behavior == :invoke
|
22
|
+
end
|
23
|
+
|
24
|
+
# Build the migration files for the given model
|
25
|
+
def copy_devise_migration
|
26
|
+
migration_template "migration.rb", "db/migrate/devise_create_#{table_name}"
|
27
|
+
end
|
28
|
+
|
29
|
+
# Insert gem activation code into the selected class
|
30
|
+
def inject_google_authentication_content
|
31
|
+
inject_into_class(model_path, class_name) do
|
32
|
+
return nil unless model_exists?
|
33
|
+
" # You can add other devise modules here as arguments, as in devise calls. :omniauthable module is always added\n" <<
|
34
|
+
" # and forbidden devise modules are automatically removed (see GoogleAuthentication::ActsAsGoogleUser::FORBIDDEN_MODULES)\n" <<
|
35
|
+
" # if you change this line, remember to edit the generated migration\n" <<
|
36
|
+
" acts_as_google_user\n"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Show a readme file with further instructions after installation
|
41
|
+
def show_readme
|
42
|
+
readme "MODEL.warning" if behavior == :invoke && class_name != 'User'
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
module GoogleAuthentication
|
3
|
+
module Generators # :nodoc:
|
4
|
+
class InstallGenerator < Rails::Generators::Base # :nodoc:
|
5
|
+
source_root File.expand_path("../../templates", __FILE__)
|
6
|
+
|
7
|
+
desc "Create an initializer for GoogleAuthentication gem and install devise (replace devise:install)"
|
8
|
+
|
9
|
+
class_option :domain, :desc => 'Google(Apps) domain used for authentication', :default => 'gmail.com', :type => :string
|
10
|
+
|
11
|
+
# Copy the initializer template in the config/initializer directory
|
12
|
+
def copy_initializer
|
13
|
+
template "google_authentication.rb", "config/initializers/google_authentication.rb"
|
14
|
+
end
|
15
|
+
|
16
|
+
# Run devise:install generator
|
17
|
+
def install_devise
|
18
|
+
invoke "devise:install"
|
19
|
+
end
|
20
|
+
|
21
|
+
# Show the readme file with further instructions after installation
|
22
|
+
def show_readme
|
23
|
+
readme "README" if behavior == :invoke
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
|
2
|
+
===============================================================================
|
3
|
+
|
4
|
+
*** ATTENTION!!! You have specified a model different than User ***
|
5
|
+
|
6
|
+
You should edit the google_authentication initializer to change the following
|
7
|
+
|
8
|
+
config.model_name = :your-model-name
|
9
|
+
|
10
|
+
===============================================================================
|
@@ -0,0 +1,11 @@
|
|
1
|
+
|
2
|
+
What to do next?
|
3
|
+
|
4
|
+
1. Edit initializer (config/initializer/google_authentication.rb) and fill:
|
5
|
+
- your desired domain for authentication (default gmail.com)
|
6
|
+
- your model used as google user
|
7
|
+
|
8
|
+
2.a Run rails g google_authentication MODEL in order to create a default model
|
9
|
+
2.b (or) add acts_as_google_user to the model used for authentication
|
10
|
+
|
11
|
+
===============================================================================
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# Use this hook to configure GoogleAuthentication, values in the comments are defaults
|
2
|
+
GoogleAuthentication.setup do |config|
|
3
|
+
|
4
|
+
# ==> Domain configuration
|
5
|
+
# Configure here the domain used for the authentication
|
6
|
+
config.domain = '<%= options[:domain] %>'
|
7
|
+
|
8
|
+
# ==> Model configuration
|
9
|
+
# Configure here the model name, it should be the model you've generated
|
10
|
+
# using the provided generator. Don't change after first generation
|
11
|
+
# unless you know what you're doing
|
12
|
+
# config.model_name = :user
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class DeviseCreate<%= table_name.camelize %> < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table(:<%= table_name %>) do |t|
|
4
|
+
t.string :email, :null => :false
|
5
|
+
t.string :omniauth_uid, :null => false
|
6
|
+
|
7
|
+
# t.rememberable
|
8
|
+
# t.trackable
|
9
|
+
# t.confirmable
|
10
|
+
# t.token_authenticatable
|
11
|
+
|
12
|
+
<% for attribute in attributes -%>
|
13
|
+
t.<%= attribute.type %> :<%= attribute.name %>
|
14
|
+
<% end -%>
|
15
|
+
|
16
|
+
t.timestamps
|
17
|
+
end
|
18
|
+
|
19
|
+
add_index :<%= table_name %>, :email, :unique => true
|
20
|
+
add_index :<%= table_name %>, :omniauth_uid, :unique => true
|
21
|
+
# add_index :<%= table_name %>, :authentication_token, :unique => true
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.down
|
25
|
+
drop_table :<%= table_name %>
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'google_authentication/acts_as_google_user'
|
2
|
+
|
3
|
+
# Main module for the gem
|
4
|
+
module GoogleAuthentication
|
5
|
+
|
6
|
+
# domain configuration
|
7
|
+
mattr_accessor :domain
|
8
|
+
# default value for google domain used for authentication
|
9
|
+
@@domain = "gmail.com"
|
10
|
+
|
11
|
+
# model name configuration
|
12
|
+
mattr_accessor :model_name
|
13
|
+
# default model used (singular name)
|
14
|
+
@@model_name = :user
|
15
|
+
|
16
|
+
# Allows config in initializer
|
17
|
+
# @yield [self] Allows config in initializer using the same syntax as Devise
|
18
|
+
# @yieldparam [GoogleAuthentication] config the module itself
|
19
|
+
# @example Changing the authentication setup
|
20
|
+
# GoogleAuthentication.setup do |config|
|
21
|
+
# config.domain = 'your-google-apps-domain.com'
|
22
|
+
# config.model_name = :account
|
23
|
+
# end
|
24
|
+
def self.setup
|
25
|
+
yield self
|
26
|
+
end
|
27
|
+
|
28
|
+
# Used in the routes file to decide wheter to add routes
|
29
|
+
# to the application
|
30
|
+
# @return [bool] true iff the GoogleAuthentication model is already defined
|
31
|
+
def self.define_routes?
|
32
|
+
Object.const_defined?(model_name.to_s.camelize)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Return a symbol which is used to build devise routes
|
36
|
+
# @return [Symbol] a symbol representing the table name used by devise
|
37
|
+
def self.devise_table
|
38
|
+
model_name.to_s.pluralize.to_sym
|
39
|
+
end
|
40
|
+
|
41
|
+
# require the engine if rails is defined
|
42
|
+
require 'google_authentication/engine' if defined?(Rails) && Rails::VERSION::MAJOR == 3
|
43
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
module GoogleAuthentication
|
2
|
+
|
3
|
+
# enclose AR methods used to give a model the ability to authenticate as a Google User
|
4
|
+
# using devise + omniauth combo
|
5
|
+
module ActsAsGoogleUser
|
6
|
+
|
7
|
+
# Devise module to include in included classes
|
8
|
+
mattr_accessor :devise_modules_to_include
|
9
|
+
# default devise modules
|
10
|
+
@@devise_modules_to_include = [:omniauthable]
|
11
|
+
|
12
|
+
# Devise forbidden modules, useless in this context
|
13
|
+
FORBIDDEN_MODULES = [:database_authenticable, :recoverable, :registrable, :encryptable, :lockable, :validatable, :confirmable]
|
14
|
+
|
15
|
+
# Devise allowed modules
|
16
|
+
ALLOWED_MODULES = [:omniauthable, :token_authenticable, :trackable, :timeoutable, :rememberable]
|
17
|
+
|
18
|
+
# Configure a model to be used with devise and google authentication
|
19
|
+
# @param [Array] modules a list of symbols used with a devise call
|
20
|
+
def acts_as_google_user *modules
|
21
|
+
# assign devise modules to module variable
|
22
|
+
if modules.empty?
|
23
|
+
self.devise_modules_to_include = [:omniauthable]
|
24
|
+
else
|
25
|
+
# restrict modules given to devise
|
26
|
+
self.devise_modules_to_include = (modules + [:omniauthable] - FORBIDDEN_MODULES) & ALLOWED_MODULES
|
27
|
+
end
|
28
|
+
# include model methods
|
29
|
+
include ActsAsGoogleUser::Model
|
30
|
+
end
|
31
|
+
|
32
|
+
# Models method added to an AR class which calls acts_as_google_user
|
33
|
+
module Model
|
34
|
+
|
35
|
+
extend ActiveSupport::Concern
|
36
|
+
|
37
|
+
# send devise methods and attr_accessible to the base class
|
38
|
+
included do
|
39
|
+
# include devise modules
|
40
|
+
devise *(ActsAsGoogleUser.devise_modules_to_include)
|
41
|
+
# Setup accessible (or protected) attributes for your model
|
42
|
+
attr_accessible :email
|
43
|
+
end
|
44
|
+
|
45
|
+
module ClassMethods # :nodoc:
|
46
|
+
# Find omniauth given user or create it
|
47
|
+
# @param [Hash] omniauth_data omniauth returned hash
|
48
|
+
def find_or_create_by_omniauth_impl omniauth_data
|
49
|
+
# use custom implementation if given by the user
|
50
|
+
respond_to?(:find_or_create_by_omniauth) ?
|
51
|
+
send(:find_or_create_by_omniauth, omniauth_data) :
|
52
|
+
find_or_create_by_omniauth_default_impl(omniauth_data)
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
# default implementation of find_or_create_by_omniauth_uid
|
58
|
+
# find the user with the given omniauth_uid or create it
|
59
|
+
# assign all properties found in user_info hash to instance
|
60
|
+
# and return it
|
61
|
+
# @param [Hash] omniauth_data omniauth returned hash
|
62
|
+
# @return [ActiveRecord::Base] an instance of the base class
|
63
|
+
def find_or_create_by_omniauth_default_impl omniauth_data
|
64
|
+
find_or_initialize_by_omniauth_uid(omniauth_data['uid']).tap do |user|
|
65
|
+
omniauth_data['user_info'].each do |k, v|
|
66
|
+
user.send "#{k}=", v if user.respond_to? "#{k}="
|
67
|
+
end
|
68
|
+
user.save!
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# make AR extend the module ActsAsGoogleUser
|
77
|
+
ActiveRecord::Base.send :extend, GoogleAuthentication::ActsAsGoogleUser
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'google_authentication'
|
2
|
+
|
3
|
+
require 'rails'
|
4
|
+
require 'action_controller'
|
5
|
+
|
6
|
+
require 'omniauth'
|
7
|
+
require 'devise'
|
8
|
+
|
9
|
+
module GoogleAuthentication
|
10
|
+
# rails engine to add controllers, routes and configuration needed to the gem
|
11
|
+
class Engine < Rails::Engine
|
12
|
+
|
13
|
+
# Initialize devise configuration for omniauth
|
14
|
+
initializer "google_authentication.domain", :before => "devise.omniauth" do
|
15
|
+
require 'openid/store/filesystem'
|
16
|
+
Devise.omniauth :google_apps, OpenID::Store::Filesystem.new('/tmp'), :domain => GoogleAuthentication.domain
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/spec/dummy/Rakefile
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
2
|
+
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
3
|
+
|
4
|
+
require File.expand_path('../config/application', __FILE__)
|
5
|
+
require 'rake'
|
6
|
+
|
7
|
+
Dummy::Application.load_tasks
|
@@ -0,0 +1,83 @@
|
|
1
|
+
class PostsController < ApplicationController
|
2
|
+
# GET /posts
|
3
|
+
# GET /posts.xml
|
4
|
+
def index
|
5
|
+
@posts = Post.all
|
6
|
+
|
7
|
+
respond_to do |format|
|
8
|
+
format.html # index.html.erb
|
9
|
+
format.xml { render :xml => @posts }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# GET /posts/1
|
14
|
+
# GET /posts/1.xml
|
15
|
+
def show
|
16
|
+
@post = Post.find(params[:id])
|
17
|
+
|
18
|
+
respond_to do |format|
|
19
|
+
format.html # show.html.erb
|
20
|
+
format.xml { render :xml => @post }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# GET /posts/new
|
25
|
+
# GET /posts/new.xml
|
26
|
+
def new
|
27
|
+
@post = Post.new
|
28
|
+
|
29
|
+
respond_to do |format|
|
30
|
+
format.html # new.html.erb
|
31
|
+
format.xml { render :xml => @post }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# GET /posts/1/edit
|
36
|
+
def edit
|
37
|
+
@post = Post.find(params[:id])
|
38
|
+
end
|
39
|
+
|
40
|
+
# POST /posts
|
41
|
+
# POST /posts.xml
|
42
|
+
def create
|
43
|
+
@post = Post.new(params[:post])
|
44
|
+
|
45
|
+
respond_to do |format|
|
46
|
+
if @post.save
|
47
|
+
format.html { redirect_to(@post, :notice => 'Post was successfully created.') }
|
48
|
+
format.xml { render :xml => @post, :status => :created, :location => @post }
|
49
|
+
else
|
50
|
+
format.html { render :action => "new" }
|
51
|
+
format.xml { render :xml => @post.errors, :status => :unprocessable_entity }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# PUT /posts/1
|
57
|
+
# PUT /posts/1.xml
|
58
|
+
def update
|
59
|
+
@post = Post.find(params[:id])
|
60
|
+
|
61
|
+
respond_to do |format|
|
62
|
+
if @post.update_attributes(params[:post])
|
63
|
+
format.html { redirect_to(@post, :notice => 'Post was successfully updated.') }
|
64
|
+
format.xml { head :ok }
|
65
|
+
else
|
66
|
+
format.html { render :action => "edit" }
|
67
|
+
format.xml { render :xml => @post.errors, :status => :unprocessable_entity }
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# DELETE /posts/1
|
73
|
+
# DELETE /posts/1.xml
|
74
|
+
def destroy
|
75
|
+
@post = Post.find(params[:id])
|
76
|
+
@post.destroy
|
77
|
+
|
78
|
+
respond_to do |format|
|
79
|
+
format.html { redirect_to(posts_url) }
|
80
|
+
format.xml { head :ok }
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Dummy</title>
|
5
|
+
<%= stylesheet_link_tag :all %>
|
6
|
+
<%= javascript_include_tag :defaults %>
|
7
|
+
<%= csrf_meta_tag %>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
|
11
|
+
<% if current_user %>
|
12
|
+
<p>Currently logged in as <strong><%= current_user.email %></strong></p>
|
13
|
+
<% else %>
|
14
|
+
<p>You're not logged in, <%= link_to 'Login', user_omniauth_authorize_path(:google_apps) %></p>
|
15
|
+
<% end %>
|
16
|
+
|
17
|
+
<p class="notice"><%= notice %></p>
|
18
|
+
<p class="alert"><%= alert %></p>
|
19
|
+
|
20
|
+
<%= yield %>
|
21
|
+
|
22
|
+
</body>
|
23
|
+
</html>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<%= form_for(@post) do |f| %>
|
2
|
+
<% if @post.errors.any? %>
|
3
|
+
<div id="error_explanation">
|
4
|
+
<h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2>
|
5
|
+
|
6
|
+
<ul>
|
7
|
+
<% @post.errors.full_messages.each do |msg| %>
|
8
|
+
<li><%= msg %></li>
|
9
|
+
<% end %>
|
10
|
+
</ul>
|
11
|
+
</div>
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
<div class="field">
|
15
|
+
<%= f.label :title %><br />
|
16
|
+
<%= f.text_field :title %>
|
17
|
+
</div>
|
18
|
+
<div class="field">
|
19
|
+
<%= f.label :content %><br />
|
20
|
+
<%= f.text_area :content %>
|
21
|
+
</div>
|
22
|
+
<div class="actions">
|
23
|
+
<%= f.submit %>
|
24
|
+
</div>
|
25
|
+
<% end %>
|