mirror of
https://github.com/omniauth/omniauth.git
synced 2022-11-09 12:31:49 -05:00
Added gemspecs for gempack setup, each should now be generatable.
This commit is contained in:
parent
0cdc080b59
commit
349cfc3e44
21 changed files with 237 additions and 16 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -4,6 +4,8 @@
|
|||
/live
|
||||
.rvmrc
|
||||
|
||||
dist/*
|
||||
|
||||
## TEXTMATE
|
||||
*.tmproj
|
||||
tmtags
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# OmniAuth
|
||||
# OmniAuth: Standardized Multi-Provider Authentication
|
||||
|
||||
I know what you're thinking: yes, it's yet **another** authentication solution for Rack applications. But we're going to do things a little bit differently this time. OmniAuth is built from the ground up on the philosophy that **authentication is not the same as identity**. OmniAuth is based on two observations:
|
||||
|
||||
1. The traditional 'sign up using a login and password' model is becoming the exception, not the rule. Modern web applications offer external authentication via OpenID, Facebook, and OAuth.
|
||||
1. The traditional 'sign up using a login and password' model is becoming the exception, not the rule. Modern web applications offer external authentication via OpenID, Facebook, and/or OAuth.
|
||||
2. The interconnectable web is no longer a dream, it is a necessity. It is not unreasonable to expect that one application may need to be able to connect to one, three, or twelve other services. Modern authentication systems should a user's identity to be associated with many authentications.
|
||||
|
||||
## Theoretical Framework
|
||||
|
@ -15,4 +15,80 @@ In the Request Phase, we *request* information from the user that is necessary t
|
|||
|
||||
### The Callback Phase
|
||||
|
||||
In the Callback Phase, we receive an authenticated **unique identifier** that can differentiate this user from other users of the same authentication system. Additionally, we may provide **user information** that can be automatically harvested by the application to fill in the details of the authenticating user.
|
||||
In the Callback Phase, we receive an authenticated **unique identifier** that can differentiate this user from other users of the same authentication system. Additionally, we may provide **user information** that can be automatically harvested by the application to fill in the details of the authenticating user.
|
||||
|
||||
## Practical Implementation
|
||||
|
||||
In practical terms, OmniAuth is a collection of Rack middleware, each of which represent an **authentication provider**. The officially maintained providers are:
|
||||
|
||||
* Password (simple SHA1 encryption)
|
||||
* OpenID
|
||||
* OAuth
|
||||
* Twitter
|
||||
* LinkedIn
|
||||
* OpenID
|
||||
* Facebook
|
||||
|
||||
These middleware all follow a consistent pattern in that they initiate the **request phase** when the browser is directed (with additional information in some cases) to `/auth/provider_name`. They then all end their authentication process by calling the main Rack application at the endpoint `/auth/provider_name/callback` with request parameters pre-populated with an `auth` hash containing:
|
||||
|
||||
* `'provider'` - The provider name
|
||||
* `'uid'` - The unique identifier of the user
|
||||
* `'credentials'` - A hash of credentials for access to protected resources from the authentication provider (OAuth, Facebook)
|
||||
* `'user_info'` - Additional information about the user
|
||||
|
||||
What this means is that, for all intents and purposes, your application needs only be concerned with *directing the user to the requesst phase* and *managing user information and session upon authentication callback*. All of the implementation details of the different authentication providers can be treated as a black box.
|
||||
|
||||
## Examples
|
||||
|
||||
### An Authentication Hash
|
||||
|
||||
params['auth'] = {
|
||||
'provider' => 'Twitter',
|
||||
'uid' => '1234567',
|
||||
'credentials => {
|
||||
'token' => 'abc',
|
||||
'secret' => 'def'
|
||||
},
|
||||
'user_info' => {
|
||||
'name' => 'Michael Bleigh',
|
||||
'nickname' => 'mbleigh',
|
||||
'location' => 'Canton, MI',
|
||||
'image' => 'http://aws.twitter.com/...',
|
||||
'urls' => {'Website' => 'http://www.mbleigh.com/'}
|
||||
},
|
||||
'extra' => {
|
||||
'twitter_user' => {
|
||||
'id' => 1234567,
|
||||
'screen_name' => 'mbleigh'
|
||||
# ...
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
### Sinatra
|
||||
|
||||
require 'rubygems'
|
||||
require 'sinatra'
|
||||
require 'omniauth'
|
||||
require 'openid/store/filesystem'
|
||||
|
||||
use OmniAuth::Builder do
|
||||
provider :open_id, OpenID::Store::Filesystem.new('/tmp')
|
||||
provider :twitter, 'consumerkey', 'consumersecret'
|
||||
end
|
||||
|
||||
get '/' do
|
||||
<<-HTML
|
||||
<a href='/auth/twitter'>Sign in with Twitter</a>
|
||||
|
||||
<form action='/auth/open_id' method='post'>
|
||||
<input type='text' name='identifier'/>
|
||||
<input type='submit' value='Sign in with OpenID'/>
|
||||
</form>
|
||||
HTML
|
||||
end
|
||||
|
||||
get '/auth/:name/callback' do
|
||||
auth = params['auth']
|
||||
# do whatever you want with the information!
|
||||
end
|
|
@ -1,6 +1,9 @@
|
|||
require 'rubygems'
|
||||
require 'rake'
|
||||
|
||||
require 'mg'
|
||||
MG.new('oa-basic.gemspec')
|
||||
|
||||
require 'spec/rake/spectask'
|
||||
Spec::Rake::SpecTask.new(:spec) do |spec|
|
||||
spec.libs << '../oa-core/lib' << 'lib' << 'spec'
|
||||
|
|
1
oa-basic/VERSION
Normal file
1
oa-basic/VERSION
Normal file
|
@ -0,0 +1 @@
|
|||
0.0.1
|
21
oa-basic/oa-basic.gemspec
Normal file
21
oa-basic/oa-basic.gemspec
Normal file
|
@ -0,0 +1,21 @@
|
|||
version = File.open(File.dirname(__FILE__) + '/VERSION', 'r').read.strip
|
||||
|
||||
Gem::Specification.new do |gem|
|
||||
gem.name = "oa-basic"
|
||||
gem.version = version
|
||||
gem.summary = %Q{HTTP Basic strategies for OmniAuth.}
|
||||
gem.description = %Q{HTTP Basic strategies for OmniAuth.}
|
||||
gem.email = "michael@intridea.com"
|
||||
gem.homepage = "http://github.com/intridea/omni_auth"
|
||||
gem.authors = ["Michael Bleigh"]
|
||||
|
||||
gem.files = Dir.glob("{lib}/**/*") + %w(README.rdoc LICENSE.rdoc CHANGELOG.rdoc)
|
||||
|
||||
gem.add_dependency 'oa-core', "~> #{version.gsub(/\d$/,'0')}"
|
||||
gem.add_dependency 'restclient'
|
||||
|
||||
gem.add_development_dependency "rspec", ">= 1.2.9"
|
||||
gem.add_development_dependency "webmock"
|
||||
gem.add_development_dependency "rack-test"
|
||||
gem.add_development_dependency "mg"
|
||||
end
|
|
@ -1,6 +1,9 @@
|
|||
require 'rubygems'
|
||||
require 'rake'
|
||||
|
||||
require 'mg'
|
||||
MG.new('oa-core.gemspec')
|
||||
|
||||
require 'spec/rake/spectask'
|
||||
Spec::Rake::SpecTask.new(:spec) do |spec|
|
||||
spec.libs << 'lib' << 'spec'
|
||||
|
|
1
oa-core/VERSION
Normal file
1
oa-core/VERSION
Normal file
|
@ -0,0 +1 @@
|
|||
0.0.1
|
18
oa-core/oa-core.gemspec
Normal file
18
oa-core/oa-core.gemspec
Normal file
|
@ -0,0 +1,18 @@
|
|||
Gem::Specification.new do |gem|
|
||||
gem.name = "oa-basic"
|
||||
gem.version = File.open(File.dirname(__FILE__) + '/VERSION', 'r').read.strip
|
||||
gem.summary = %Q{HTTP Basic strategies for OmniAuth.}
|
||||
gem.description = %Q{HTTP Basic strategies for OmniAuth.}
|
||||
gem.email = "michael@intridea.com"
|
||||
gem.homepage = "http://github.com/intridea/omni_auth"
|
||||
gem.authors = ["Michael Bleigh"]
|
||||
|
||||
gem.files = Dir.glob("{lib}/**/*") + %w(README.rdoc LICENSE.rdoc CHANGELOG.rdoc)
|
||||
|
||||
gem.add_dependency 'rack'
|
||||
|
||||
gem.add_development_dependency "rspec", ">= 1.2.9"
|
||||
gem.add_development_dependency "webmock"
|
||||
gem.add_development_dependency "rack-test"
|
||||
gem.add_development_dependency "mg"
|
||||
end
|
20
oa-core/spec/omniauth/builder_spec.rb
Normal file
20
oa-core/spec/omniauth/builder_spec.rb
Normal file
|
@ -0,0 +1,20 @@
|
|||
require File.dirname(__FILE__) + '/../spec_helper'
|
||||
|
||||
describe OmniAuth::Builder do
|
||||
describe '#provider' do
|
||||
it 'should translate a symbol to a constant' do
|
||||
OmniAuth::Strategies.should_receive(:const_get).with('MyStrategy').and_return(Class.new)
|
||||
OmniAuth::Builder.new(nil) do
|
||||
provider :my_strategy
|
||||
end
|
||||
end
|
||||
|
||||
it 'should also just accept a class' do
|
||||
class ExampleClass; end
|
||||
|
||||
lambda{ OmniAuth::Builder.new(nil) do
|
||||
provider ExampleClass
|
||||
end }.should_not raise_error
|
||||
end
|
||||
end
|
||||
end
|
5
oa-oauth/CHANGELOG.rdoc
Normal file
5
oa-oauth/CHANGELOG.rdoc
Normal file
|
@ -0,0 +1,5 @@
|
|||
= Changelog
|
||||
|
||||
== 0.0.1
|
||||
|
||||
* Initial release!
|
19
oa-oauth/LICENSE.rdoc
Normal file
19
oa-oauth/LICENSE.rdoc
Normal file
|
@ -0,0 +1,19 @@
|
|||
Copyright (c) 2010 Michael Bleigh, Intridea Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
0
oa-oauth/README.rdoc
Normal file
0
oa-oauth/README.rdoc
Normal file
|
@ -1,6 +1,9 @@
|
|||
require 'rubygems'
|
||||
require 'rake'
|
||||
|
||||
require 'mg'
|
||||
MG.new('oa-oauth.gemspec')
|
||||
|
||||
require 'spec/rake/spectask'
|
||||
Spec::Rake::SpecTask.new(:spec) do |spec|
|
||||
spec.libs << '../oa-core/lib' << 'lib' << 'spec'
|
||||
|
|
1
oa-oauth/VERSION
Normal file
1
oa-oauth/VERSION
Normal file
|
@ -0,0 +1 @@
|
|||
0.0.1
|
|
@ -1,18 +1,23 @@
|
|||
require 'omniauth/version'
|
||||
version = File.open(File.dirname(__FILE__) + '/VERSION', 'r').read.strip
|
||||
|
||||
Gem::Specification.new do |gem|
|
||||
gem.name = "oa-oauth"
|
||||
gem.version = File.open(File.dirname(__FILE__) + '/VERSION', 'r').read.trim
|
||||
gem.version = File.open(File.dirname(__FILE__) + '/VERSION', 'r').read.strip
|
||||
gem.summary = %Q{OAuth strategies for OmniAuth.}
|
||||
gem.description = %Q{OAuth strategies for OmniAuth.}
|
||||
gem.email = "michael@intridea.com"
|
||||
gem.homepage = "http://github.com/intridea/omni_auth"
|
||||
gem.authors = ["Michael Bleigh"]
|
||||
|
||||
gem.add_dependency 'oa-core'
|
||||
gem.files = Dir.glob("{lib}/**/*") + %w(README.rdoc LICENSE.rdoc CHANGELOG.rdoc)
|
||||
|
||||
gem.add_dependency 'oa-core', "~> #{version.gsub(/\d$/,'0')}"
|
||||
gem.add_dependency 'oauth'
|
||||
gem.add_dependency 'nokogiri'
|
||||
gem.add_dependency 'json'
|
||||
|
||||
gem.add_development_dependency "rspec", ">= 1.2.9"
|
||||
gem.add_development_dependency "webmock"
|
||||
gem.add_development_dependency "rack-test"
|
||||
gem.add_development_dependency "mg"
|
||||
end
|
|
@ -1,6 +1,9 @@
|
|||
require 'rubygems'
|
||||
require 'rake'
|
||||
|
||||
require 'mg'
|
||||
MG.new('oa-openid.gemspec')
|
||||
|
||||
require 'spec/rake/spectask'
|
||||
Spec::Rake::SpecTask.new(:spec) do |spec|
|
||||
spec.libs << '../oa-core/lib' << 'lib' << 'spec'
|
||||
|
|
1
oa-openid/VERSION
Normal file
1
oa-openid/VERSION
Normal file
|
@ -0,0 +1 @@
|
|||
0.0.1
|
21
oa-openid/oa-openid.gemspec
Normal file
21
oa-openid/oa-openid.gemspec
Normal file
|
@ -0,0 +1,21 @@
|
|||
version = File.open(File.dirname(__FILE__) + '/VERSION', 'r').read.strip
|
||||
|
||||
Gem::Specification.new do |gem|
|
||||
gem.name = "oa-openid"
|
||||
gem.version = File.open(File.dirname(__FILE__) + '/VERSION', 'r').read.strip
|
||||
gem.summary = %Q{OpenID strategies for OmniAuth.}
|
||||
gem.description = %Q{OpenID strategies for OmniAuth.}
|
||||
gem.email = "michael@intridea.com"
|
||||
gem.homepage = "http://github.com/intridea/omni_auth"
|
||||
gem.authors = ["Michael Bleigh"]
|
||||
|
||||
gem.files = Dir.glob("{lib}/**/*") + %w(README.rdoc LICENSE.rdoc CHANGELOG.rdoc)
|
||||
|
||||
gem.add_dependency 'oa-core', "~> #{version.gsub(/\d$/,'0')}"
|
||||
gem.add_dependency 'rack-openid'
|
||||
|
||||
gem.add_development_dependency "rspec", ">= 1.2.9"
|
||||
gem.add_development_dependency "webmock"
|
||||
gem.add_development_dependency "rack-test"
|
||||
gem.add_development_dependency "mg"
|
||||
end
|
|
@ -1,10 +0,0 @@
|
|||
require 'rubygems'
|
||||
require 'rake'
|
||||
|
||||
require 'spec/rake/spectask'
|
||||
Spec::Rake::SpecTask.new(:spec) do |spec|
|
||||
spec.libs << '../oa-core/lib' << 'lib' << 'spec'
|
||||
spec.spec_files = FileList['spec/**/*_spec.rb']
|
||||
end
|
||||
|
||||
task :default => :spec
|
5
omniauth/Rakefile
Normal file
5
omniauth/Rakefile
Normal file
|
@ -0,0 +1,5 @@
|
|||
require 'rubygems'
|
||||
require 'rake'
|
||||
|
||||
require 'mg'
|
||||
MG.new('omniauth.gemspec')
|
23
omniauth/omniauth.gemspec
Normal file
23
omniauth/omniauth.gemspec
Normal file
|
@ -0,0 +1,23 @@
|
|||
version = File.open(File.dirname(__FILE__) + '/VERSION', 'r').read.strip
|
||||
|
||||
Gem::Specification.new do |gem|
|
||||
gem.name = "omniauth"
|
||||
gem.version = File.open(File.dirname(__FILE__) + '/VERSION', 'r').read.strip
|
||||
gem.summary = %Q{Rack middleware for standardized multi-provider authentication.}
|
||||
gem.description = %Q{OmniAuth is an authentication framework that that separates the concept of authentiation from the concept of identity, providing simple hooks for any application to have one or multiple authentication providers for a user.}
|
||||
gem.email = "michael@intridea.com"
|
||||
gem.homepage = "http://github.com/intridea/omni_auth"
|
||||
gem.authors = ["Michael Bleigh"]
|
||||
|
||||
gem.files = Dir.glob("{lib}/**/*") + %w(README.rdoc LICENSE.rdoc CHANGELOG.rdoc)
|
||||
|
||||
gem.add_dependency 'oa-core', "~> #{version.gsub(/\d$/,'0')}"
|
||||
gem.add_dependency 'oa-oauth', "~> #{version.gsub(/\d$/,'0')}"
|
||||
gem.add_dependency 'oa-basic', "~> #{version.gsub(/\d$/,'0')}"
|
||||
gem.add_dependency 'oa-openid', "~> #{version.gsub(/\d$/,'0')}"
|
||||
|
||||
gem.add_development_dependency "rspec", ">= 1.2.9"
|
||||
gem.add_development_dependency "webmock"
|
||||
gem.add_development_dependency "rack-test"
|
||||
gem.add_development_dependency "mg"
|
||||
end
|
Loading…
Reference in a new issue