【问题标题】:How to make API call using API token in Node.js using express, passport-local如何在 Node.js 中使用 express、passport-local 使用 API 令牌进行 API 调用
【发布时间】:2017-03-02 02:41:11
【问题描述】:

我是 Node.js 的新手,正在尝试使用 API 令牌访问 Grafana。 我按照Grafana page 的说明创建了一个 API 令牌。

但是,我不知道如何从我的 node.js 代码调用 API 来访问我的 grafana 页面本地服务器。另外,我有一个本地登录页面,使用 mongoDB 来管理用户。

如何通过 Node.js API 调用访问我的 grafana 页面本地服务器?

请帮帮我..我很难做到这一点.. 如果你想让我显示代码,我可以在这里编辑..

编辑: 这是我的 app.js 的全部代码

var io = require('socket.io');
var express = require('express');
var app = express();
var redis = require('redis');
var sys = require('util');
var fs = require('fs');
//Added for connecting login session
var http = require('http');
var server = http.createServer(app);
var path = require('path');
var mongoose = require('mongoose');
var passport = require('passport');
var session = require('express-session');
var flash = require('connect-flash');
var async = require('async');
var bodyParser = require('body-parser');
var methodOverride = require('method-override');
//Adding grafana
var request = require('request');

//Connecting Database (MongoDB)
mongoose.connect("my mongoDB private address");
var db = mongoose.connection;
db.once("open",function () {
  console.log("DB connected!");
});
db.on("error",function (err) {
  console.log("DB ERROR :", err);
});

//Setting bcrypt for password.
var bcrypt = require("bcrypt-nodejs");

//Setting userSchema for MongoDB.
var userSchema = mongoose.Schema({
  email: {type:String, required:true, unique:true},
  password: {type:String, required:true},
  createdAt: {type:Date, default:Date.now}
});
userSchema.pre("save", function (next){
  var user = this;
  if(!user.isModified("password")){
    return next();
  } else {
    user.password = bcrypt.hashSync(user.password);
    return next();
  }
});

//setting bcrypt for password.
userSchema.methods.authenticate = function (password) {
  var user = this;
  return bcrypt.compareSync(password,user.password);
};

//Setting User as userSchema.
var User = mongoose.model('user',userSchema);

io = io.listen(server);

//Setting middleware for login format.
app.set("view engine", 'ejs');
app.use(express.static(path.join(__dirname, 'public')));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended:true}));
app.use(methodOverride("_method"));
app.use(flash());

app.use(session({secret:'MySecret', resave: true, saveUninitialized: true}));
app.use(passport.initialize());
app.use(passport.session());

//Initializing passport.
passport.serializeUser(function(user, done) {
  //console.log('serializeUser()', user);
  done(null, user.id);
});
passport.deserializeUser(function(id, done) {
  //console.log('deserializeUser()', user);
  User.findById(id, function(err, user) {
    done(err, user);
  });
});
var username_tmp = '';
var global_username = '';         //Global variable for username to put in the address
var pass = '';
//Initializing passport-local strategy.
var LocalStrategy = require('passport-local').Strategy;
passport.use('local-login',
  new LocalStrategy({
      usernameField : 'email',
      passwordField : 'password',
      passReqToCallback : true
    },
    function(req, email, password, done) {
      User.findOne({ 'email' :  email }, function(err, user) {
        if (err) return done(err);
        if (!user){
            req.flash("email", req.body.email);
            return done(null, false, req.flash('loginError', 'No user found.'));
        }
        if (!user.authenticate(password)){
            req.flash("email", req.body.email);
            return done(null, false, req.flash('loginError', 'Password does not Match.'));
        }
        var email_address = req.body.email;
        username_tmp = email_address;
        var username = email_address.substring(0, email_address.lastIndexOf("@"));
        global_username = username;
        pass = req.body.password;
        return done(null, user);
      });
    }
  )
);

//Check whether it is logged in or not.
//If it is not logged in(Session is out), it goes to login page
//If it is logged in(Session is still on), it goes directly to status.html

app.get('/', loggedInCheck);

app.get('/login', function (req, res) {
  res.render('login/login',{email:req.flash("email")[0], loginError:req.flash('loginError')});
});

//Accessing to MongoDB to check to login or not
app.post('/login',
  function (req,res,next){
    next();
  }, passport.authenticate('local-login', {
    successRedirect : '/status',
    failureRedirect : '/login',
    failureFlash : true
  })
);

//Creating new account
app.get('/users/new', function(req,res){
  res.render('users/new', {
                            formData: req.flash('formData')[0],
                            emailError: req.flash('emailError')[0],
                            passwordError: req.flash('passwordError')[0]
                          }
  );
});


//Calling status.html
app.get('/status', isLoggedIn, function(req, res){
  var user_temp = {user: ''};
  user_temp.user = global_username;
  res.render('status/status', user_temp);
  //res.redirect('/status.html?channel=' + global_username);
});

app.get('/grafana', isLoggedIn, function(req, res){
  console.log('Accessing to grafana');
  res.redirect('http://localhost:8080');
 });

request.get('http://localhost:8080',{
  auth: {
    bearer: 'TOKEN HERE'
  }
});


server.listen(4000);

编辑更多

app.get('/grafana', isLoggedIn, function(req, res){
  console.log('Accessing to grafana');
  var url = 'http://localhost:8080/api/dashboards/db/test';
  request.get(url,{
    auth: {
      bearer: 'API token from Grafana page'
    }
  });
  res.redirect(url);
 });

谢谢你..

【问题讨论】:

  • 您应该(不先询问)放置一些与您的问题相关的代码
  • @koceeng 对不起.. 我编辑了它。谢谢
  • 您收到什么错误?
  • @wahwahwah 嗨,我从 app.get('/grafana',...}) 中的上述代码中收到消息“未经授权”的错误;
  • @wahwahwah 我认为是因为重定向..但我不知道如何解决它..

标签: node.js express token passport.js


【解决方案1】:

API 调用是通过 HTTP 请求进行的。你可以使用来自 npm 的 request 包。

来自文档:

您在授权标头中的所有请求中使用该令牌,如下所示: 获取http://your.grafana.com/api/dashboards/db/mydashHTTP/1.1 接受:应用程序/json 授权:承载eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk

示例(我使用的是request-promise,但你可以使用任何你想要的):

let request = require('request-promise');
let url = `http://your.grafana.com/api/dashboards/db/mydash`;
//Obviously replace this with your token
let myToken = `eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk`;
request.get(url).auth(null, null, true, myToken).then(res=> { ... });
// or
request.get(url, {
  auth: {
    bearer: myToken
  }
}).then(res=> { ... });

【讨论】:

  • 感谢您的回答!关于你的回答,我有几个问题。我可以只使用“请求”包而不是“请求承诺”吗? .then(res=>{...}); 里面应该是什么?
  • 如果你使用request而不是request-promise,你将不得不使用节点风格的回调而不是.then() promise语法。检查请求的回购。花括号内是您从 API 获取结果后要运行的代码。
  • 啊哈,我明白了,我还有一个问题。什么是“让”?不应该是 'var' 而不是 'let' 吗?
  • @paulc1111 - see here... javascript 附件很复杂,但当你掌握了它们的窍门时就不那么复杂了。
  • @MuliYulzary 我收到 {message: "Unauthorized"} 你能从帖子中看到我的“编辑更多”吗? :'(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 2013-07-22
  • 2012-09-26
  • 2018-01-18
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
相关资源
最近更新 更多