From d070c12e069511bbd029cd9bdd36cbf97ce4dd1e Mon Sep 17 00:00:00 2001 From: Vlad Date: Wed, 4 Feb 2015 17:33:21 +0200 Subject: [PATCH] Replaced LinkedIn service with OAuth2 version --- lib/services/linkedin.js | 121 ++++++++++++++------------------------- 1 file changed, 42 insertions(+), 79 deletions(-) diff --git a/lib/services/linkedin.js b/lib/services/linkedin.js index dd0b8dd..2875865 100644 --- a/lib/services/linkedin.js +++ b/lib/services/linkedin.js @@ -1,88 +1,51 @@ -var EventEmitter = require("events").EventEmitter +var OAuth2 = require("./oauth2") , util = require("util") - , url = require("url") - , OAuth - , secrets = {} -try { OAuth = require("oauth").OAuth } -catch (e) { - throw new Error("oauth library could not be loaded.") -} - -function LinkedIn(options) { - this.id = options.id - this.secret = options.secret - this.scopes = options.scopes || ["r_basicprofile"] - this.format = options.format || "json" - this.fields = options.fields || ["first-name","last-name","picture-url","industry","summary","specialties","skills","projects","headline","site-standard-profile-request"] - - this.dataUrl = "http://api.linkedin.com/v1/people/~:(id,"+ this.fields.join(",") +")?format=" + this.format - - this.on("request", this.onRequest.bind(this)) - - EventEmitter.call(this) -} - -util.inherits(LinkedIn, EventEmitter) - -LinkedIn.prototype.parseURI = function(request) { - var protocol = request.socket.encrypted ? "https" : "http" - , host = request.headers.host || request.connection.remoteAddress - - return url.parse(protocol + "://" + host + request.url, true) -} - -LinkedIn.prototype.onRequest = function(req, res) { - var self = this - , uri = this.parseURI(req) - , verifier = uri.query.oauth_verifier - , token = uri.query.oauth_token - , oa = new OAuth( - "https://api.linkedin.com/uas/oauth/requestToken" + "?scope=" + this.scopes.join("+"), - "https://api.linkedin.com/uas/oauth/accessToken", - this.id, - this.secret, - "1.0", - url.format(uri), - "HMAC-SHA1" - ) - - if (verifier && token) { - oa.getOAuthAccessToken(token, secrets[token], verifier, onToken) +function LinkedIn2(options) { + var url = require('url').parse(options.url || 'https://www.linkedin.com') + var protocol = url.protocol.split(':')[0]; + var apiPath = '' + var scope = options.scopes || ["r_basicprofile"]; + var fields = options.fields || ["first-name","last-name","picture-url","industry","summary","specialties","skills","projects","headline","site-standard-profile-request"] + + this.code = { + protocol: protocol, + host: url.host, + pathname: "/uas/oauth2/authorization", + query: { + client_id: options.id, + redirect_uri: options.redirect_uri, + scope: scope.join(' '), + state: options.state || +new Date, + response_type: 'code' + } } - else oa.getOAuthRequestToken(function(error, oauth_token, oauth_token_secret, results){ - if (error) return self.emit("error", req, res, uri.query, error) - - secrets[oauth_token] = oauth_token_secret - setTimeout(function(){ delete secrets[oauth_token] }, 60000) + this.token = { + method: "POST", + host: url.host, + path: '/uas/oauth2/accessToken', + query: { + client_id: options.id, + client_secret: options.secret, + grant_type: 'authorization_code' + } + } - res.writeHead(302, { - Location: "https://www.linkedin.com/uas/oauth/authenticate?oauth_token=" + oauth_token - }) + this.user = { + host: 'api.linkedin.com', + path: '/v1/people/~:(id,'+ fields.join(",") +')', + tokenKey: 'oauth2_access_token', + query: { + format: 'json' + } + } - res.end() - }) - + this.on("request", this.onRequest.bind(this)) - function onToken(error, oauth_access_token, oauth_access_token_secret, results){ - if (error) return self.emit("error", req, res, uri.query, error) - - oa.getProtectedResource( - self.dataUrl, - "GET", - oauth_access_token, - oauth_access_token_secret, - function (error, data, response) { - var feed = JSON.parse(data); - self.emit("auth", req, res, { - token: oauth_access_token, - secret: oauth_access_token_secret, - id: feed.id, - data: feed - }); - }); - } + OAuth2.call(this, options); } -module.exports = LinkedIn +util.inherits(LinkedIn2, OAuth2) + +module.exports = LinkedIn2;