one_click 0.1.0
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/Manifest +13 -0
- data/README.rdoc +64 -0
- data/Rakefile +12 -0
- data/VERSION +1 -0
- data/lib/one_click/authenticators/oauth_authenticator.rb +7 -0
- data/lib/one_click/controller_extensions.rb +56 -0
- data/lib/one_click/services/twitter_service.rb +90 -0
- data/lib/one_click.rb +52 -0
- metadata +78 -0
data/Manifest
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
README.rdoc
|
2
|
+
Rakefile
|
3
|
+
VERSION
|
4
|
+
app/controllers/sessions_controller.rb
|
5
|
+
app/models/one_click_twitter_service.rb
|
6
|
+
app/models/one_click_user.rb
|
7
|
+
app/models/twitter.rb
|
8
|
+
config/routes.rb
|
9
|
+
lib/one_click.rb
|
10
|
+
lib/one_click/authenticators/oauth_authenticator.rb
|
11
|
+
lib/one_click/controller_extensions.rb
|
12
|
+
lib/one_click/services/twitter_service.rb
|
13
|
+
Manifest
|
data/README.rdoc
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
= OneClick
|
2
|
+
|
3
|
+
Let your users register with one click using open standards for authenticating. Currently supporting only Twitter. Tested in Rails 2.3.5. Should work in all 2.3 version. Probably not Rails 3.
|
4
|
+
|
5
|
+
Currently supporting only MongoMapper! Will support ActiveRecord and more platforms (Facebook, OpenID) eventually.
|
6
|
+
|
7
|
+
== Requirements
|
8
|
+
|
9
|
+
Needs twitter_oauth.
|
10
|
+
|
11
|
+
sudo gem install twitter_oauth
|
12
|
+
|
13
|
+
== Installation
|
14
|
+
|
15
|
+
sudo gem install one_click
|
16
|
+
|
17
|
+
environment.rb
|
18
|
+
|
19
|
+
config.gem "one_click"
|
20
|
+
|
21
|
+
=== Configuration
|
22
|
+
|
23
|
+
Add an initializer in config/initializers for example one_click_config.rb;
|
24
|
+
|
25
|
+
OneClick.config = {
|
26
|
+
:twitter => {
|
27
|
+
:key => 'your key',
|
28
|
+
:secret => 'your secret'
|
29
|
+
}
|
30
|
+
}
|
31
|
+
|
32
|
+
=== User Model
|
33
|
+
|
34
|
+
User model needs to extend OneClickUser and associate twitter (one), like so:
|
35
|
+
|
36
|
+
class User < OneClickUser
|
37
|
+
one :twitter
|
38
|
+
end
|
39
|
+
|
40
|
+
The Twitter object is automatically maintained by the gem.
|
41
|
+
|
42
|
+
== Usage
|
43
|
+
|
44
|
+
Using the gem is easy. There are three defined routes:
|
45
|
+
|
46
|
+
map.login '/login/callback', :controller => :sessions, :action => 'callback'
|
47
|
+
map.login '/login/:service', :controller => :sessions, :action => 'login'
|
48
|
+
map.login '/logout', :controller => :sessions, :action => 'logout'
|
49
|
+
|
50
|
+
Access /login/twitter to login with Twitter. Once logged in, a new User is created with a twitter profile associated if it didn't already exist. The created User is blank.
|
51
|
+
|
52
|
+
To access the currently logged in user simply call 'current_user'.
|
53
|
+
|
54
|
+
There are three helper methods; 'requires_login', 'requires_logout' and 'logged_in?'. So to set up a page which requires login simply use a before filter;
|
55
|
+
|
56
|
+
class AdminController < ApplicationController
|
57
|
+
|
58
|
+
before_filter :requires_login
|
59
|
+
|
60
|
+
def index
|
61
|
+
# Something nifty
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
data/Rakefile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'echoe'
|
4
|
+
|
5
|
+
Echoe.new('one_click', '0.1.0') do |p|
|
6
|
+
p.description = "Let your users register with one click using open standards for authenticating"
|
7
|
+
p.url = "http://github.com/ArosME/one_click"
|
8
|
+
p.author = "Arjen Oosterkamp"
|
9
|
+
p.email = "mail@arjen.me"
|
10
|
+
p.ignore_pattern = ["tmp/*", "script/*"]
|
11
|
+
p.development_dependencies = []
|
12
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module OneClick
|
2
|
+
module ControllerExtensions
|
3
|
+
def self.included(base)
|
4
|
+
base.send :helper_method, :current_user, :referer, :requires_login, :requires_logout, :logged_in?
|
5
|
+
end
|
6
|
+
|
7
|
+
protected
|
8
|
+
|
9
|
+
def current_service
|
10
|
+
unless @current_service
|
11
|
+
if !session[:one_click] || !session[:one_click][:access]
|
12
|
+
service = cookies[:one_click_service]
|
13
|
+
|
14
|
+
access = {
|
15
|
+
:token => cookies[:one_click_access_token],
|
16
|
+
:secret => cookies[:one_click_access_secret]
|
17
|
+
}
|
18
|
+
|
19
|
+
OneClick.store_session(session, service, access) if service && access
|
20
|
+
end
|
21
|
+
|
22
|
+
if session[:one_click]
|
23
|
+
@current_service = OneClick.get_service_model(session[:one_click][:service], { :access => session[:one_click][:access] }) if session[:one_click][:service] && session[:one_click][:access]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
@current_service
|
28
|
+
end
|
29
|
+
|
30
|
+
def current_user
|
31
|
+
unless @current_user
|
32
|
+
@current_user = current_service.user if current_service
|
33
|
+
end
|
34
|
+
|
35
|
+
@current_user
|
36
|
+
end
|
37
|
+
|
38
|
+
def logged_in?
|
39
|
+
!!current_user
|
40
|
+
end
|
41
|
+
|
42
|
+
def requires_login
|
43
|
+
redirect_to root_url if !logged_in?
|
44
|
+
end
|
45
|
+
|
46
|
+
def requires_logout
|
47
|
+
redirect_to root_url if logged_in?
|
48
|
+
end
|
49
|
+
|
50
|
+
def referer
|
51
|
+
return request.referer ? request.referer : root_url
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
ActionController::Base.send(:include, OneClick::ControllerExtensions)
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'twitter_oauth'
|
2
|
+
|
3
|
+
module OneClick
|
4
|
+
module Services
|
5
|
+
class TwitterService
|
6
|
+
def initialize(config)
|
7
|
+
@config = config
|
8
|
+
end
|
9
|
+
|
10
|
+
def config
|
11
|
+
@config
|
12
|
+
end
|
13
|
+
|
14
|
+
def key
|
15
|
+
config[:key]
|
16
|
+
end
|
17
|
+
|
18
|
+
def secret
|
19
|
+
config[:secret]
|
20
|
+
end
|
21
|
+
|
22
|
+
def client
|
23
|
+
@client ||= TwitterOAuth::Client.new(
|
24
|
+
:consumer_key => key,
|
25
|
+
:consumer_secret => secret
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
def authenticated_client(options={})
|
30
|
+
access = options[:access]
|
31
|
+
|
32
|
+
return false if !access
|
33
|
+
|
34
|
+
client = TwitterOAuth::Client.new(
|
35
|
+
:consumer_key => key,
|
36
|
+
:consumer_secret => secret,
|
37
|
+
:token => access[:token],
|
38
|
+
:secret => access[:secret]
|
39
|
+
)
|
40
|
+
end
|
41
|
+
|
42
|
+
def login(options={})
|
43
|
+
callback = options[:callback]
|
44
|
+
|
45
|
+
request_token = client.request_token(:oauth_callback => callback)
|
46
|
+
|
47
|
+
return_object = {
|
48
|
+
:request => {
|
49
|
+
:token => request_token.token,
|
50
|
+
:secret => request_token.secret
|
51
|
+
},
|
52
|
+
:url => request_token.authorize_url
|
53
|
+
}
|
54
|
+
end
|
55
|
+
|
56
|
+
# Attemps to authorize with Twitter
|
57
|
+
def callback(options = {})
|
58
|
+
request = options[:request]
|
59
|
+
verifier = options[:params][:oauth_verifier]
|
60
|
+
|
61
|
+
return false if !request || !verifier
|
62
|
+
|
63
|
+
access_token = client.authorize(
|
64
|
+
request[:token],
|
65
|
+
request[:secret],
|
66
|
+
:oauth_verifier => verifier
|
67
|
+
)
|
68
|
+
|
69
|
+
if client.authorized?
|
70
|
+
return return_object = {
|
71
|
+
:id => client.info['id'],
|
72
|
+
:data => client.info,
|
73
|
+
:access => {
|
74
|
+
:token => access_token.token,
|
75
|
+
:secret => access_token.secret
|
76
|
+
}
|
77
|
+
}
|
78
|
+
else
|
79
|
+
return false
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def get_service_model(options={})
|
84
|
+
access = options[:access]
|
85
|
+
|
86
|
+
Twitter.find_by_access_token_and_access_secret access[:token], access[:secret]
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
data/lib/one_click.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'oauth'
|
2
|
+
require 'twitter_oauth'
|
3
|
+
|
4
|
+
require 'one_click/controller_extensions'
|
5
|
+
|
6
|
+
module OneClick
|
7
|
+
#VERSION = '0.0.1'
|
8
|
+
|
9
|
+
def self.config=(config)
|
10
|
+
@config = config
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.config
|
14
|
+
@config
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.store_session(session, service, access)
|
18
|
+
session[:one_click] ||= {}
|
19
|
+
|
20
|
+
session[:one_click][:service] = service
|
21
|
+
session[:one_click][:access] = access
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.store_cookies(cookies, service, access)
|
25
|
+
cookies[:one_click_service] = { :value => service, :expires => 30.days.from_now }
|
26
|
+
cookies[:one_click_access_token] = { :value => access[:token], :expires => 30.days.from_now }
|
27
|
+
cookies[:one_click_access_secret] = { :value => access[:secret], :expires => 30.days.from_now }
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.get_service_model(service, options={})
|
31
|
+
self.get_service(service).get_service_model(options)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.login(service, options={})
|
35
|
+
self.get_service(service).login(options) if get_service(service)
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.callback(service, options={})
|
39
|
+
self.get_service(service).callback(options)
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.authenticated_client(service, options={})
|
43
|
+
self.get_service(service).authenticated_client(options)
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.get_service(service)
|
47
|
+
case service
|
48
|
+
when 'twitter'
|
49
|
+
return self::Services::TwitterService.new(config[:twitter]) if config[:twitter]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
metadata
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: one_click
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Arjen Oosterkamp
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-08-05 00:00:00 +02:00
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: Let your users register with one click using open standards for authenticating
|
23
|
+
email: mail@arjen.me
|
24
|
+
executables: []
|
25
|
+
|
26
|
+
extensions: []
|
27
|
+
|
28
|
+
extra_rdoc_files:
|
29
|
+
- Manifest
|
30
|
+
- Rakefile
|
31
|
+
- README.rdoc
|
32
|
+
- VERSION
|
33
|
+
files:
|
34
|
+
- lib/one_click/controller_extensions.rb
|
35
|
+
- lib/one_click/authenticators/oauth_authenticator.rb
|
36
|
+
- lib/one_click/services/twitter_service.rb
|
37
|
+
- lib/one_click.rb
|
38
|
+
- Manifest
|
39
|
+
- Rakefile
|
40
|
+
- README.rdoc
|
41
|
+
- VERSION
|
42
|
+
has_rdoc: true
|
43
|
+
homepage: http://www.arjen.me/
|
44
|
+
licenses: []
|
45
|
+
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options:
|
48
|
+
- --title
|
49
|
+
- OneClick -- Easy OneClick authenticating
|
50
|
+
require_paths:
|
51
|
+
- lib
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
hash: 3
|
58
|
+
segments:
|
59
|
+
- 0
|
60
|
+
version: "0"
|
61
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
hash: 3
|
67
|
+
segments:
|
68
|
+
- 0
|
69
|
+
version: "0"
|
70
|
+
requirements: []
|
71
|
+
|
72
|
+
rubyforge_project:
|
73
|
+
rubygems_version: 1.3.7
|
74
|
+
signing_key:
|
75
|
+
specification_version: 3
|
76
|
+
summary: Let your users register with one click using open standards for authenticating
|
77
|
+
test_files: []
|
78
|
+
|