class Warden::GitHub::OAuth

Constants

BadVerificationCode

Attributes

client_id[R]
client_secret[R]
code[R]
redirect_uri[R]
scope[R]
state[R]

Public Class Methods

new(attrs={}) click to toggle source
# File lib/warden/github/oauth.rb, line 16
def initialize(attrs={})
  @code = attrs[:code]
  @state = attrs[:state]
  @scope = attrs[:scope]
  @client_id = attrs.fetch(:client_id)
  @client_secret = attrs.fetch(:client_secret)
  @redirect_uri = attrs.fetch(:redirect_uri)
end

Public Instance Methods

access_token() click to toggle source
# File lib/warden/github/oauth.rb, line 34
def access_token
  @access_token ||= load_access_token
end
authorize_uri() click to toggle source
# File lib/warden/github/oauth.rb, line 25
def authorize_uri
  @authorize_uri ||= build_uri(
    '/login/oauth/authorize',
    client_id: client_id,
    redirect_uri: redirect_uri,
    scope: scope,
    state: state)
end

Private Instance Methods

access_token_uri() click to toggle source
# File lib/warden/github/oauth.rb, line 53
def access_token_uri
  @access_token_uri ||= build_uri(
    '/login/oauth/access_token',
    client_id: client_id,
    client_secret: client_secret,
    code: code)
end
build_uri(path, params) click to toggle source
# File lib/warden/github/oauth.rb, line 61
def build_uri(path, params)
  URI(Octokit.web_endpoint).tap do |uri|
    uri.path = path
    uri.query = encode_params(normalize_params(params))
  end
end
decode_params(params) click to toggle source
# File lib/warden/github/oauth.rb, line 84
def decode_params(params)
  if URI.respond_to? :decode_www_form
    return Hash[URI.decode_www_form(params)]
  end

  Hash[
    params.split('&').map { |i|
      i.split('=').map { |i| URI.decode(i) }
    }
  ]
end
encode_params(params) click to toggle source
# File lib/warden/github/oauth.rb, line 72
def encode_params(params)
  if URI.respond_to? :encode_www_form
    return URI.encode_www_form(params)
  end

  params.map { |*kv|
    kv.flatten.map { |i|
      URI.encode(i.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
    }.join('=')
  }.join('&')
end
load_access_token() click to toggle source
# File lib/warden/github/oauth.rb, line 40
def load_access_token
  http = Net::HTTP.new(access_token_uri.host, access_token_uri.port)
  http.use_ssl = access_token_uri.scheme == 'https'

  request = Net::HTTP::Post.new(access_token_uri.path)
  request.body = access_token_uri.query

  response = http.request(request)
  decode_params(response.body).fetch('access_token')
rescue IndexError
  fail BadVerificationCode, 'Bad verification code'
end
normalize_params(params) click to toggle source
# File lib/warden/github/oauth.rb, line 68
def normalize_params(params)
  params.reject { |_,v| v.nil? || v == '' }
end