我使用passport-twitter设置OAuth,登录和身份验证工作正常。尝试执行更新状态等授权请求时会出现问题。
passport.use(new TwitterStrategy({
consumerKey: config.twitter.clientID
, consumerSecret: config.twitter.clientSecret
, callbackURL: config.twitter.callback_url || 'http://' + config.domain + '/auth/twitter/callback'
},
function(token, tokenSecret, profile, done) {
Player.findOne({ 'twitter.id': profile.id }, function (err, player) {
if (err) { return done(err) }
if (!player) {
var player = new Player({
name: profile.displayName
, twitter: profile._json
, twitter_token: token
, twitter_tokenSecret: tokenSecret
})
player.save(function (err, player) {
if (err) log.error(err);
return done(err, player);
})
}
else {
return done(err, player)
}
})
}
))
所以这会通过mongoose保存播放器并起作用。我保存了护照给出的令牌和tokenSecret,并假设它们是使用oAuth().getOAuthRequestToken()
生成的,作为Twitter原始回调的一部分,因此应该对给定登录会话的其余部分有效。 (也许是一个糟糕的假设?)
稍后,当我们想要为用户发送推文时,已经获取了播放器记录及其相关的令牌+秘密:
function twitter_oauth() {
return new OAuth (
"https://api.twitter.com/oauth/request_token",
"https://api.twitter.com/oauth/access_token",
keys.consumerKey,
keys.consumerSecret,
"1.0",
null,
"HMAC-SHA1"
)
}
....
twitter_oauth().post(api_endpoint, token, secret, body, "application/json",
function (error, data, res) {
if (error) {
console.error(error)
} else {
console.log('tweet sent')
}
}
)
对此的响应只是状态401和“无法通过OAuth进行身份验证。”
那么,我错过了一些重要的东西吗?我还没有深入了解护照来源,找出实际上有token
和tokenSecret
个参数,但是在这里要求有人指出上面的主要缺陷。
答案 0 :(得分:1)
尝试查看dev.twitter.com上的应用程序设置是否设置为read&写。
同时检查标题中的时间戳,如果它与Twitter的服务器时钟关闭5分钟,则请求将失败。
您还可以尝试使用其他库,我已经使用了node-oauth,或者您可以尝试使用基于node-oauth的ntwitter。
答案 1 :(得分:1)
感谢@Brmm的好建议,但在这种情况下,事实证明我们在密钥中使用不同的Twitter帐户进行身份验证和api调用,因为,#bonehead
答案 2 :(得分:1)
你可以写这个。
var tw = TwitterStrategy({
consumerKey: config.twitter.clientID
, consumerSecret: config.twitter.clientSecret
, callbackURL: config.twitter.callback_url || 'http://' + config.domain + '/auth/twitter/callback'
},
function(token, tokenSecret, profile, done) {
Player.findOne({ 'twitter.id': profile.id }, function (err, player) {
if (err) { return done(err) }
if (!player) {
var player = new Player({
name: profile.displayName
, twitter: profile._json
, twitter_token: token
, twitter_tokenSecret: tokenSecret
})
player.save(function (err, player) {
if (err) log.error(err);
return done(err, player);
})
}
else {
return done(err, player)
}
})
});
passport.use(tw);
并且您不需要新的Oauth实例。 你可以像这样使用它。
tw._oauth.post(api_endpoint, token, secret, body, "application/json",
function (error, data, res) {
if (error) {
console.error(error)
} else {
console.log('tweet sent')
}
}
);
侨!