- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我找不到有关此功能的文档,因此无法使其正常工作。什么时候调用该函数,它在做什么以及将什么作为第一个参数?我正在尝试从 Passport 中获取访问 token ,但无论如何都无法访问它。
passport.use(new FacebookStrategy({
clientID: APP_ID,
clientSecret: APP_SECRET,
callbackURL: "http://localhost:3000/",
},
function(accessToken, refreshToken, profile, done) {
User.findOrCreate({// what are these parameters?}, function (err, user) {
// when is this function called and what is it doing?
});
}
));
如何从 Passport 中获取访问 token ?
最佳答案
User.findOrCreate
是一个虚构的函数,表示您必须通过 Facebook ID 查找用户的任何函数,或者如果用户不存在则创建一个函数。我认为您的第一个问题是您的回调 URL 只是进入您的根目录,因此您可能永远无法访问该函数。
您的回调 URL 应类似于 http://localhost:3000/auth/facebook/callback
。
然后处理那个 URL:
app.get('/auth/facebook/callback',
passport.authenticate('facebook', { failureRedirect: '/login' }),
function(req, res) {
res.redirect('/');
});
此时身份验证完成。 accessToken
会返回给您——“每当应用程序调用 API 以代表他们读取、修改或写入特定人的 Facebook 数据时,都需要这样做”。您应该将其保存在为用户存储访问 token 的某个表中。 profile
是另一个关键变量,因为这是关于用户的信息(哪些信息取决于服务)。
您在该函数中执行的操作取决于您。所以,制作你自己的 User.findOrCreate
。这是 Facebook Passport 中的代码,并附有一些注释来解释它。这假设您使用的是 MongoDB 之类的东西并且有一个 User
表。在这种情况下,User
是您声明的可以与 User
表交互的任何变量。
//Use facebook strategy
passport.use(new FacebookStrategy({
clientID: config.facebook.clientID,
clientSecret: config.facebook.clientSecret,
callbackURL: config.facebook.callbackURL
},
function(accessToken, refreshToken, profile, done) {
//check user table for anyone with a facebook ID of profile.id
User.findOne({
'facebook.id': profile.id
}, function(err, user) {
if (err) {
return done(err);
}
//No user was found... so create a new user with values from Facebook (all the profile. stuff)
if (!user) {
user = new User({
name: profile.displayName,
email: profile.emails[0].value,
username: profile.username,
provider: 'facebook',
//now in the future searching on User.findOne({'facebook.id': profile.id } will match because of this next line
facebook: profile._json
});
user.save(function(err) {
if (err) console.log(err);
return done(err, user);
});
} else {
//found user. Return
return done(err, user);
}
});
}
));
就我个人而言,我还使用“成员(member)”表来跟踪每个用户的多个帐户(这样他们就可以使用多个帐户进行身份验证),因为我是通过 mongoose 设置的。这实际上是我存储访问 token 的地方。我更喜欢在用户表中有一个 facebook 列......但这取决于你。
var mongoose = require('mongoose'),
Schema = mongoose.Schema,
ObjectId = Schema.ObjectId;
var membershipSchema = new Schema({
provider: String,
providerUserId: String,
accessToken: String,
userId: {type: ObjectId, ref: 'User'},
dateAdded: {type: Date, default: Date.now}
});
module.exports = mongoose.model('Membership', membershipSchema);
因此,我的 User.findOrCreate
版本是这样开始的:
function(accessToken, refreshToken, profile, done) {
Membership.findOne({
providerUserId: profile.id
}, function(err,membershipData) {
//blah blah blah
其中成员资格是上面的模型,并被定义为变量:
var Membership = require('./models/membership.js')
关于node.js - User.findOrCreate 函数是做什么的,什么时候在 Passport 中调用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20431049/
我尝试在 CSV 导入中使用 findOrCreate 函数来防止使用同一电子邮件地址创建多个用户,但它不起作用。 我将 CSV 文件中的所有行导入到内存中: importableCsvRows.fo
坚持使用 Sequelize findOrCreate 方法。 所以我期待得到 tags 的空数组,但我得到 tag.id, tag.name ... 等。 [ { id: 2, name:
因此,在我的express应用程序中,我有一个单独的文件database.js,其中包含用于插入、删除、更新等的所有模型和函数。我还为每个模型都有一个单独的 Controller 。 数据库.js m
我的应用程序正在将套接字相关信息保存到 socketlist 表中。这个想法是,如果带有 socket_id 的条目不存在,则在 postgres 表中创建一个条目。否则什么也不做。这是代码: awa
我在带有 Nodejs + SSD 磁盘 8GB 内存的 Ubuntu 上使用 PostgreSQL 9.6。我从未尝试调整任何数据库的性能,所以我有出厂配置。 我使用 sequelize.js 的
我将 sailsjs 与 mysql 结合使用,并在下订单时使用它保存来自 shopify webhook 的数据。它返回一个 json 对象,其中一个属性是一个客户对象,我将其保存在与主订单表相关的
我发现了一个关于环回的有趣问题。当我使用 findOrCreate 添加记录时,我感到很困惑。让我们看一下示例: for (var x = 0; x < 10; x++) { consol
代码如下: Accounts.findOrCreate({ where: { userName: request.payload.userName }, att
我正在使用 Sequelize 作为 ORM。这是我的用户模型: ### User model ### User = exports.User = globals.sequelize.def
使用 sequelize,我有两个具有关联的模型: var Assessment = sequelize.define("Assessment", { name: DataTypes.STRING
我正在尝试使用 sequelize 和 mysql 在 2 个相关表上插入多行。 基于 sequelize transaction cannot insert because of foreign k
我正在尝试使用 Passport 在 Node.js 中实现社交身份验证,因此我需要在配置 Facebook 身份验证策略时使用 findOrCreate()。 这是我的 facebook.js 配置
为简单起见,我将其简化。我需要根据字符串值(不能是主键/ID)来查找或创建行。它必须在一个循环中完成,所以它必须是异步的。其中一个值也可能已经存在于我们的表中。 假设我有一个这样的数组: const
我正在使用sequelize 6。当我运行findOrCreate().spread时它说“findOrCreate(...).spread 不是一个函数”。这是我的代码: const respons
我想创建一个锦标赛(如果不存在)和一个与锦标赛关联的匹配(如果不存在)。 let [match, created] = await Match.findOrCreate( { where: {sc
我正在将我的 Rails 应用程序的 JSON API 迁移到 Node.js。我正在使用 Sequelize作为 ORM 访问我的 postgres 数据库中的数据。 但是,当我尝试使用 findO
我正在将 Sequelize 与 NodeJS 和 MySql 一起使用。 (最新版本) 我有一个用户模型 - 'id' 以及唯一键和主键。 “id”设置为自动递增。 一些用户详细信息,例如名字、姓氏
我正在尝试在 sequelize 中使用 findorcreate 方法,它在我的 mysql 数据库中正确地插入了一行,但是我在默认部分中输入的值没有被插入。 这是我的代码 return userD
FindOrCreate 假定根据您提供的参数查找或创建。 所以我想知道为什么当找到data(用户)时它会回退到catch promise ,而它应该只返回data 是在 .spread 函数中找到的
我想创建一个某种类型的对象池,比方说Person,实现如下: class Person(val name: String, val email: String) { val data = expe
我是一名优秀的程序员,十分优秀!