Class: HTTPClient::OAuth

Inherits:
Object
  • Object
show all
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

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Util

#argument_to_hash, hash_find_value, #http?, #https?, #keyword_argument, try_require, uri_dirname, uri_part_of, urify

Constructor Details

#initializeOAuth

Creates new DigestAuth filter.



766
767
768
769
770
771
772
773
774
775
776
# File 'lib/httpclient/auth.rb', line 766

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

#schemeObject (readonly)

Authentication scheme.



696
697
698
# File 'lib/httpclient/auth.rb', line 696

def scheme
  @scheme
end

Class Method Details

.escape(str) ⇒ Object

:nodoc:



749
750
751
752
753
754
755
756
757
758
759
# File 'lib/httpclient/auth.rb', line 749

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.



839
840
841
842
843
844
845
846
847
848
# File 'lib/httpclient/auth.rb', line 839

def challenge(uri, param_str = nil)
  synchronize {
    if uri.nil?
      @challenge[nil] = true
    else
      @challenge[urify(uri)] = true
    end
    false
  }
end

#escape(str) ⇒ Object



761
762
763
# File 'lib/httpclient/auth.rb', line 761

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



820
821
822
823
824
825
826
827
828
829
830
# File 'lib/httpclient/auth.rb', line 820

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.



810
811
812
813
814
# File 'lib/httpclient/auth.rb', line 810

def get_config(uri = nil)
  synchronize {
    do_get_config(uri)
  }
end

#reset_challengeObject

Resets challenge state. Do not send ‘*Authorization’ header until the server sends ‘*Authentication’ again.



780
781
782
783
784
# File 'lib/httpclient/auth.rb', line 780

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=



788
789
790
# File 'lib/httpclient/auth.rb', line 788

def set(*args)
  # not supported
end

#set?Boolean

Check always (not effective but it works)

Returns:

  • (Boolean)


793
794
795
# File 'lib/httpclient/auth.rb', line 793

def set?
  !@challenge.empty?
end

#set_config(uri, config) ⇒ Object

Set authentication credential.



798
799
800
801
802
803
804
805
806
807
# File 'lib/httpclient/auth.rb', line 798

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