Steve
Steve

Reputation: 1854

Node-LinkedIn module returns "Unknown Authentication Scheme"

I'm using the node-linkedin npm package to authenticate and read information about from other users (name, job title, company name, profile pic, shared connections). I can correctly receive and store the access token (verified in my own LinkedIn profile's approved apps & console logging the token), but I am unable to return any of the requested information. My calls are copied & pasted from the package docs, but it returns the following:

2018-02-28T03:46:53.459839+00:00 app[web.1]: { errorCode: 0,
2018-02-28T03:46:53.459843+00:00 app[web.1]:   message: 'Unknown authentication scheme',
2018-02-28T03:46:53.459845+00:00 app[web.1]:   requestId: '3B55EVY7XQ',
2018-02-28T03:46:53.459847+00:00 app[web.1]:   status: 401,
2018-02-28T03:46:53.459848+00:00 app[web.1]:   timestamp: 1519789613443 }

I have included my routes below. Solely for the purpose of testing, myToken and linkedin are server-side global variables to the linkedin-controller scope. (I understand this will need to change for the final product, which is a student project.)

app.get('/companies', function (req, res) {
    console.log(linkedin.connections.config.accessToken);
    linkedin.companies_search.name('facebook', 1, function(err, company) {
        console.log('Merpy merpy mc merpers'
            ,company);
        // name = company.companies.values[0].name;
        // desc = company.companies.values[0].description;
        // industry = company.companies.values[0].industries.values[0].name;
        // city = company.companies.values[0].locations.values[0].address.city;
        // websiteUrl = company.companies.values[0].websiteUrl;
        res.redirect("/");
    });
});

app.get('/companies2', function (req, res) {
    linkedin.companies.company('162479', function(err, company) {
        console.log(company);
        res.redirect("/");
    });
});

app.get('/connections', function (req, res) {
    linkedin.connections.retrieve(function(err, connections) {
        console.log(connections);
        res.redirect("/");
    });
});

This is my authorization code, which appears to work:

    app.get('/auth', function (req, res) {
    // This is the redirect URI which linkedin will call to and provide state and code to verify
    /**
     *
     * Attached to the redirect_uri will be two important URL arguments that you need to read from the request:

     code — The OAuth 2.0 authorization code.
     state — A value used to test for possible CSRF attacks.
     */

    //TODO: validate state here to secure against CSRF
    var error = req.query.error;
    var error_description = req.query.error_description;
    var state = req.query.state;
    var code = req.query.code;
    if (error) {
        next(new Error(error));
    }
    /**
     *
     * The code is a value that you will exchange with LinkedIn for an actual OAuth 2.0 access
     * token in the next step of the authentcation process.  For security reasons, the authorization code
     * has a very short lifespan and must be used within moments of receiving it - before it expires and
     * you need to repeat all of the previous steps to request another.
     */
    //once the code is received handshake back with linkedin to send over the secret key
    handshake(req.query.code, res);
});

function handshake(code, ores) {

    //set all required post parameters
    var data = querystring.stringify({
        grant_type: "authorization_code",
        code: code,
        redirect_uri: OauthParams.redirect_uri,//should match as in Linkedin application setup
        client_id: OauthParams.client_id,
        client_secret: OauthParams.client_secret// the secret
    });

    var options = {
        host: 'www.linkedin.com',
        path: '/oauth/v2/accessToken',
        protocol: 'https:',
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Content-Length': Buffer.byteLength(data)
        }
    };

    var req = http.request(options, function (res) {
        var data = '';
        res.setEncoding('utf8');
        res.on('data', function (chunk) {
            data += chunk;

        });
        res.on('end', function () {
            //once the access token is received store it
            myToken = JSON.parse(data);
            linkedin = Linkedin.init(myToken);
            ores.redirect("/");
        });
        req.on('error', function (e) {
            console.log("problem with request: " + e.message);
        });

    });
    req.write(data);
    req.end();
}

In my troubleshooting research, it seems I need to pass the token into the request; however, I can't find anywhere or any way to do so in the package. And with as many daily downloads as the package has, I can't possibly be the only one to experience this error. The author's Issues section of GitHub were unhelpful, as were other searches for this package's error.

My deployment: https://linkedin-api-test.herokuapp.com/

My Repo: https://github.com/SteveSonoa/LinkedIn-Test

node-linkedin Docs: https://github.com/ArkeologeN/node-linkedin/blob/master/README.md

This is my first question I haven't been able to find the answer to; I apologize if I left out anything important while asking. Thank you in advance for any help!

Upvotes: 0

Views: 307

Answers (1)

Steve
Steve

Reputation: 1854

The solution was to pass the following token code into the linkedin variable instead of simply passing myToken:

linkedin = Linkedin.init(myToken.access_token || myToken.accessToken);

I don't understand the downvote, as no comments were left; I apologize if I left out important or generally expected information, as this was the first question I've asked. I want to make sure the solution is posted for anyone coming after me with the same issue. This issue is now solved.

Upvotes: 1

Related Questions