Search code examples
javascriptnode.jsexpressinstagram-api

Make http request within node js routes


I am building a slideshow that pulls pictures with a certain tag on instagram. The Instagram API requires me to make a call to their auth URL to receive an access token. Using node js and express I built out the backend like so:

var express = require('express');
var app = express();
app.use(express.static('public'));

app.listen(4000,function(){
   console.log("Listening to app on localhost 4000"); 
})

app.get('/',function(req,res){
    1. make call to Instagram authorization URL:
    https://api.instagram.com/oauth/authorize/?client_id=CLIENT-ID&redirect_uri=http://localhost:4000&response_type=code

    2. URL will be redirected with access code parameter

    3. Use access code to make POST request to receive access token to be able to make GET requests.

})

My question is how do I make a request to visit that url within NodeJS/Express? Is it just a normal http.request()?

I don't want to user to go through the redirect process so that's why I want to put it in Node. I'm following these instructions https://www.instagram.com/developer/authentication/


Solution

  • You can do a redirect or use a npm library like instagram-node-lib

    var express = require('express');
    var request = require('request');
    var app = express();
    
    app.use(express.static('public'));
    
    app.listen(4000, function () {
        console.log("Listening to app on localhost 4000");
    })
    
    app.get('/', function (req, res) {
        res.redirect('https://api.instagram.com/oauth/authorize/?client_id=CLIENT-ID&redirect_uri=http://localhost:4000/mycallback&response_type=code')
    })
    
    app.get('/mycallback', function (req, res) {
        //handle token retrieval here
        //do a get request as per the instagram documentation using the code sent back
        var code = req.query.code
    
    
        var url = 'https://api.instagram.com/oauth/access_token'
        var options = {
            method: 'post',
            body: {
                client_secret: 'CLIENT_SECRET',
                grant_type: 'authorization_code',
                redirect_uri: 'AUTHORIZATION_REDIRECT_URI',
                code: code
            },
            json: true,
            url: url
        }
        request(options, function (err, res, body) {
            //body should look something like this
            // {
            //     "access_token": "fb2e77d.47a0479900504cb3ab4a1f626d174d2d",
            //     "user": {
            //         "id": "1574083",
            //         "username": "snoopdogg",
            //         "full_name": "Snoop Dogg",
            //         "profile_picture": "..."
            //     }
            // }
        })
    })
    

    You will always require the redirect as that is how oAuth works. The user enters a password on the Instagram site. A code is sent back to your server via a callback url (redirect). You then use that code to retrieve the user token. You can then use the authorization token for subsequent calls.