http://www.passportjs.org/docs/downloads/html/ 原文地址
登录
Passport 暴露一个 login() 函数在 req(也有 logIn() 这个别名)上,它能够在建立登录 session 时使用。
req.login(user, function(err) {if (err) {return next(err)}return res.redirect('/users/' + req.user.username);})
当登录操作完成时,user 将被设置到 req.user 上。
注意:passport.authenticate() 中间件会自动调用 req.login() 方法。这个函数主要是用户注册时使用,在此期间可以调用 req.login() 来自动登录新注册的用户。
登出
Passport 暴露一个 logout() 函数在 req(也有 logOut() 这个别名)上,它能够被任何需要结束登录 session 的路由处理器调用。调用 logout() 方法将会移除 req.user 属性同时清理登录 session (如果存在)。
app.get('/logout', function (req, res) {req.logout();res.redirect('/');})
授权
一个应用可能需要包含来自多个第三方平台的信息。这种情况下,应用需要请求用户去“链接”,例如,同时链接 Facebook 和 Twitter 账户。
当发生这种情况时,用户已经被应用认证了,随后的第三方应用仅需要被授权并与用户关联。因为认证和授权的情况下相似,Passport 提供了一种方式来同时容纳他们。
授权通过调用 passport.authorize() 方法执行。如果已授权,策略验证回调提供的结果将会设置到 req.account 属性上。已经存在的登录 session 和 req.user 不受影响。
app.get('/connect/twitter',// 注意,这里是授权,不是认证passport.authorize('twitter-authz', { failureRedirect: '/account' }))app.get('/connect/twitter/callback',passport.authorize('twitter-authz', { failureRedirect: '/account' }),function (req, res) {var user = req.user;var account = req.account;// 将登录账户与 Twitter 账户相关联account.userId = user.id;account.save(function(err) {if (err) {return self.error(err)}self.redirect('/')})})
在回调路由中,你可以同时看见 req.user 和 req.account。新链接的账户已经和登录用户相关联并且被存储到数据库中。
配置
认证使用的策略和授权使用的策略是一样的。然而,应用可能需要同时提供认证和授权第三方服务。这种情况,可以使用命名策略,通过覆盖在调用 use() 方法时使用的默认策略名字。
passport.use('twitter-authz', new TwitterStrategy({consumerKey: TWITTER_CONSUMER_KEY,consumerSecret: TWITTER_CONSUMER_SECRET,callbackURL: 'http://www.example.com/connect/twitter/callback'},function (token, tokenSecret, profile, done) {}Account.findOne({ domain: 'twitter.com', uid: profile.id }, function(err, account) {if (err) {return done(err)}if(account) {return done(null, account)}var account = new Account();account.domain = 'twitter.com';account.uid = profile.id;var t = {kind: 'oauth',token: token,attributes: { tokenSecret: tokenSecret }};account.tokens.push(t);return done(null, account);})))
上面这个例子,你可以看见 twitter-authz 策略找到或者创建一个 Account 实例来存储 Twitter 账号信息。结果将设置到 req.account 属性,允许路由处理器将账户与经过认证的用户关联。
验证回调中的关联
上述描述的缺点是,它需要相同策略和支持路由的两个实例。
为了避免这个,设置策略的 passReqToCallback 选项为 true。开启这个选项,req 将作为验证回调的第一个参数传入。
passport.use(new TwitterStrategy({consumerKey: TWITTER_CONSUMER_KEY,consumerSecret: TWITTER_CONSUMER_SECRET,callbackURL: 'http://www.example.com/auth/twitter/callback',passReqToCallback: true,},function (req, token, tokenSecret, profile, done) {if (!req.user) {// 不需要登录,通过 Twitter 账户认证。} else {// 登录。将用户和 Twitter 账户关联。// 关联后,通过提供已存在的 user 来保留登录状态。// return done(null, req.user)}}))
将 req 作为参数传入,验证回调能够使用请求状态来定制认证过程,使用一个单独的策略实例和路由集合来处理认证和授权。例如,如果用户已经登录,一个新的“链接”账户能够被关联。任何添加的设置到 req 上的特定应用的属性,包括 req.session,也能够被使用。
感谢阅读
感谢你阅读到这里,翻译的不好的地方,还请指点。希望我的内容能让你受用,再次感谢。by llccing 千里
