Class: HTTPClient::OAuth
- Inherits:
-
Object
- Object
- HTTPClient::OAuth
- Includes:
- Util, Mutex_m
- Defined in:
- lib/httpclient/auth.rb
Overview
Authentication filter for handling OAuth negotiation. Used in WWWAuth.
CAUTION: This impl only support ‘#7 Accessing Protected Resources’ in OAuth Core 1.0 spec for now. You need to obtain Access token and Access secret by yourself.
CAUTION: This impl does NOT support OAuth Request Body Hash spec for now. oauth.googlecode.com/svn/spec/ext/body_hash/1.0/oauth-bodyhash.html
Defined Under Namespace
Classes: Config
Instance Attribute Summary collapse
-
#scheme ⇒ Object
readonly
Authentication scheme.
Class Method Summary collapse
-
.escape(str) ⇒ Object
:nodoc:.
Instance Method Summary collapse
-
#challenge(uri, param_str = nil) ⇒ Object
Challenge handler: remember URL for response.
- #escape(str) ⇒ Object
-
#get(req) ⇒ Object
Response handler: returns credential.
-
#get_config(uri = nil) ⇒ Object
Get authentication credential.
-
#initialize ⇒ OAuth
constructor
Creates new DigestAuth filter.
-
#reset_challenge ⇒ Object
Resets challenge state.
-
#set(*args) ⇒ Object
Set authentication credential.
-
#set? ⇒ Boolean
Check always (not effective but it works).
-
#set_config(uri, config) ⇒ Object
Set authentication credential.
Methods included from Util
#argument_to_hash, hash_find_value, #http?, #https?, #keyword_argument, try_require, uri_dirname, uri_part_of, urify
Constructor Details
#initialize ⇒ OAuth
Creates new DigestAuth filter.
770 771 772 773 774 775 776 777 778 779 780 |
# File 'lib/httpclient/auth.rb', line 770 def initialize super @config = nil # common config @auth = {} # configs for each site @challenge = {} @nonce_count = 0 @signature_handler = { 'HMAC-SHA1' => method(:sign_hmac_sha1) } @scheme = "OAuth" end |
Instance Attribute Details
#scheme ⇒ Object (readonly)
Authentication scheme.
700 701 702 |
# File 'lib/httpclient/auth.rb', line 700 def scheme @scheme end |
Class Method Details
.escape(str) ⇒ Object
:nodoc:
753 754 755 756 757 758 759 760 761 762 763 |
# File 'lib/httpclient/auth.rb', line 753 def self.escape(str) # :nodoc: if str.respond_to?(:force_encoding) str.dup.force_encoding('BINARY').gsub(/([^a-zA-Z0-9_.~-]+)/) { '%' + $1.unpack('H2' * $1.bytesize).join('%').upcase } else str.gsub(/([^a-zA-Z0-9_.~-]+)/n) { '%' + $1.unpack('H2' * $1.bytesize).join('%').upcase } end end |
Instance Method Details
#challenge(uri, param_str = nil) ⇒ Object
Challenge handler: remember URL for response.
challenge() in OAuth handler always returns false to avoid connection retry which should not work in OAuth authentication context. This method just remember URL (nil means ‘any’) for the next connection. Normally OAuthClient handles this correctly but see how it uses when you need to use this class directly.
843 844 845 846 847 848 849 850 851 852 |
# File 'lib/httpclient/auth.rb', line 843 def challenge(uri, param_str = nil) synchronize { if uri.nil? @challenge[nil] = true else @challenge[urify(uri)] = true end false } end |
#escape(str) ⇒ Object
765 766 767 |
# File 'lib/httpclient/auth.rb', line 765 def escape(str) self.class.escape(str) end |
#get(req) ⇒ Object
Response handler: returns credential. It sends cred only when a given uri is;
-
child page of challengeable(got *Authenticate before) uri and,
-
child page of defined credential
824 825 826 827 828 829 830 831 832 833 834 |
# File 'lib/httpclient/auth.rb', line 824 def get(req) target_uri = req.header.request_uri synchronize { return nil unless @challenge[nil] or @challenge.find { |uri, ok| Util.uri_part_of(target_uri, uri) and ok } config = do_get_config(target_uri) || @config return nil unless config calc_cred(req, config) } end |
#get_config(uri = nil) ⇒ Object
Get authentication credential.
814 815 816 817 818 |
# File 'lib/httpclient/auth.rb', line 814 def get_config(uri = nil) synchronize { do_get_config(uri) } end |
#reset_challenge ⇒ Object
Resets challenge state. Do not send ‘*Authorization’ header until the server sends ‘*Authentication’ again.
784 785 786 787 788 |
# File 'lib/httpclient/auth.rb', line 784 def reset_challenge synchronize do @challenge.clear end end |
#set(*args) ⇒ Object
Set authentication credential. You cannot set OAuth config via WWWAuth#set_auth. Use OAuth#config=
792 793 794 |
# File 'lib/httpclient/auth.rb', line 792 def set(*args) # not supported end |
#set? ⇒ Boolean
Check always (not effective but it works)
797 798 799 |
# File 'lib/httpclient/auth.rb', line 797 def set? !@challenge.empty? end |
#set_config(uri, config) ⇒ Object
Set authentication credential.
802 803 804 805 806 807 808 809 810 811 |
# File 'lib/httpclient/auth.rb', line 802 def set_config(uri, config) synchronize do if uri.nil? @config = config else uri = Util.uri_dirname(urify(uri)) @auth[uri] = config end end end |