camping-oauth 1.0.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/README +3 -0
- data/doc/classes/CampingOAuthConsumer.html +145 -0
- data/doc/classes/CampingOAuthConsumer.src/M000041.html +19 -0
- data/doc/classes/CampingOAuthConsumer/Controllers.html +116 -0
- data/doc/classes/CampingOAuthConsumer/Controllers/AccessToken.html +137 -0
- data/doc/classes/CampingOAuthConsumer/Controllers/AccessToken.src/M000051.html +32 -0
- data/doc/classes/CampingOAuthConsumer/Controllers/AccessTokenAuthorized.html +137 -0
- data/doc/classes/CampingOAuthConsumer/Controllers/AccessTokenAuthorized.src/M000050.html +20 -0
- data/doc/classes/CampingOAuthConsumer/Controllers/AuthorizeToken.html +137 -0
- data/doc/classes/CampingOAuthConsumer/Controllers/AuthorizeToken.src/M000048.html +24 -0
- data/doc/classes/CampingOAuthConsumer/Controllers/GetTimeNow.html +137 -0
- data/doc/classes/CampingOAuthConsumer/Controllers/GetTimeNow.src/M000049.html +28 -0
- data/doc/classes/CampingOAuthConsumer/Controllers/Index.html +137 -0
- data/doc/classes/CampingOAuthConsumer/Controllers/Index.src/M000046.html +18 -0
- data/doc/classes/CampingOAuthConsumer/Controllers/RequestToken.html +137 -0
- data/doc/classes/CampingOAuthConsumer/Controllers/RequestToken.src/M000047.html +24 -0
- data/doc/classes/CampingOAuthConsumer/Views.html +176 -0
- data/doc/classes/CampingOAuthConsumer/Views.src/M000042.html +42 -0
- data/doc/classes/CampingOAuthConsumer/Views.src/M000043.html +41 -0
- data/doc/classes/CampingOAuthConsumer/Views.src/M000044.html +18 -0
- data/doc/classes/CampingOAuthConsumer/Views.src/M000045.html +19 -0
- data/doc/classes/CampingOAuthProvider.html +149 -0
- data/doc/classes/CampingOAuthProvider.src/M000052.html +23 -0
- data/doc/classes/CampingOAuthProvider/Controllers.html +113 -0
- data/doc/classes/CampingOAuthProvider/Controllers/APITimeNow.html +137 -0
- data/doc/classes/CampingOAuthProvider/Controllers/APITimeNow.src/M000058.html +23 -0
- data/doc/classes/CampingOAuthProvider/Controllers/Index.html +137 -0
- data/doc/classes/CampingOAuthProvider/Controllers/Index.src/M000055.html +18 -0
- data/doc/classes/CampingOAuthProvider/Controllers/Login.html +152 -0
- data/doc/classes/CampingOAuthProvider/Controllers/Login.src/M000056.html +18 -0
- data/doc/classes/CampingOAuthProvider/Controllers/Login.src/M000057.html +33 -0
- data/doc/classes/CampingOAuthProvider/Helpers.html +112 -0
- data/doc/classes/CampingOAuthProvider/Models.html +119 -0
- data/doc/classes/CampingOAuthProvider/Models/CreateUserSchema.html +152 -0
- data/doc/classes/CampingOAuthProvider/Models/CreateUserSchema.src/M000059.html +26 -0
- data/doc/classes/CampingOAuthProvider/Models/CreateUserSchema.src/M000060.html +19 -0
- data/doc/classes/CampingOAuthProvider/Models/User.html +111 -0
- data/doc/classes/CampingOAuthProvider/Views.html +146 -0
- data/doc/classes/CampingOAuthProvider/Views.src/M000053.html +19 -0
- data/doc/classes/CampingOAuthProvider/Views.src/M000054.html +27 -0
- data/doc/classes/OAuth.html +107 -0
- data/doc/classes/OAuth/RequestProxy.html +112 -0
- data/doc/classes/OAuth/RequestProxy/Base.html +153 -0
- data/doc/classes/OAuth/RequestProxy/Base.src/M000039.html +28 -0
- data/doc/classes/OAuth/RequestProxy/Base.src/M000040.html +28 -0
- data/doc/classes/OAuth/RequestProxy/RackRequest.html +143 -0
- data/doc/classes/OAuth/RequestProxy/RackRequest.src/M000039.html +18 -0
- data/doc/classes/OAuthCampingPlugin.html +188 -0
- data/doc/classes/OAuthCampingPlugin.src/M000001.html +18 -0
- data/doc/classes/OAuthCampingPlugin.src/M000002.html +18 -0
- data/doc/classes/OAuthCampingPlugin.src/M000003.html +17 -0
- data/doc/classes/OAuthCampingPlugin/Controllers.html +191 -0
- data/doc/classes/OAuthCampingPlugin/Controllers.src/M000024.html +18 -0
- data/doc/classes/OAuthCampingPlugin/Controllers.src/M000025.html +26 -0
- data/doc/classes/OAuthCampingPlugin/Filters.html +161 -0
- data/doc/classes/OAuthCampingPlugin/Filters.src/M000034.html +34 -0
- data/doc/classes/OAuthCampingPlugin/Helpers.html +283 -0
- data/doc/classes/OAuthCampingPlugin/Helpers.src/M000026.html +18 -0
- data/doc/classes/OAuthCampingPlugin/Helpers.src/M000027.html +19 -0
- data/doc/classes/OAuthCampingPlugin/Helpers.src/M000028.html +20 -0
- data/doc/classes/OAuthCampingPlugin/Helpers.src/M000029.html +20 -0
- data/doc/classes/OAuthCampingPlugin/Helpers.src/M000030.html +18 -0
- data/doc/classes/OAuthCampingPlugin/Helpers.src/M000031.html +18 -0
- data/doc/classes/OAuthCampingPlugin/Helpers.src/M000032.html +20 -0
- data/doc/classes/OAuthCampingPlugin/Helpers.src/M000033.html +20 -0
- data/doc/classes/OAuthCampingPlugin/Models.html +219 -0
- data/doc/classes/OAuthCampingPlugin/Models.src/M000035.html +55 -0
- data/doc/classes/OAuthCampingPlugin/Models.src/M000036.html +31 -0
- data/doc/classes/OAuthCampingPlugin/Models.src/M000037.html +56 -0
- data/doc/classes/OAuthCampingPlugin/Models.src/M000038.html +22 -0
- data/doc/classes/OAuthCampingPlugin/OAuth.html +407 -0
- data/doc/classes/OAuthCampingPlugin/OAuth.src/M000004.html +18 -0
- data/doc/classes/OAuthCampingPlugin/OAuth.src/M000005.html +18 -0
- data/doc/classes/OAuthCampingPlugin/OAuth.src/M000006.html +20 -0
- data/doc/classes/OAuthCampingPlugin/OAuth.src/M000007.html +20 -0
- data/doc/classes/OAuthCampingPlugin/OAuth.src/M000008.html +20 -0
- data/doc/classes/OAuthCampingPlugin/OAuth.src/M000009.html +24 -0
- data/doc/classes/OAuthCampingPlugin/OAuth.src/M000010.html +20 -0
- data/doc/classes/OAuthCampingPlugin/OAuth.src/M000011.html +18 -0
- data/doc/classes/OAuthCampingPlugin/OAuth.src/M000012.html +19 -0
- data/doc/classes/OAuthCampingPlugin/OAuth.src/M000013.html +26 -0
- data/doc/classes/OAuthCampingPlugin/OAuth.src/M000014.html +26 -0
- data/doc/classes/OAuthCampingPlugin/OAuth.src/M000015.html +33 -0
- data/doc/classes/OAuthCampingPlugin/OAuth.src/M000016.html +18 -0
- data/doc/classes/OAuthCampingPlugin/OAuth.src/M000017.html +18 -0
- data/doc/classes/OAuthCampingPlugin/Views.html +257 -0
- data/doc/classes/OAuthCampingPlugin/Views.src/M000018.html +18 -0
- data/doc/classes/OAuthCampingPlugin/Views.src/M000019.html +18 -0
- data/doc/classes/OAuthCampingPlugin/Views.src/M000020.html +18 -0
- data/doc/classes/OAuthCampingPlugin/Views.src/M000021.html +18 -0
- data/doc/classes/OAuthCampingPlugin/Views.src/M000022.html +18 -0
- data/doc/classes/OAuthCampingPlugin/Views.src/M000023.html +41 -0
- data/doc/created.rid +1 -0
- data/doc/files/examples/camping-oauth-consumer/camping-oauth-consumer_rb.html +124 -0
- data/doc/files/examples/camping-oauth-provider/camping-oauth-provider_rb.html +101 -0
- data/doc/files/lib/camping-oauth_rb.html +576 -0
- data/doc/fr_class_index.html +56 -0
- data/doc/fr_file_index.html +29 -0
- data/doc/fr_method_index.html +86 -0
- data/doc/index.html +24 -0
- data/lib/camping-oauth.rb +1078 -0
- metadata +172 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
2
|
+
<!DOCTYPE html
|
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
5
|
+
|
|
6
|
+
<html>
|
|
7
|
+
<head>
|
|
8
|
+
<title>common_oauth_views (OAuthCampingPlugin::Views)</title>
|
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
|
10
|
+
<link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
|
|
11
|
+
</head>
|
|
12
|
+
<body class="standalone-code">
|
|
13
|
+
<pre><span class="ruby-comment cmt"># File lib/camping-oauth.rb, line 937</span>
|
|
14
|
+
<span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">common_oauth_views</span>
|
|
15
|
+
<span class="ruby-value str">"\ndef authorize_failure\nh1 \"You have denied access to this token\"\nend\n\ndef authorize_failure_token_not_found\nh1 \"Token not found\"\nend\n\ndef authorize_failure_invalidated\nh1 \"Token could not be authorized since it has become invalid\"\nend\n\ndef authorize_success\nh1 \"You have successfully authorized access to this token\"\np @info\nend\n\ndef revoke_success\nh1 \"You have successfully revoked access to this token\"\np @info\nend\n"</span>
|
|
16
|
+
<span class="ruby-keyword kw">end</span></pre>
|
|
17
|
+
</body>
|
|
18
|
+
</html>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
2
|
+
<!DOCTYPE html
|
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
5
|
+
|
|
6
|
+
<html>
|
|
7
|
+
<head>
|
|
8
|
+
<title>register_view (OAuthCampingPlugin::Views)</title>
|
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
|
10
|
+
<link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
|
|
11
|
+
</head>
|
|
12
|
+
<body class="standalone-code">
|
|
13
|
+
<pre><span class="ruby-comment cmt"># File lib/camping-oauth.rb, line 966</span>
|
|
14
|
+
<span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">register_view</span>
|
|
15
|
+
<span class="ruby-value str">"\ndef new_application_registration\nh2 \"New OAuth Consumer\"\nh3 \"Application Registration\"\ndiv.info @info if @info\nform.new_app_reg! :action => R(OAuthRegisterApplication), :method => 'post' do\nlabel 'Name (*)', :for => 'name'; br\ninput.app_name! :name => 'name', :type => 'text'; br\n\nlabel 'Url (*)', :for => 'url'; br\ninput.url :name => 'url', :type => 'text'; br\n\nlabel 'Callback Url (*)', :for => 'callback_url'; br\ninput.url :name => 'callback_url', :type => 'text'; br;\n\nlabel 'Support Url', :for => 'support_url'; br\ninput.url :name => 'support_url', :type => 'text'; br;br;\n\ninput :type => 'submit', :name => 'signup', :value => 'Register'\nend\nend\n\n"</span>
|
|
16
|
+
<span class="ruby-keyword kw">end</span></pre>
|
|
17
|
+
</body>
|
|
18
|
+
</html>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
2
|
+
<!DOCTYPE html
|
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
5
|
+
|
|
6
|
+
<html>
|
|
7
|
+
<head>
|
|
8
|
+
<title>registration_view (OAuthCampingPlugin::Views)</title>
|
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
|
10
|
+
<link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
|
|
11
|
+
</head>
|
|
12
|
+
<body class="standalone-code">
|
|
13
|
+
<pre><span class="ruby-comment cmt"># File lib/camping-oauth.rb, line 995</span>
|
|
14
|
+
<span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">registration_view</span>
|
|
15
|
+
<span class="ruby-value str">"\ndef application_registration\nh2 \"Application Registration\"\ndiv @info if @info\n\ntable.application_registration do\ntr { td \"Name\"; td @application.name}\ntr { td \"Url\"; td @application.url}\ntr { td \"Support Url\"; td @application.support_url}\ntr { td \"Callback Url\"; td @application.callback_url}\ntr { td \"Key\"; td @application.key}\ntr { td \"Secret\"; td @application.secret}\nend\nend\n\n"</span>
|
|
16
|
+
<span class="ruby-keyword kw">end</span></pre>
|
|
17
|
+
</body>
|
|
18
|
+
</html>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
2
|
+
<!DOCTYPE html
|
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
5
|
+
|
|
6
|
+
<html>
|
|
7
|
+
<head>
|
|
8
|
+
<title>authorize_view (OAuthCampingPlugin::Views)</title>
|
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
|
10
|
+
<link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
|
|
11
|
+
</head>
|
|
12
|
+
<body class="standalone-code">
|
|
13
|
+
<pre><span class="ruby-comment cmt"># File lib/camping-oauth.rb, line 1017</span>
|
|
14
|
+
<span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">authorize_view</span>
|
|
15
|
+
<span class="ruby-value str">"\ndef authorize\ndiv @info if @info\nform :action => R(OAuthAuthorizeToken), :method => 'post' do\ninput :name => 'oauth_token', :type=>'hidden', :value=>@oauth_token;\ninput :name => 'authorize', :type=>'checkbox';\nlabel 'Authorize token ' + @oauth_token, :for => 'authorize'; br\n\ninput :type => 'submit', :name => 'authorize_btn', :value => 'Authorize'\na \"Cancel\", :href=>\"/applications\"\nend\nend\n\n"</span>
|
|
16
|
+
<span class="ruby-keyword kw">end</span></pre>
|
|
17
|
+
</body>
|
|
18
|
+
</html>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
2
|
+
<!DOCTYPE html
|
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
5
|
+
|
|
6
|
+
<html>
|
|
7
|
+
<head>
|
|
8
|
+
<title>revoke_view (OAuthCampingPlugin::Views)</title>
|
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
|
10
|
+
<link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
|
|
11
|
+
</head>
|
|
12
|
+
<body class="standalone-code">
|
|
13
|
+
<pre><span class="ruby-comment cmt"># File lib/camping-oauth.rb, line 1037</span>
|
|
14
|
+
<span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">revoke_view</span>
|
|
15
|
+
<span class="ruby-value str">"\ndef revoke\ndiv @info if @info\nform :action => R(OAuthRevokeToken), :method => 'post' do\ninput :name => 'oauth_token', :type=>'hidden', :value=>@token.token;\ninput :name => 'revoke', :type=>'checkbox';\nlabel 'Revoke token ' + @token.token, :for => 'revoke'; br\n\ninput :type => 'submit', :name => 'revoke_btn', :value => 'Revoke'\na \"Cancel\", :href=>\"/applications\"\nend\nend\n\n"</span>
|
|
16
|
+
<span class="ruby-keyword kw">end</span></pre>
|
|
17
|
+
</body>
|
|
18
|
+
</html>
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
2
|
+
<!DOCTYPE html
|
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
5
|
+
|
|
6
|
+
<html>
|
|
7
|
+
<head>
|
|
8
|
+
<title>include_oauth_views (OAuthCampingPlugin::Views)</title>
|
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
|
10
|
+
<link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
|
|
11
|
+
</head>
|
|
12
|
+
<body class="standalone-code">
|
|
13
|
+
<pre><span class="ruby-comment cmt"># File lib/camping-oauth.rb, line 1058</span>
|
|
14
|
+
<span class="ruby-keyword kw">def</span> <span class="ruby-identifier">include_oauth_views</span>
|
|
15
|
+
<span class="ruby-identifier">module_eval</span> <span class="ruby-constant">OAuthCampingPlugin</span><span class="ruby-operator">::</span><span class="ruby-constant">Views</span>.<span class="ruby-identifier">common_oauth_views</span>
|
|
16
|
+
|
|
17
|
+
<span class="ruby-identifier">module_eval</span> <span class="ruby-keyword kw">do</span>
|
|
18
|
+
<span class="ruby-identifier">app_module_name</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">to_s</span>.<span class="ruby-identifier">split</span>(<span class="ruby-value str">"::"</span>).<span class="ruby-identifier">first</span>
|
|
19
|
+
<span class="ruby-identifier">mab_class_name</span> = <span class="ruby-node">"#{app_module_name}::Mab"</span>
|
|
20
|
+
<span class="ruby-identifier">mab_class</span> = <span class="ruby-identifier">mab_class_name</span>.<span class="ruby-identifier">constantize</span>
|
|
21
|
+
|
|
22
|
+
<span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">mab_class</span>.<span class="ruby-identifier">public_instance_methods</span>.<span class="ruby-identifier">include?</span> <span class="ruby-value str">'register'</span>
|
|
23
|
+
<span class="ruby-identifier">module_eval</span> <span class="ruby-constant">OAuthCampingPlugin</span><span class="ruby-operator">::</span><span class="ruby-constant">Views</span>.<span class="ruby-identifier">register_view</span>
|
|
24
|
+
<span class="ruby-keyword kw">end</span>
|
|
25
|
+
|
|
26
|
+
<span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">mab_class</span>.<span class="ruby-identifier">public_instance_methods</span>.<span class="ruby-identifier">include?</span> <span class="ruby-value str">'application_registration'</span>
|
|
27
|
+
<span class="ruby-identifier">module_eval</span> <span class="ruby-constant">OAuthCampingPlugin</span><span class="ruby-operator">::</span><span class="ruby-constant">Views</span>.<span class="ruby-identifier">registration_view</span>
|
|
28
|
+
<span class="ruby-keyword kw">end</span>
|
|
29
|
+
|
|
30
|
+
<span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">mab_class</span>.<span class="ruby-identifier">public_instance_methods</span>.<span class="ruby-identifier">include?</span> <span class="ruby-value str">'authorize'</span>
|
|
31
|
+
<span class="ruby-identifier">module_eval</span> <span class="ruby-constant">OAuthCampingPlugin</span><span class="ruby-operator">::</span><span class="ruby-constant">Views</span>.<span class="ruby-identifier">authorize_view</span>
|
|
32
|
+
<span class="ruby-keyword kw">end</span>
|
|
33
|
+
|
|
34
|
+
<span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">mab_class</span>.<span class="ruby-identifier">public_instance_methods</span>.<span class="ruby-identifier">include?</span> <span class="ruby-value str">'revoke'</span>
|
|
35
|
+
<span class="ruby-identifier">module_eval</span> <span class="ruby-constant">OAuthCampingPlugin</span><span class="ruby-operator">::</span><span class="ruby-constant">Views</span>.<span class="ruby-identifier">revoke_view</span>
|
|
36
|
+
<span class="ruby-keyword kw">end</span>
|
|
37
|
+
<span class="ruby-keyword kw">end</span>
|
|
38
|
+
|
|
39
|
+
<span class="ruby-keyword kw">end</span></pre>
|
|
40
|
+
</body>
|
|
41
|
+
</html>
|
data/doc/created.rid
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Mon, 07 Jun 2010 05:09:03 -0600
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
2
|
+
<!DOCTYPE html
|
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
5
|
+
|
|
6
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
|
7
|
+
<head>
|
|
8
|
+
<title>File: camping-oauth-consumer.rb</title>
|
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
|
10
|
+
<meta http-equiv="Content-Script-Type" content="text/javascript" />
|
|
11
|
+
<link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
|
|
12
|
+
<script type="text/javascript">
|
|
13
|
+
// <![CDATA[
|
|
14
|
+
|
|
15
|
+
function popupCode( url ) {
|
|
16
|
+
window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function toggleCode( id ) {
|
|
20
|
+
if ( document.getElementById )
|
|
21
|
+
elem = document.getElementById( id );
|
|
22
|
+
else if ( document.all )
|
|
23
|
+
elem = eval( "document.all." + id );
|
|
24
|
+
else
|
|
25
|
+
return false;
|
|
26
|
+
|
|
27
|
+
elemStyle = elem.style;
|
|
28
|
+
|
|
29
|
+
if ( elemStyle.display != "block" ) {
|
|
30
|
+
elemStyle.display = "block"
|
|
31
|
+
} else {
|
|
32
|
+
elemStyle.display = "none"
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Make codeblocks hidden by default
|
|
39
|
+
document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
|
|
40
|
+
|
|
41
|
+
// ]]>
|
|
42
|
+
</script>
|
|
43
|
+
|
|
44
|
+
</head>
|
|
45
|
+
<body>
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
<div id="fileHeader">
|
|
50
|
+
<h1>camping-oauth-consumer.rb</h1>
|
|
51
|
+
<table class="header-table">
|
|
52
|
+
<tr class="top-aligned-row">
|
|
53
|
+
<td><strong>Path:</strong></td>
|
|
54
|
+
<td>examples/camping-oauth-consumer/camping-oauth-consumer.rb
|
|
55
|
+
</td>
|
|
56
|
+
</tr>
|
|
57
|
+
<tr class="top-aligned-row">
|
|
58
|
+
<td><strong>Last Update:</strong></td>
|
|
59
|
+
<td>Wed Jun 02 20:18:43 -0600 2010</td>
|
|
60
|
+
</tr>
|
|
61
|
+
</table>
|
|
62
|
+
</div>
|
|
63
|
+
<!-- banner header -->
|
|
64
|
+
|
|
65
|
+
<div id="bodyContent">
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
<div id="contextContent">
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
</div>
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
</div>
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
<!-- if includes -->
|
|
80
|
+
|
|
81
|
+
<div id="section">
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
<div id="constants-list">
|
|
85
|
+
<h3 class="section-bar">Constants</h3>
|
|
86
|
+
|
|
87
|
+
<div class="name-list">
|
|
88
|
+
<table summary="Constants">
|
|
89
|
+
<tr class="top-aligned-row context-row">
|
|
90
|
+
<td class="context-item-name">CampingOAuthProvider_URL</td>
|
|
91
|
+
<td>=</td>
|
|
92
|
+
<td class="context-item-value">"http://localhost:3301/"</td>
|
|
93
|
+
</tr>
|
|
94
|
+
<tr class="top-aligned-row context-row">
|
|
95
|
+
<td class="context-item-name">CampingOAuthProvider_KEY</td>
|
|
96
|
+
<td>=</td>
|
|
97
|
+
<td class="context-item-value">"SQnIXDQyhFB5q3wfZyMY"</td>
|
|
98
|
+
</tr>
|
|
99
|
+
<tr class="top-aligned-row context-row">
|
|
100
|
+
<td class="context-item-name">CampingOAuthProvider_SECRET</td>
|
|
101
|
+
<td>=</td>
|
|
102
|
+
<td class="context-item-value">"PmW02FNs7rXG97sAVXMWhFoJVZ98cnj21vv6p1ad"</td>
|
|
103
|
+
</tr>
|
|
104
|
+
</table>
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
<!-- if method_list -->
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
</div>
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
<div id="validator-badges">
|
|
120
|
+
<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
|
|
121
|
+
</div>
|
|
122
|
+
|
|
123
|
+
</body>
|
|
124
|
+
</html>
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
2
|
+
<!DOCTYPE html
|
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
5
|
+
|
|
6
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
|
7
|
+
<head>
|
|
8
|
+
<title>File: camping-oauth-provider.rb</title>
|
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
|
10
|
+
<meta http-equiv="Content-Script-Type" content="text/javascript" />
|
|
11
|
+
<link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
|
|
12
|
+
<script type="text/javascript">
|
|
13
|
+
// <![CDATA[
|
|
14
|
+
|
|
15
|
+
function popupCode( url ) {
|
|
16
|
+
window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function toggleCode( id ) {
|
|
20
|
+
if ( document.getElementById )
|
|
21
|
+
elem = document.getElementById( id );
|
|
22
|
+
else if ( document.all )
|
|
23
|
+
elem = eval( "document.all." + id );
|
|
24
|
+
else
|
|
25
|
+
return false;
|
|
26
|
+
|
|
27
|
+
elemStyle = elem.style;
|
|
28
|
+
|
|
29
|
+
if ( elemStyle.display != "block" ) {
|
|
30
|
+
elemStyle.display = "block"
|
|
31
|
+
} else {
|
|
32
|
+
elemStyle.display = "none"
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Make codeblocks hidden by default
|
|
39
|
+
document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
|
|
40
|
+
|
|
41
|
+
// ]]>
|
|
42
|
+
</script>
|
|
43
|
+
|
|
44
|
+
</head>
|
|
45
|
+
<body>
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
<div id="fileHeader">
|
|
50
|
+
<h1>camping-oauth-provider.rb</h1>
|
|
51
|
+
<table class="header-table">
|
|
52
|
+
<tr class="top-aligned-row">
|
|
53
|
+
<td><strong>Path:</strong></td>
|
|
54
|
+
<td>examples/camping-oauth-provider/camping-oauth-provider.rb
|
|
55
|
+
</td>
|
|
56
|
+
</tr>
|
|
57
|
+
<tr class="top-aligned-row">
|
|
58
|
+
<td><strong>Last Update:</strong></td>
|
|
59
|
+
<td>Wed Jun 02 20:14:23 -0600 2010</td>
|
|
60
|
+
</tr>
|
|
61
|
+
</table>
|
|
62
|
+
</div>
|
|
63
|
+
<!-- banner header -->
|
|
64
|
+
|
|
65
|
+
<div id="bodyContent">
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
<div id="contextContent">
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
</div>
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
</div>
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
<!-- if includes -->
|
|
80
|
+
|
|
81
|
+
<div id="section">
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
<!-- if method_list -->
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
</div>
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
<div id="validator-badges">
|
|
97
|
+
<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
|
|
98
|
+
</div>
|
|
99
|
+
|
|
100
|
+
</body>
|
|
101
|
+
</html>
|
|
@@ -0,0 +1,576 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
2
|
+
<!DOCTYPE html
|
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
5
|
+
|
|
6
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
|
7
|
+
<head>
|
|
8
|
+
<title>File: camping-oauth.rb</title>
|
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
|
10
|
+
<meta http-equiv="Content-Script-Type" content="text/javascript" />
|
|
11
|
+
<link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
|
|
12
|
+
<script type="text/javascript">
|
|
13
|
+
// <![CDATA[
|
|
14
|
+
|
|
15
|
+
function popupCode( url ) {
|
|
16
|
+
window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function toggleCode( id ) {
|
|
20
|
+
if ( document.getElementById )
|
|
21
|
+
elem = document.getElementById( id );
|
|
22
|
+
else if ( document.all )
|
|
23
|
+
elem = eval( "document.all." + id );
|
|
24
|
+
else
|
|
25
|
+
return false;
|
|
26
|
+
|
|
27
|
+
elemStyle = elem.style;
|
|
28
|
+
|
|
29
|
+
if ( elemStyle.display != "block" ) {
|
|
30
|
+
elemStyle.display = "block"
|
|
31
|
+
} else {
|
|
32
|
+
elemStyle.display = "none"
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Make codeblocks hidden by default
|
|
39
|
+
document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
|
|
40
|
+
|
|
41
|
+
// ]]>
|
|
42
|
+
</script>
|
|
43
|
+
|
|
44
|
+
</head>
|
|
45
|
+
<body>
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
<div id="fileHeader">
|
|
50
|
+
<h1>camping-oauth.rb</h1>
|
|
51
|
+
<table class="header-table">
|
|
52
|
+
<tr class="top-aligned-row">
|
|
53
|
+
<td><strong>Path:</strong></td>
|
|
54
|
+
<td>lib/camping-oauth.rb
|
|
55
|
+
</td>
|
|
56
|
+
</tr>
|
|
57
|
+
<tr class="top-aligned-row">
|
|
58
|
+
<td><strong>Last Update:</strong></td>
|
|
59
|
+
<td>Mon Jun 07 05:05:09 -0600 2010</td>
|
|
60
|
+
</tr>
|
|
61
|
+
</table>
|
|
62
|
+
</div>
|
|
63
|
+
<!-- banner header -->
|
|
64
|
+
|
|
65
|
+
<div id="bodyContent">
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
<div id="contextContent">
|
|
70
|
+
|
|
71
|
+
<div id="description">
|
|
72
|
+
<table>
|
|
73
|
+
<tr><td valign="top">Author:</td><td>Philippe F. Monnet (<a
|
|
74
|
+
href="mailto:pfmonnet@gmail.com">pfmonnet@gmail.com</a>)
|
|
75
|
+
|
|
76
|
+
</td></tr>
|
|
77
|
+
<tr><td valign="top">Copyright:</td><td>Copyright (c) 2010 Philippe F. Monnet - <a
|
|
78
|
+
href="../../classes/OAuth.html">OAuth</a> Camping plugin
|
|
79
|
+
|
|
80
|
+
</td></tr>
|
|
81
|
+
<tr><td valign="top">Copyright:</td><td>Copyright (c) 2009 Pelle Braendgaard - A subset of the Rails <a
|
|
82
|
+
href="../../classes/OAuth.html">OAuth</a> plugin reused in <a
|
|
83
|
+
href="../../classes/OAuth.html">OAuth</a> Camping
|
|
84
|
+
|
|
85
|
+
</td></tr>
|
|
86
|
+
<tr><td valign="top">License:</td><td>Distributes under the same terms as Ruby
|
|
87
|
+
|
|
88
|
+
</td></tr>
|
|
89
|
+
<tr><td valign="top">Version:</td><td>0.0.1
|
|
90
|
+
|
|
91
|
+
</td></tr>
|
|
92
|
+
</table>
|
|
93
|
+
<h1>Installing Camping-<a href="../../classes/OAuth.html">OAuth</a></h1>
|
|
94
|
+
<p>
|
|
95
|
+
A lightweight <a href="../../classes/OAuth.html">OAuth</a> plugin for Ruby
|
|
96
|
+
Camping. To install the library and its prerequisisites, type the following
|
|
97
|
+
commands:
|
|
98
|
+
</p>
|
|
99
|
+
<pre>
|
|
100
|
+
$ gem install filtering_camping
|
|
101
|
+
$ gem install oauth
|
|
102
|
+
$ gem install oauth-plugin
|
|
103
|
+
$ gem install camping-oauth
|
|
104
|
+
</pre>
|
|
105
|
+
<h1>Adding <a href="../../classes/OAuth.html">OAuth</a> Provider Support To Your App</h1>
|
|
106
|
+
<h3>Add new gem and require statements</h3>
|
|
107
|
+
<p>
|
|
108
|
+
Add the following statements towards the top of your source file (before
|
|
109
|
+
the Camping.goes statement):
|
|
110
|
+
</p>
|
|
111
|
+
<pre>
|
|
112
|
+
gem 'camping' , '>= 2.0'
|
|
113
|
+
gem 'filtering_camping'
|
|
114
|
+
gem 'oauth'
|
|
115
|
+
gem 'oauth-plugin'
|
|
116
|
+
|
|
117
|
+
%w(rubygems active_record camping camping/session markaby json redcloth erb
|
|
118
|
+
oauth
|
|
119
|
+
oauth/server
|
|
120
|
+
oauth/request_proxy
|
|
121
|
+
oauth/request_proxy/rack_request
|
|
122
|
+
filtering_camping
|
|
123
|
+
camping-oauth
|
|
124
|
+
).each { |lib| require lib }
|
|
125
|
+
</pre>
|
|
126
|
+
<h3>Customizing the main module</h3>
|
|
127
|
+
<p>
|
|
128
|
+
First we‘ll make sure to include the Camping::Session and
|
|
129
|
+
CampingFilters modules, and to extend the app module with <a
|
|
130
|
+
href="../../classes/OAuthCampingPlugin.html">OAuthCampingPlugin</a>, like
|
|
131
|
+
so:
|
|
132
|
+
</p>
|
|
133
|
+
<pre>
|
|
134
|
+
module CampingOAuthProvider
|
|
135
|
+
include Camping::Session
|
|
136
|
+
include CampingFilters
|
|
137
|
+
extend OAuthCampingPlugin
|
|
138
|
+
include OAuthCampingPlugin::Filters
|
|
139
|
+
|
|
140
|
+
# ...
|
|
141
|
+
end
|
|
142
|
+
</pre>
|
|
143
|
+
<p>
|
|
144
|
+
This gives us the ability to leverage a logger for the camping-oauth
|
|
145
|
+
plugin.
|
|
146
|
+
</p>
|
|
147
|
+
<p>
|
|
148
|
+
<a
|
|
149
|
+
href="../../classes/OAuthCampingPlugin.html#M000001">OAuthCampingPlugin.logger</a>
|
|
150
|
+
= Logger.new(File.dirname(<em>FILE</em>) + ’/yourmodule.log’);
|
|
151
|
+
<a
|
|
152
|
+
href="../../classes/OAuthCampingPlugin.html#M000001">OAuthCampingPlugin.logger</a>.level
|
|
153
|
+
= Logger::DEBUG
|
|
154
|
+
</p>
|
|
155
|
+
<p>
|
|
156
|
+
Now let‘s customize the create method by adding a call to <a
|
|
157
|
+
href="../../classes/OAuthCampingPlugin.html#M000003">OAuthCampingPlugin.create</a>,
|
|
158
|
+
so we can give the plugin to run any needed initialization.
|
|
159
|
+
</p>
|
|
160
|
+
<pre>
|
|
161
|
+
def CampingOAuthProvider.create
|
|
162
|
+
OAuthCampingPlugin.create
|
|
163
|
+
end
|
|
164
|
+
</pre>
|
|
165
|
+
<p>
|
|
166
|
+
Ok, at this point we have a minimally configured application module. Our
|
|
167
|
+
next step is to move on to the Models module.
|
|
168
|
+
</p>
|
|
169
|
+
<h3>Plugging in the <a href="../../classes/OAuth.html">OAuth</a> models</h3>
|
|
170
|
+
<p>
|
|
171
|
+
First, we‘ll include the include <a
|
|
172
|
+
href="../../classes/OAuthCampingPlugin/Models.html">OAuthCampingPlugin::Models</a>
|
|
173
|
+
module so we can get all the <a
|
|
174
|
+
href="../../classes/OAuth.html">OAuth</a>-specific models. Then we‘ll
|
|
175
|
+
define a User model. The User will need to keep track of the applications
|
|
176
|
+
it provided access to. It will also manage the tokens associated with these
|
|
177
|
+
applications. Our model will look like this:
|
|
178
|
+
</p>
|
|
179
|
+
<pre>
|
|
180
|
+
class User < Base;
|
|
181
|
+
has_many :client_applications
|
|
182
|
+
has_many :tokens,
|
|
183
|
+
:class_name=>"OauthToken",
|
|
184
|
+
:order=>"authorized_at desc",
|
|
185
|
+
:include=>[:client_application]
|
|
186
|
+
|
|
187
|
+
end
|
|
188
|
+
</pre>
|
|
189
|
+
<p>
|
|
190
|
+
Now we need a CreateUserSchema migration class to define our database
|
|
191
|
+
tables for User, and <a href="../../classes/OAuth.html">OAuth</a> models.
|
|
192
|
+
In the up and down methods we will plugin a call to the corresponding
|
|
193
|
+
method from the <a
|
|
194
|
+
href="../../classes/OAuthCampingPlugin/Models.html">OAuthCampingPlugin::Models</a>
|
|
195
|
+
module to create the tables for ClientApplication, OAuthToken, and
|
|
196
|
+
OauthNonce.
|
|
197
|
+
</p>
|
|
198
|
+
<pre>
|
|
199
|
+
class CreateUserSchema < V 1.0
|
|
200
|
+
def self.up
|
|
201
|
+
create_table :CampingOAuthProvider_users, :force => true do |t|
|
|
202
|
+
t.integer :id, :null => false
|
|
203
|
+
t.string :username
|
|
204
|
+
t.string :password
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
User.create :username => 'admin', :password => 'camping'
|
|
208
|
+
|
|
209
|
+
OAuthCampingPlugin::Models.up
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def self.down
|
|
213
|
+
OAuthCampingPlugin::Models.down
|
|
214
|
+
drop_table :CampingOAuthProvider_users
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
</pre>
|
|
218
|
+
<p>
|
|
219
|
+
At this point we can go back to the main module and add the code to
|
|
220
|
+
configure the ActiveRecord connection and invoke our new schema migration
|
|
221
|
+
if the User table does not exist yet. This code will be added to the create
|
|
222
|
+
method:
|
|
223
|
+
</p>
|
|
224
|
+
<pre>
|
|
225
|
+
module CampingOAuthProvider
|
|
226
|
+
# ...
|
|
227
|
+
|
|
228
|
+
def CampingOAuthProvider.create
|
|
229
|
+
dbconfig = YAML.load(File.read('config/database.yml'))
|
|
230
|
+
Camping::Models::Base.establish_connection dbconfig['development']
|
|
231
|
+
|
|
232
|
+
OAuthCampingPlugin.create
|
|
233
|
+
|
|
234
|
+
CampingOAuthProvider::Models.create_schema :assume => (CampingOAuthProvider::Models::User.table_exists? ? 1.1 : 0.0)
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
</pre>
|
|
238
|
+
<p>
|
|
239
|
+
You probably noticed that the database configuration is loaded from a
|
|
240
|
+
database.yml file. So let‘s create a subfolder named config and a
|
|
241
|
+
file named database.yml, then let‘s configure the yaml file as
|
|
242
|
+
follows:
|
|
243
|
+
</p>
|
|
244
|
+
<pre>
|
|
245
|
+
development:
|
|
246
|
+
adapter: sqlite3
|
|
247
|
+
database: campingoauthprovider.db
|
|
248
|
+
</pre>
|
|
249
|
+
<p>
|
|
250
|
+
Now if we restart the application, our migration should be executed.
|
|
251
|
+
</p>
|
|
252
|
+
<h3>Creating a common helpers module</h3>
|
|
253
|
+
<p>
|
|
254
|
+
The Helpers module is used in Camping to provide common utilities to both
|
|
255
|
+
the Controllers and Views modules. Enhancing our Helpers module is very
|
|
256
|
+
easy, we need to add both and extend and an include of the <a
|
|
257
|
+
href="../../classes/OAuthCampingPlugin/Helpers.html">OAuthCampingPlugin::Helpers</a>
|
|
258
|
+
module so we can enhance both instance and class sides:
|
|
259
|
+
</p>
|
|
260
|
+
<pre>
|
|
261
|
+
module CampingOAuthProvider::Helpers
|
|
262
|
+
extend OAuthCampingPlugin::Helpers
|
|
263
|
+
include OAuthCampingPlugin::Helpers
|
|
264
|
+
end
|
|
265
|
+
</pre>
|
|
266
|
+
<h3>E.Plugging in the <a href="../../classes/OAuth.html">OAuth</a> controllers</h3>
|
|
267
|
+
<p>
|
|
268
|
+
We will need to extend our app Controllers module with the <a
|
|
269
|
+
href="../../classes/OAuthCampingPlugin/Controllers.html">OAuthCampingPlugin::Controllers</a>
|
|
270
|
+
module using the extend statement. Then just before the end of the
|
|
271
|
+
Controllers module, we‘ll add a call to the include_oauth_controllers
|
|
272
|
+
method. This is how camping-oauth will inject and plugin the common <a
|
|
273
|
+
href="../../classes/OAuth.html">OAuth</a> controllers and helpers. It is
|
|
274
|
+
important that this call always remaining the last statement of the module,
|
|
275
|
+
even when you add new controller classes. So the module should look like
|
|
276
|
+
so:
|
|
277
|
+
</p>
|
|
278
|
+
<pre>
|
|
279
|
+
module CampingOAuthProvider::Controllers
|
|
280
|
+
extend OAuthCampingPlugin::Controllers
|
|
281
|
+
|
|
282
|
+
# ...
|
|
283
|
+
|
|
284
|
+
include_oauth_controllers
|
|
285
|
+
end #Controllers
|
|
286
|
+
</pre>
|
|
287
|
+
<p>
|
|
288
|
+
Before we continue fleshing out the logic of our controllers, let‘s
|
|
289
|
+
finish hooking up the Views module.
|
|
290
|
+
</p>
|
|
291
|
+
<h3>Plugging in the <a href="../../classes/OAuth.html">OAuth</a> common views</h3>
|
|
292
|
+
<p>
|
|
293
|
+
We will need to extend our app Views module with the <a
|
|
294
|
+
href="../../classes/OAuthCampingPlugin/Views.html">OAuthCampingPlugin::Views</a>
|
|
295
|
+
module using the extend statement. Then just before the end of the Views
|
|
296
|
+
module, we‘ll add a call to the include_oauth_views method. This is
|
|
297
|
+
how camping-oauth will inject and plugin the common <a
|
|
298
|
+
href="../../classes/OAuth.html">OAuth</a> views. It is important that this
|
|
299
|
+
call always remaining the last statement of the module, even when you add
|
|
300
|
+
new view methods. So the module should look like so:
|
|
301
|
+
</p>
|
|
302
|
+
<pre>
|
|
303
|
+
module CampingOAuthProvider::Views
|
|
304
|
+
extend OAuthCampingPlugin::Views
|
|
305
|
+
|
|
306
|
+
# ...
|
|
307
|
+
|
|
308
|
+
include_oauth_views
|
|
309
|
+
end
|
|
310
|
+
</pre>
|
|
311
|
+
<h3>Adding basic login and registration capabilities</h3>
|
|
312
|
+
<p>
|
|
313
|
+
Let‘s add a Login controller class to our Controllers module:
|
|
314
|
+
</p>
|
|
315
|
+
<pre>
|
|
316
|
+
class Login < R '/login'
|
|
317
|
+
def get
|
|
318
|
+
render :login
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
def post
|
|
322
|
+
@user = User.find_by_username_and_password(input.username, input.password)
|
|
323
|
+
|
|
324
|
+
if @user
|
|
325
|
+
@state.user_id = @user.id
|
|
326
|
+
|
|
327
|
+
if @state.return_to.nil?
|
|
328
|
+
redirect R(Index)
|
|
329
|
+
else
|
|
330
|
+
return_to = @state.return_to
|
|
331
|
+
@state.return_to = nil
|
|
332
|
+
redirect(return_to)
|
|
333
|
+
end
|
|
334
|
+
else
|
|
335
|
+
@info = 'Wrong username or password.'
|
|
336
|
+
end
|
|
337
|
+
render :login
|
|
338
|
+
end
|
|
339
|
+
end
|
|
340
|
+
</pre>
|
|
341
|
+
<p>
|
|
342
|
+
And now add the corresponding login view in the Views module"
|
|
343
|
+
</p>
|
|
344
|
+
<pre>
|
|
345
|
+
def login
|
|
346
|
+
div @info if @info
|
|
347
|
+
form :action => R(Login), :method => 'post' do
|
|
348
|
+
label 'Username', :for => 'username'; br
|
|
349
|
+
input :name => 'username', :type => 'text'; br
|
|
350
|
+
|
|
351
|
+
label 'Password', :for => 'password'; br
|
|
352
|
+
input :name => 'password', :type => 'text'; br
|
|
353
|
+
|
|
354
|
+
input :type => 'submit', :name => 'login', :value => 'Login'
|
|
355
|
+
end
|
|
356
|
+
end
|
|
357
|
+
</pre>
|
|
358
|
+
<p>
|
|
359
|
+
Let‘s verify we can login by accessing the following url:
|
|
360
|
+
</p>
|
|
361
|
+
<pre>
|
|
362
|
+
http://localhost:3301/login
|
|
363
|
+
</pre>
|
|
364
|
+
<p>
|
|
365
|
+
Now that login support is in place you can test out one of the <a
|
|
366
|
+
href="../../classes/OAuth.html">OAuth</a> controllers by navigating to the
|
|
367
|
+
following url:
|
|
368
|
+
</p>
|
|
369
|
+
<pre>
|
|
370
|
+
http://localhost:3301/oauth/register
|
|
371
|
+
</pre>
|
|
372
|
+
<p>
|
|
373
|
+
Since the camping-oauth plugin installed a :before filter on the
|
|
374
|
+
OAuthRegisterApplication controller requiring user login, you should be
|
|
375
|
+
redirected first to the login page. Since we created a default account when
|
|
376
|
+
running the migration, login as admin with camping as the password. Once
|
|
377
|
+
logged in you should be redirected back to the <a
|
|
378
|
+
href="../../classes/OAuth.html">OAuth</a> Application Registration page.
|
|
379
|
+
</p>
|
|
380
|
+
<p>
|
|
381
|
+
As a side note, you can style all common <a
|
|
382
|
+
href="../../classes/OAuth.html">OAuth</a> views later using CSS.
|
|
383
|
+
We‘ll let you add the SignUp controller and its signup view on your
|
|
384
|
+
own.
|
|
385
|
+
</p>
|
|
386
|
+
<h3>Adding our custom API, protected by <a href="../../classes/OAuth.html">OAuth</a></h3>
|
|
387
|
+
<p>
|
|
388
|
+
Since the premise of this post was to make it easy for web apps to consume
|
|
389
|
+
an <a href="../../classes/OAuth.html">OAuth</a>-protected service,
|
|
390
|
+
let‘s create a very simple controller (no view needed) to expose some
|
|
391
|
+
data as JSON.
|
|
392
|
+
</p>
|
|
393
|
+
<pre>
|
|
394
|
+
class APITimeNow < R '/api/timenow'
|
|
395
|
+
def get
|
|
396
|
+
@result = {:now=>Time.now.utc.to_s}
|
|
397
|
+
@result[:username] = @user.username if @user
|
|
398
|
+
|
|
399
|
+
@headers['Content-Type'] = "application/json"
|
|
400
|
+
log_debug @result.to_json
|
|
401
|
+
@result.to_json
|
|
402
|
+
end
|
|
403
|
+
end
|
|
404
|
+
</pre>
|
|
405
|
+
<p>
|
|
406
|
+
Now we can test it by navigating to the following url (after installing the
|
|
407
|
+
JSONview plugin for FireFox to make it easier to see the returned JSON
|
|
408
|
+
data):
|
|
409
|
+
</p>
|
|
410
|
+
<pre>
|
|
411
|
+
http://localhost:3301/api/timenow
|
|
412
|
+
</pre>
|
|
413
|
+
<p>
|
|
414
|
+
Note that at this point this controller is NOT YET protected by <a
|
|
415
|
+
href="../../classes/OAuth.html">OAuth</a>. For that we need to declare a
|
|
416
|
+
before filter for the APITimeNow controller requiring to be either logged
|
|
417
|
+
in or <a href="../../classes/OAuth.html">OAuth</a>-authenticated. So
|
|
418
|
+
let‘s add this code snippet to our main module:
|
|
419
|
+
</p>
|
|
420
|
+
<pre>
|
|
421
|
+
module GatedCampingSite
|
|
422
|
+
# ...
|
|
423
|
+
|
|
424
|
+
before [:APITimeNow] do
|
|
425
|
+
login_or_oauth_required
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
# ...
|
|
429
|
+
end
|
|
430
|
+
</pre>
|
|
431
|
+
<p>
|
|
432
|
+
So now if we logged out (by deleting the session cookies since we have not
|
|
433
|
+
implemented logoff) and refreshed our browser we would be redirected to the
|
|
434
|
+
login page.
|
|
435
|
+
</p>
|
|
436
|
+
<h2>Testing And Troubleshooting</h2>
|
|
437
|
+
<p>
|
|
438
|
+
At this stage, we have a basic Camping <a
|
|
439
|
+
href="../../classes/OAuth.html">OAuth</a> provider, now let‘s test
|
|
440
|
+
it! The first thing is to register a new <a
|
|
441
|
+
href="../../classes/OAuth.html">OAuth</a> consumer named
|
|
442
|
+
camping-oauth-consumer. We‘ll assume that:
|
|
443
|
+
</p>
|
|
444
|
+
<pre>
|
|
445
|
+
1. it is located at http://localhost:3000/ (fictitious for now)
|
|
446
|
+
2. it exposes a url: http://localhost:3000/callback to accept an OAuth token once authorized
|
|
447
|
+
</pre>
|
|
448
|
+
<p>
|
|
449
|
+
Once you register you should see the a page with the registration results.
|
|
450
|
+
The key and secret will be used by our consumer as credentials when
|
|
451
|
+
accessing our <a href="../../classes/OAuth.html">OAuth</a> provider, so
|
|
452
|
+
copy/paste them into a notepad.
|
|
453
|
+
</p>
|
|
454
|
+
<p>
|
|
455
|
+
For our first test consumer will use IRB, so open up a session and
|
|
456
|
+
let‘s define 3 variables for: url of our provider, key and secret
|
|
457
|
+
(use your own values) of our registered consumer:
|
|
458
|
+
</p>
|
|
459
|
+
<pre>
|
|
460
|
+
@site={:site=>"http://localhost:3301"}
|
|
461
|
+
@mykey="SQnIXDQyhFB5q3wfZyMY"
|
|
462
|
+
@mysecret="PmW02FNs7rXG97sAVXMWhFoJVZ98cnj21vv6p1ad"
|
|
463
|
+
</pre>
|
|
464
|
+
<p>
|
|
465
|
+
Now let‘s require oauth and let‘s instantiate an <a
|
|
466
|
+
href="../../classes/OAuth.html">OAuth</a> consumer:
|
|
467
|
+
</p>
|
|
468
|
+
<pre>
|
|
469
|
+
require 'oauth'
|
|
470
|
+
@consumer = OAuth::Consumer.new(@mykey,@mysecret,@site)
|
|
471
|
+
</pre>
|
|
472
|
+
<p>
|
|
473
|
+
You should get an instance of a OAuth::Consumer back. Our next step is to
|
|
474
|
+
request an <a href="../../classes/OAuth.html">OAuth</a> RequestToken like
|
|
475
|
+
so:
|
|
476
|
+
</p>
|
|
477
|
+
<pre>
|
|
478
|
+
@request_token = @consumer.get_request_token
|
|
479
|
+
</pre>
|
|
480
|
+
<p>
|
|
481
|
+
You should get an OAuth::RequestToken back. Let‘s see how and where
|
|
482
|
+
we should authorize this request token:
|
|
483
|
+
</p>
|
|
484
|
+
<pre>
|
|
485
|
+
http://localhost:3301/oauth/authorize?oauth_token=0Qd6g3SjWHQEM6sUTcd9
|
|
486
|
+
</pre>
|
|
487
|
+
<p>
|
|
488
|
+
We should be prompted by the <a href="../../classes/OAuth.html">OAuth</a>
|
|
489
|
+
Authorization controller of our provider. If you click on the checkbox and
|
|
490
|
+
the Authorize button, the provider will redirect you to the callback url we
|
|
491
|
+
defined during registration passing back the Oauth token id and and a
|
|
492
|
+
verifier code. Since we don‘t have a consumer web app up and running,
|
|
493
|
+
we will get a navigation error. Here is what the target (redirection) url
|
|
494
|
+
looks like:
|
|
495
|
+
</p>
|
|
496
|
+
<pre>
|
|
497
|
+
http://localhost:3000/callback?oauth_token=0Qd6g3SjWHQEM6sUTcd9&oauth_verifier=71Jt3GhiwvHlZYO9zA8c
|
|
498
|
+
</pre>
|
|
499
|
+
<p>
|
|
500
|
+
This verifier acts as a sort of session id we need to pass to get an <a
|
|
501
|
+
href="../../classes/OAuth.html">OAuth</a> Access Token. So from our IRB
|
|
502
|
+
session, let‘s evaluate the following statement:
|
|
503
|
+
</p>
|
|
504
|
+
<pre>
|
|
505
|
+
@verifier = '71Jt3GhiwvHlZYO9zA8c'
|
|
506
|
+
@access_token = @request_token.get_access_token(:oauth_verifier=>@verifier)
|
|
507
|
+
</pre>
|
|
508
|
+
<p>
|
|
509
|
+
You should get an instance of OAuth::AccessToken back. So now let‘s
|
|
510
|
+
call our provider api:
|
|
511
|
+
</p>
|
|
512
|
+
<pre>
|
|
513
|
+
@response = @access_token.get('/api/timenow')
|
|
514
|
+
@info = @response.body
|
|
515
|
+
</pre>
|
|
516
|
+
<p>
|
|
517
|
+
You should get back a JSON object. So this concludes our whirlwind tour of
|
|
518
|
+
<a href="../../classes/OAuth.html">OAuth</a> from a provider and consumer
|
|
519
|
+
side.
|
|
520
|
+
</p>
|
|
521
|
+
<h3>Examples Source Code</h3>
|
|
522
|
+
<p>
|
|
523
|
+
Also if you look in the examples folder of the camping-oauth gem you will
|
|
524
|
+
find the full source for both a provider (the one we have been working on)
|
|
525
|
+
and a consumer app (to be run on port 3302).
|
|
526
|
+
</p>
|
|
527
|
+
<h1>More information</h1>
|
|
528
|
+
<p>
|
|
529
|
+
Check for updates :
|
|
530
|
+
</p>
|
|
531
|
+
<ul>
|
|
532
|
+
<li><a href="http://blog.monnet-usa.com">blog.monnet-usa.com</a>
|
|
533
|
+
|
|
534
|
+
</li>
|
|
535
|
+
</ul>
|
|
536
|
+
|
|
537
|
+
</div>
|
|
538
|
+
|
|
539
|
+
<div id="requires-list">
|
|
540
|
+
<h3 class="section-bar">Required files</h3>
|
|
541
|
+
|
|
542
|
+
<div class="name-list">
|
|
543
|
+
oauth
|
|
544
|
+
activerecord
|
|
545
|
+
</div>
|
|
546
|
+
</div>
|
|
547
|
+
|
|
548
|
+
</div>
|
|
549
|
+
|
|
550
|
+
|
|
551
|
+
</div>
|
|
552
|
+
|
|
553
|
+
|
|
554
|
+
<!-- if includes -->
|
|
555
|
+
|
|
556
|
+
<div id="section">
|
|
557
|
+
|
|
558
|
+
|
|
559
|
+
|
|
560
|
+
|
|
561
|
+
|
|
562
|
+
|
|
563
|
+
|
|
564
|
+
|
|
565
|
+
<!-- if method_list -->
|
|
566
|
+
|
|
567
|
+
|
|
568
|
+
</div>
|
|
569
|
+
|
|
570
|
+
|
|
571
|
+
<div id="validator-badges">
|
|
572
|
+
<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
|
|
573
|
+
</div>
|
|
574
|
+
|
|
575
|
+
</body>
|
|
576
|
+
</html>
|