2

我需要在我的 node.js 应用程序上构建一个基于令牌的身份验证,用户可以使用他的 facebook 或 twitter 凭据登录我的应用程序,并使用访问令牌来获取资源。这篇文章建议一旦通过 facebook 或 twitter 或其他方式进行身份验证,就在每个请求上使用访问令牌,并且根本不需要 Session 例如

获取 /api/v1/somefunction?token='abcedf'

  1. 客户端从响应中获取访问令牌。
  2. 客户端使用 token 参数调用一些服务器 api。

所以下面的代码,是通过twitter授权用户,如果我的应用没有找到我的用户信息,则将用户信息存储到数据库中。

passport.use(new TwitterStrategy({
      consumerKey: config.twitter.clientID,
      consumerSecret: config.twitter.clientSecret,
      callbackURL: config.twitter.callbackURL
    },
    function(token, tokenSecret, profile, done) {
        console.log('TwitterStrategy   /auth/twitter.............',profile.id, profile.displayName, profile.username, profile.emails[0], profile._json.avatar_url);   
        userModel.findUserByQuery({ 'social.twitter.id': profile.id }, function (err, user) {
          if (!user) {
            console.log('twitter user not found'.red);
            userModel.createNewUser( {  username:profile.username,  
                                        email:profile.emails[0].value, 
                                        img:profile._json.avatar_url, 
                                        fullname:profile.displayName,
                                        password:profile._json.avatar_url,
                                        social:{twitter:{id:profile.id,avatar:profile._json.avatar_url, name:profile.username,token:accessToken} }}, 
            function(err,data){
                if(err) return done(err);
                else if(!data)  return done(null, false, { message: 'can not create your profile in database' });           
                else {
                   console.log('save the new twitter user into database'.green, data._id);
                   return done(err, user);
                }               
            })          
        } else {
          console.log('twitter user  found'.green);
          return done(err, user);
        }
      })                
    }
))

不过,我有两个问题,

1.如何将访问令牌发送给客户端以进行以下请求

在代码中,在通过 twitter 进行身份验证后,我获取访问令牌并将此令牌发送到浏览器上的客户端,因为令牌嵌入在 url 参数中,所以我尝试了代码 res.redirect ('/users/profile ? token = blabla '),但在客户端浏览器中,url 仍显示为 '/users/profile' 而不是 '/users/profile ? 令牌=blabla'

2.一旦从 twitter 进行身份验证,带有令牌的以下请求正在本地通过我的应用程序(我将令牌存储在数据库中,并比较以下令牌进行验证)还是仍然到 twitter API 进行身份验证?

如果在第一种情况下,那么我应该将令牌存储到数据库中,以便在对我的应用程序的以下请求中比较令牌中的以下请求?那正确吗

4

1 回答 1

2

我也在努力得到这个,只是找到了这个相当相关的答案:Call Bitbucket REST API using 2leg oauth token

我就是不知道如何用护照做到这一点?特别是,如何从护照认证会话中获取 ouath 实例,执行 oauth.get(...),如下所述:https ://github.com/ciaranj/node-oauth

更新:Jared(passportjs 的作者)在下面的 google 群组线程中解释了这是错误的方法,并建议使用https://github.com/mikeal/request

这对我来说是这样的:

var oauth = {
  consumer_key: process.env.BB_CONSUMER_KEY,
  consumer_secret: process.env.BB_CONSUMER_SECRET
};

passport.use(new BitbucketStrategy({
  ...
  function(token, tokenSecret, profile, done) {
    oauth = extend(oauth, {
      token: token,
      token_secret: tokenSecret
  });
}

请注意,上述令牌可能需要在集群环境中为每个用户保留。

稍后,要访问 api,请执行以下操作:

request.get({url: 'protected end point', oauth: oauth})

希望它会帮助别人!

于 2013-11-29T23:10:19.380 回答