javascript - 使用 OAuth 将 REST 调用从 Node 服务器发送到第三方应用程序

标签 javascript node.js express oauth connect

enter image description here

我正在实现一个处理聊天消息的服务器。在某些情况下,我想从 JIRA 实例访问数据。我正在使用 passport-atlassian-oauth 策略通过 JIRA 和 BearerStrategy 对请求进行身份验证,但我的问题是身份验证仅在用户授予“我的服务器”对 JIRA 的读写权限后在浏览器中有效。在许多指南中,他们只是在成功验证后调用 res.redirect('/successfulLogin') 或类似的东西,但我更想对 JIRA 进行 rest 调用,处理数据并将其发送到我连接的客户端应用程序。

我该怎么做?

我对这一切完全陌生,一切都在我的脑海中盘旋。我保存并可以访问用于身份验证的 token ,例如,当我在浏览器中导航到 .../test/access_token=?[token] 时,它可以正常工作。

passport.use(new BearerStrategy(
    function(token, done) {
      // Find user by token
      client.smembers('access_token:' + token, function(err, replies) {
        if (err) {
          return done(err);
        }
        // if user found
        // TODO: yet again, hard coded for one
        if (replies.length > 0) {
          console.log('SHOULD BE 1:', replies[0]);
          client.hgetall('users:' + replies[0], function(err, user) {
            if (err) {
              return done(err);
            }
            if (!user) {
              return done(null, false);
            }
            return done(null, user, {scope: 'all'});
          });
        }
      });
    }
  ));

如您所见,它仅针对一个用户进行了硬编码,我将 Redis 用作“数据库”。

  passport.use(new AtlassianOAuthStrategy({
      applicationURL: 'http://localhost:2990/jira',
      callbackURL: '/auth/atlassian-oauth/callback',
      consumerKey: RsaPublicKey,
      consumerSecret: rsaPrivateKey,
      clientId: 'MyBot'
    },
    function(accessToken, tokenSecret, profile, done) {
      // Find user
      client.hgetall('users:1', function(err, user) {
        if(err) {
          return done(err);
        }
        // user not found
        if(!user) {
          // create new user, no worries!
          // TODO: HARD CODED FOR ONE USER
          client.hmset('users:1', 'id', profile.id, 'access_token', accessToken, function(err, res) {
            client.sadd('id:admin', '1');
            client.sadd('access_token:'+ accessToken, '1');
            client.hgetall(profile.id, function(err, user) {
              return done(null, user);
            });
          });
        } else {
          // Update access token!
          client.hmset(profile.id, 'access_token', accessToken, function() {
            client.sadd('access_token:' + accessToken, '1', function() {
              client.hgetall(profile.id, function(err, result) {
                return done(null, user);
              });
            });
          });

        }
      });
    }
  ));

剩下的

  app.get('/auth/atlassian-oauth',
    passport.authenticate('atlassian-oauth', {session: false, scope: []}),
    function(req, res) {
      console.log('- Function: /auth/atlassian-oauth - should not be called)');
    });

  app.get('/auth/atlassian-oauth/callback',
    passport.authenticate('atlassian-oauth', {session: false, failureRedirect: '/login'}),
    function(req, res) {
      console.log('- Function: /auth/atlassian-oauth/callback - Authentication successful!', req.user.access_token);
      // Update access token!
      // Should I even do this? Shouldn't I already have the correct token?
      client.hmset('users:1', 'access_token', req.user.access_token, function() {
        client.sadd('access_token:' + req.user.access_token, '1', function() {
          client.hgetall('users:1', function(err, result) {
            res.redirect('/test?access_token=' + req.user.access_token);
          });
        });
      });
    });

现在您已经看到了一些相关的(只要告诉我,我会发布更多)代码,我如何在不收到 401 的情况下向 JIRA 发送休息调用? :)

编辑:感谢任何帮助!如果您能为我指明正确的方向,您会让我非常高兴!

最佳答案

好的。我想到了!首先,您想将访问 token 和 token secret 保存到 AtlassianOAuthStrategy 中的数据库中。其次,为了向第三方服务发送 REST 调用,您可以使用 http request with OAuth。 :

var request = require('request');

var oauth = {
  signature_method : 'RSA-SHA1',
  consumer_key : RsaPublicKey,
  private_key : rsaPrivateKey,
  token : [get access_token from you db],
  token_secret : [get token_secret from you db]'
};
var url = 'http://localhost:2990/jira/rest/api/2/issue/' + id;
request.get({url:url, oauth:oauth, json:true}, function (e, r, issue) {
  console.log(issue)
});

现在一切正常,我将开始重构并阅读更多文档以使设计更漂亮并弄清楚如何正确使用 Redis :)

关于javascript - 使用 OAuth 将 REST 调用从 Node 服务器发送到第三方应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33549252/

相关文章:

javascript - 为什么无法将键码值记录到控制台窗口?

json - 如何从 npm 脚本通过管道传输到 bash 别名?

LESS 中的 Javascript 显得步履蹒跚 : workaround?

node.js - express 和 socket.io - 声明和启动服务器

node.js - 如何在node.js和express应用程序中实现发布博客的管理员审批系统?

javascript - Nodejs - 左侧的数组

Javascript 向下滚动 vh

javascript - Angular 资源配置错误 - isArray 为 True

node.js - 如何使用官方 elasticsearch nodejs 客户端删除与查询匹配的文档?

javascript - 如何将图像从url加载到nodejs的缓冲区中