- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已按照建议成功将帐户
链接到用户
here 。如果登录用户使用 OAuth 2.0 授权第三方(例如 Google Contacts API),我可以将该信息保存在帐户中,然后将该帐户与登录用户关联。
我想更进一步,以尽可能提供无缝的登录体验。一旦用户将其身份绑定(bind)到第三方帐户,我希望他们不仅能够使用本地策略(用户名/密码)登录,然后提取相关的第三方信息,而且还能够以另一种方式:注销时,连接到 Google 会将他们作为我的应用程序的用户登录,使 req.user = 他们的 User
信息,就像他们使用本地策略登录时一样。这是相关的代码块(显示的还有更多内容,但重点就在那里。
passport.use(new GoogleStrategy({
clientID: google_params.client_id,
clientSecret: google_params.client_secret,
callbackURL: google_params.callbackURL,
passReqToCallback: true
},
function(req, token, refreshToken, profile, done) {
...
// If no user in session, set the req.user to the associated user
User.findOne({
'username': account.userId
}, function(err, user) {
console.log('Account exists already in DB, and is already tied to a user. Logging into users account.');
req.user = user;
return done(null, account);
});
etc...
在检查序列化/反序列化函数时,此代码永远不会将用户或帐户信息序列化到 session 中,因此虽然该信息确实在验证回调结束时传递,但它会在页面刷新时消失(同样,因为没有任何内容保存到 session 中)。我该怎么办?我的想法正确吗?
最佳答案
答案有点晚了,但我一直在研究我正在构建的应用程序,它可能对其他人有帮助。
所以答案是,是的,您可以让用户链接他们的帐户,而不要求他们创建本地帐户(如 Scotch.io 教程中建议的那样)。诀窍是管理帐户的重复数据删除。
无论他们通过哪个提供商登录,我们都会按顺序处理以下检查:
应对您支持的所有提供商执行此操作。通过使用由第三方服务预先验证的通用字段(例如电子邮件地址),我们可以消除重复帐户。另一个功能可能是允许用户手动将它们链接在一起,以应对他们想要链接具有不同电子邮件地址的帐户的情况(这种情况在 github 上经常发生,他们使用自己的个人帐户,然后想要将其连接到工作帐户,以 CI 提供商为例)
希望这有帮助。如果您找到替代解决方案,最好将其添加到此处或者遇到任何问题。我认为这是一个很常见的案例,可以将其变成一个 wiki。
** 更新 **
来自 @jaredhanson 的评论
在经历了很多可能的流程和大量的谷歌搜索之后,I found this gist with a great comment from @jaredhanson (the author of passport.js) describing this exact scenario. 👍
我复制了下面的评论(以防将来要点消失)
If you want to "link" accounts from multiple providers together, at that point you'll want a database with user records specific to your app, which in turn are associated with third-party account records. Then, in the verify callback, you'll want to perform whatever queries are necessary and supply your app-specific user record to done. That will keep things consistent, so that if someone had linked both Facebook and Twitter, they can return to the app and sign in with either one.
Further discussion about that topic is here: http://passportjs.org/guide/authorize.html
If you go that route (as I do in my apps), I use middleware like this to combine authentication and authorization into a single route:
function authnOrAuthzFacebook(req, res, next) {
if (!req.isAuthenticated()) {
passport.authenticate('facebook', { successRedirect: '/settings/accounts',
failureRedirect: '/login' })(req, res, next);
} else {
passport.authorize('facebook-authz')(req, res, next);
}
}
app.get('/facebook-login', authnOrAuthzFacebook);
此评论的应用示例can be seen here on GitHub (最终版本)。
stackoverflow 问题
接下来还有另一个 stackoverflow 问题,如果您需要强制用户登录不同的提供商,它也会有所帮助(想想 zapier 如何需要访问多个帐户以进行集成,但不需要访问多个帐户进行身份验证)。 Using passport.js with multiple strategies without overwriting user request object
因此,有一些替代版本可以完成相同的工作(取决于您想要如何处理它)。
关于node.js - 将多个第三方和本地帐户与 Passport 链接在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19970294/
已经为此工作了几个小时,非常令人沮丧...... router.post('/', passport.authenticate('local-signup', function(err, user,
我正在寻找一种方法让我的客户端使用 facebook JS SDK 进行授权,然后以某种方式将此授权传输到我的 Node 服务器(以便它可以使用 fb graph api 验证请求) 我偶然发现: h
passport.socketio 抛出此错误,同时无法授权用户。 Error: Error: Failed to deserialize user out of session 我已将问题范围缩小到
passport.js 函数passport.serializeUser 和passport.serializeUser 有什么作用?这是维基百科中描述的序列化示例:http://en.wikiped
现代 Passport 和身份证的底部带有machine-readable zone (MRZ),其中包含基本标识信息(可能是OCR友好格式)。 机读区的格式指定了check digits的数量,可帮
我尝试对我的应用程序实现 passport 身份验证策略,但在尝试登录后不断收到以下错误: TypeError: passport.authenticate is not a function at
我正在将 passport 与 loopback 集成,并且工作正常,问题是如何获取访问 token 。 我有一个 web 应用程序(服务于与环回不同的服务器)所以: 发出请求(在环回后端) 这会将我
我使用带有passport-saml 策略 的 Passport 。在策略 上,有一个我想使用的函数。我知道策略是这样使用的: const SamlStrategy = require('passpo
这是我的套接字配置: // set authorization for socket.io io.set('authorization', passportSocketIo.authorize
我是 Passport.js 的新手。我一直在关注以下博客来注册用户 https://scotch.io/tutorials/easy-node-authentication-setup-and-lo
Passport 似乎是简单例份验证、不显眼且不难设置的绝佳选择。我正在构建一个使用 JWT 进行身份验证的 MEAN 堆栈,因此我查看了 Passport JWT。然而,有几件事我很困惑。 1) 假
我已经开始开发一个小项目,在客户端使用 React 和 Redux,后端是用 Node、Express 和 Passport.js 完成的我将尽力描述我几个小时以来所苦苦挣扎的事情。身份验证后,当用户
我正在使用 Passport 本地策略和 Passport Mongoose 本地来创建用户并检查用户身份验证。但是,我想探索使用电子邮件而不是用户名的选项。我按照文件的规定进行操作,但我未经授权。有
我正在使用 Passport 本地策略进行身份验证。在我的快速服务器中,我收到一个注册帖子请求,我应该为新用户将密码保存到数据库。但是我需要在保存到数据库之前对密码进行哈希处理。 但我不确定如何对其进
我正在将 node 与 express + mongoose 一起使用,并尝试将 passport.js 与 restful api 一起使用。 身份验证成功后,我不断收到此异常(我在浏览器上看到回调
我正在尝试在 JWTStrategy 中检查列入黑名单的 JWT token 。 jwtFromRequest 没有采用异步函数,所以我无法在那里检查它。 validate 函数提供对 JWT 负载而
目前,我正在通过 Google 构建登录功能,但我遇到了一些让我感到困惑的问题。 我们可以在一个项目中同时使用 Restful API 和 Graphql API 吗?除了谷歌身份验证,我们需要一些路
我正在使用与 express 配合良好的 Passport 本地策略: passport.use(localStrategy); passport.serializeUser((user, done)
我正在尝试通过passport-facebook 对用户进行身份验证,并且发生了一件非常奇怪的事情,我真的不确定。定义我的路线时,我有这行代码 app.get('/login/facebook',
当我使用 NPM 包“passport-azure-ad”尝试连接到 Azure AD 时,出现以下错误。我已成功连接到 Facebook、Google 和 MSFT Live,成功,但无法弄清楚为什
我是一名优秀的程序员,十分优秀!