Adding initial version of the OAuth token authentication method. This adds basic OAuth support for registering apps, getting and revoking keys, etc... The tokens come with 6 separate permissions bits; read/write user preferences, write diaries, write API and read/write GPS traces. Needs more tests.
This commit is contained in:
parent
2ad330d642
commit
b8f6dbd403
85 changed files with 3277 additions and 9 deletions
114
vendor/plugins/oauth-plugin/lib/oauth/rails/controller_methods.rb
vendored
Normal file
114
vendor/plugins/oauth-plugin/lib/oauth/rails/controller_methods.rb
vendored
Normal file
|
@ -0,0 +1,114 @@
|
|||
require 'oauth/signature'
|
||||
module OAuth
|
||||
module Rails
|
||||
|
||||
module ControllerMethods
|
||||
protected
|
||||
|
||||
def current_token
|
||||
@current_token
|
||||
end
|
||||
|
||||
def current_client_application
|
||||
@current_client_application
|
||||
end
|
||||
|
||||
def oauthenticate
|
||||
logger.info "entering oauthenticate"
|
||||
verified=verify_oauth_signature
|
||||
logger.info "verified=#{verified.to_s}"
|
||||
return verified && current_token.is_a?(::AccessToken)
|
||||
end
|
||||
|
||||
def oauth?
|
||||
current_token!=nil
|
||||
end
|
||||
|
||||
# use in a before_filter
|
||||
def oauth_required
|
||||
logger.info "Current_token=#{@current_token.inspect}"
|
||||
if oauthenticate
|
||||
logger.info "passed oauthenticate"
|
||||
if authorized?
|
||||
logger.info "passed authorized"
|
||||
return true
|
||||
else
|
||||
logger.info "failed authorized"
|
||||
invalid_oauth_response
|
||||
end
|
||||
else
|
||||
logger.info "failed oauthenticate"
|
||||
|
||||
invalid_oauth_response
|
||||
end
|
||||
end
|
||||
|
||||
# This requies that you have an acts_as_authenticated compatible authentication plugin installed
|
||||
def login_or_oauth_required
|
||||
if oauthenticate
|
||||
if authorized?
|
||||
return true
|
||||
else
|
||||
invalid_oauth_response
|
||||
end
|
||||
else
|
||||
login_required
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# verifies a request token request
|
||||
def verify_oauth_consumer_signature
|
||||
begin
|
||||
valid = ClientApplication.verify_request(request) do |token, consumer_key|
|
||||
@current_client_application = ClientApplication.find_by_key(consumer_key)
|
||||
|
||||
# return the token secret and the consumer secret
|
||||
[nil, @current_client_application.secret]
|
||||
end
|
||||
rescue
|
||||
valid=false
|
||||
end
|
||||
|
||||
invalid_oauth_response unless valid
|
||||
end
|
||||
|
||||
def verify_oauth_request_token
|
||||
verify_oauth_signature && current_token.is_a?(RequestToken)
|
||||
end
|
||||
|
||||
def invalid_oauth_response(code=401,message="Invalid OAuth Request")
|
||||
render :text => message, :status => code
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def current_token=(token)
|
||||
@current_token=token
|
||||
if @current_token
|
||||
@current_user=@current_token.user
|
||||
@current_client_application=@current_token.client_application
|
||||
end
|
||||
@current_token
|
||||
end
|
||||
|
||||
# Implement this for your own application using app-specific models
|
||||
def verify_oauth_signature
|
||||
begin
|
||||
valid = ClientApplication.verify_request(request) do |request|
|
||||
self.current_token = ClientApplication.find_token(request.token)
|
||||
logger.info "self=#{self.class.to_s}"
|
||||
logger.info "token=#{self.current_token}"
|
||||
# return the token secret and the consumer secret
|
||||
[(current_token.nil? ? nil : current_token.secret), (current_client_application.nil? ? nil : current_client_application.secret)]
|
||||
end
|
||||
# reset @current_user to clear state for restful_...._authentication
|
||||
@current_user = nil if (!valid)
|
||||
valid
|
||||
rescue
|
||||
false
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue