【问题标题】:Instagram OAuthException : you must provide a client_idInstagram OAuthException:您必须提供 client_id
【发布时间】:2017-01-03 06:46:06
【问题描述】:

我一直在尝试在我的网络应用程序中使用 instagram API 的服务器端身份验证。我已按照Intagram's API Page 提供的步骤进行操作,但我不断收到错误you must provide a client_id。代码用 node/express.js 编写。这是我的代码。
PS:请不要建议我使用 istagram-node API。

index.js

var bodyParser = require('body-parser');
var express = require('express');
var app = express();
var https = require('https');
var session = require('express-session');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended:true}));
app.use(express.static(__dirname+'/public'));
app.use(session({
  secret: process.env.SECRET,
  resave: true,
  saveUninitialized: false
}))

app.set('port',process.env.PORT);

app.get('/',function(req,res){
  res.render('index')
});

app.get('/home',function(req,res){
  req.session.code = req.query.code;
  var data = JSON.stringify({
      client_id: process.env.CLIENT_ID,
      client_secret: process.env.CLIENT_SECRET,
      grant_type: "authorizaton_code",
      redirect_uri: "...",
      code: req.session.code
  })
  var options = {
    headers:{
      'content-type': 'application/x-www-form-urlencoded'
    },
      hostname: 'api.instagram.com',
      path: '/oauth/access_token',
      method:'POST',
      port:443
    }
    var request = https.request(options,function(resp){
      resp.on('data',function(chunk){
        req.session.data = chunk.toString();
      })
    })
    request.write(data);
    request.end();
    setTimeout(function(){
      res.json(req.session.data)
    },5000);
})

app.listen(app.get('port'),function(){
  console.log("All eyes at "+process.env.PORT);
});

【问题讨论】:

  • 您没有指定客户端 ID 和客户端密码的值。你可以看看nodejs.org/api/process.html#process_process_env。您还可以考虑使用 env2 库并将环境变量存储在 .env 中,而不是在 JavaScript 中声明。
  • 我正在使用 heroku 来托管应用程序。我已经使用heroku config:set CLIENT_ID=... 设置了环境变量。所以,我可以使用 process.env 访问它们。当我运行heroku config:get CLEINT_ID 时,我得到了正确的输出
  • 验证“数据”变量是否正确或将其附加到您的问题中。
  • This 是 Instagram 的官方文档,我已按照说明进行操作,希望没有遗漏任何内容。

标签: javascript node.js express https instagram-api


【解决方案1】:

整个上午都在挠头。事实证明,您必须将其作为表单数据发布。

添加

   const FormData = require('form-data');

在顶部 那么你的代码如下:

  var data = new FormData();
  data.append('client_id',config.instagramAuth.client_id)
  data.append('client_secret',config.instagramAuth.client_secret)
  data.append('redirect_uri',redirect_uri)
  data.append('grant_type','authorization_code')
  data.append('code',code)

和你的获取:

  fetch(url, {
        method: 'POST',
        body: data //JSON.stringify(postData)
      })

希望对你有帮助

【讨论】:

  • 您是否使用此代码收到“TypeError: str.replace is not a function”?