Class: OmniAuth::Strategies::LinkedIn

Inherits:
Object
  • Object
show all
Includes:
OmniAuth::Strategy
Defined in:
lib/omniauth/strategies/linkedin.rb

Overview

Authentication strategy for connecting by [exchanging LinkedIn JSAPI for REST API OAuth Tokens](developer.linkedin.com/documents/exchange-jsapi-tokens-rest-api-oauth-tokens).

Defined Under Namespace

Classes: InvalidSecureCookieError, NoSecureCookieError

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#access_tokenObject

Returns the value of attribute access_token.



59
60
61
# File 'lib/omniauth/strategies/linkedin.rb', line 59

def access_token
  @access_token
end

Instance Method Details

#callback_phaseObject



69
70
71
72
73
74
75
76
77
78
# File 'lib/omniauth/strategies/linkedin.rb', line 69

def callback_phase 
  if request_contains_secure_cookie?
    # We should already have an oauth2 token from secure cookie. 
    # Need to exchange it for an oauth token for REST API
    self.access_token = client.get_access_token(nil, {}, {:xoauth_oauth2_access_token => secure_cookie['access_token']})
    super
  else
    raise NoSecureCookieError, 'must pass a `linkedin_oauth_XXX` cookie'
  end
end

#clientObject



80
81
82
# File 'lib/omniauth/strategies/linkedin.rb', line 80

def client
  @client ||= OAuth::Consumer.new(options.api_key, options.secret_key, options.client_options)
end


96
97
98
99
100
101
102
103
# File 'lib/omniauth/strategies/linkedin.rb', line 96

def parse_secure_cookie(cookie)
  payload = MultiJson.decode cookie
  if validate_signature(payload)
    payload
  else
    raise InvalidSecureCookieError, 'secure cookie signature validation fails'
  end
end

#raw_infoObject



55
56
57
# File 'lib/omniauth/strategies/linkedin.rb', line 55

def raw_info
  @raw_info ||= MultiJson.decode(access_token.get("/v1/people/~:(#{options.fields.join(',')})?format=json").body)
end


92
93
94
# File 'lib/omniauth/strategies/linkedin.rb', line 92

def raw_secure_cookie
  request.cookies["linkedin_oauth_#{options.api_key}"]
end

#request_contains_secure_cookie?Boolean

Returns:

  • (Boolean)


84
85
86
# File 'lib/omniauth/strategies/linkedin.rb', line 84

def request_contains_secure_cookie?
  secure_cookie && secure_cookie['access_token']
end

#request_phaseObject



61
62
63
64
65
66
67
# File 'lib/omniauth/strategies/linkedin.rb', line 61

def request_phase
  url = callback_url
  url << "?" unless url.match(/\?/)
  url << "&" unless url.match(/[\&\?]$/)
  url << Rack::Utils.build_query(request.params)
  redirect url
end


88
89
90
# File 'lib/omniauth/strategies/linkedin.rb', line 88

def secure_cookie
  @secure_cookie ||= raw_secure_cookie && parse_secure_cookie(raw_secure_cookie)
end

#user_nameObject



121
122
123
124
# File 'lib/omniauth/strategies/linkedin.rb', line 121

def user_name
  name = "#{raw_info['firstName']} #{raw_info['lastName']}".strip
  name.empty? ? nil : name
end

#validate_signature(payload) ⇒ Object



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/omniauth/strategies/linkedin.rb', line 105

def validate_signature(payload)
  valid = false
  if payload['signature_version'] == '1' or payload['signature_version'] == 1
    if !payload['signature_order'].nil? and payload['signature_order'].is_a?(Array)
      plain_msg = payload['signature_order'].map {|key| payload[key]}.join('')
      if payload['signature_method'] == 'HMAC-SHA1'
        signature = Base64.encode64(OpenSSL::HMAC.digest('sha1', options.secret_key, plain_msg)).chomp
        if signature == payload['signature']
          valid = true
        end
      end
    end
  end
  valid
end