Skip to content
This repository has been archived by the owner on Mar 3, 2023. It is now read-only.

Consider using OAuth2 for LinkedIn #81

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
121 changes: 42 additions & 79 deletions lib/services/linkedin.js
Original file line number Diff line number Diff line change
@@ -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;