
我正在实现一个处理聊天消息的服务器。在某些情况下,我希望从JIRA实例访问数据。对于请求,我使用护照-a oauth策略对JIRA和BearerStrategy进行身份验证,但我的问题是,只有在用户对JIRA进行"My“读写访问之后,身份验证才能在浏览器中有效。在许多指南中,它们只是在成功的身份验证之后调用res.redirect('/successfulLogin')或类似的东西,但我想对JIRA执行rest调用,处理数据并将其发送到连接的客户端应用程序。
我该怎么做?
我对这一切都很陌生,一切都在我的脑海里旋转。我保存并访问用于身份验证的令牌,例如,当我在浏览器中导航到./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发送rest电话呢?)
编辑:任何帮助感谢!如果你能把我引向正确的方向,你会让我很开心的!
发布于 2015-11-06 15:03:30
好的。我想出来了!首先,您希望在AtlassianOAuthStrategy中保存对db的令牌和令牌秘密的访问。其次,为了向第三方服务发送REST调用,只需使用带有OAuth的http请求
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 :)
https://stackoverflow.com/questions/33549252
复制相似问题