如何从 passport-facebook 读取用户信息
How to read user info from passport-facebook
我已经通过以下方式实现了启用 facebook 身份验证的代码:
const authentication = require('feathers-authentication');
const jwt = require('feathers-authentication-jwt');
const local = require('feathers-authentication-local');
const oauth2 = require('feathers-authentication-oauth2');
const GoogleStrategy = require('passport-google-oauth20');
const FacebookStrategy = require('passport-facebook');
module.exports = function () {
const app = this;
const config = app.get('authentication');
// Set up authentication with the secret
app.configure(authentication(config));
app.configure(jwt());
app.configure(local());
app.configure(oauth2(Object.assign({
name: 'google',
Strategy: GoogleStrategy
}, config.google)));
app.configure(oauth2(Object.assign({
name: 'facebook',
Strategy: FacebookStrategy
}, config.facebook)));
// The `authentication` service is used to create a JWT.
// The before `create` hook registers strategies that can be used
// to create a new valid JWT (e.g. local or oauth2)
app.service('authentication').hooks({
before: {
create: [
authentication.hooks.authenticate(config.strategies),
// modifying params.payload.
hook => {
// make sure params.payload exists
hook.params.payload = hook.params.payload || {}
// merge in a `test` property
if(hook.params.user){
Object.assign(hook.params.payload, {email: hook.params.user.email, name: hook.params.user.name});
}
}
],
remove: [
authentication.hooks.authenticate('jwt')
]
}
});
};
如果我调试 node_modules/passport-facebook/lib/strategy.js
中的代码执行,我可以看到所有用户配置文件字段都已检索(姓名、电子邮件、性别...),但我还不知道如何传递这些值挂钩以便将其存储到数据库中。
有谁知道如何将这些值传递给身份验证 service/hooks 以便存储它们?
查看 how to customize the oAuth response 部分。您应该在创建或更新用户时获取个人资料信息,并能够将其映射到 users
服务的 before
挂钩中:
function customizeGithubProfile() {
return function(hook) {
console.log('Customizing Github Profile');
// If there is a github field they signed up or
// signed in with github so let's pull the primary account email.
if (hook.data.github) {
hook.data.email = hook.data.github.profile.emails.find(email => email.primary).value;
}
// If you want to do something whenever any OAuth
// provider authentication occurs you can do this.
if (hook.params.oauth) {
// do something for all OAuth providers
}
if (hook.params.oauth.provider === 'github') {
// do something specific to the github provider
}
return Promise.resolve(hook);
};
}
app.service('users').hooks({
before: {
create: [customizeGithubProfile()],
update: [customizeGithubProfile()]
}
});
我已经通过以下方式实现了启用 facebook 身份验证的代码:
const authentication = require('feathers-authentication');
const jwt = require('feathers-authentication-jwt');
const local = require('feathers-authentication-local');
const oauth2 = require('feathers-authentication-oauth2');
const GoogleStrategy = require('passport-google-oauth20');
const FacebookStrategy = require('passport-facebook');
module.exports = function () {
const app = this;
const config = app.get('authentication');
// Set up authentication with the secret
app.configure(authentication(config));
app.configure(jwt());
app.configure(local());
app.configure(oauth2(Object.assign({
name: 'google',
Strategy: GoogleStrategy
}, config.google)));
app.configure(oauth2(Object.assign({
name: 'facebook',
Strategy: FacebookStrategy
}, config.facebook)));
// The `authentication` service is used to create a JWT.
// The before `create` hook registers strategies that can be used
// to create a new valid JWT (e.g. local or oauth2)
app.service('authentication').hooks({
before: {
create: [
authentication.hooks.authenticate(config.strategies),
// modifying params.payload.
hook => {
// make sure params.payload exists
hook.params.payload = hook.params.payload || {}
// merge in a `test` property
if(hook.params.user){
Object.assign(hook.params.payload, {email: hook.params.user.email, name: hook.params.user.name});
}
}
],
remove: [
authentication.hooks.authenticate('jwt')
]
}
});
};
如果我调试 node_modules/passport-facebook/lib/strategy.js
中的代码执行,我可以看到所有用户配置文件字段都已检索(姓名、电子邮件、性别...),但我还不知道如何传递这些值挂钩以便将其存储到数据库中。
有谁知道如何将这些值传递给身份验证 service/hooks 以便存储它们?
查看 how to customize the oAuth response 部分。您应该在创建或更新用户时获取个人资料信息,并能够将其映射到 users
服务的 before
挂钩中:
function customizeGithubProfile() {
return function(hook) {
console.log('Customizing Github Profile');
// If there is a github field they signed up or
// signed in with github so let's pull the primary account email.
if (hook.data.github) {
hook.data.email = hook.data.github.profile.emails.find(email => email.primary).value;
}
// If you want to do something whenever any OAuth
// provider authentication occurs you can do this.
if (hook.params.oauth) {
// do something for all OAuth providers
}
if (hook.params.oauth.provider === 'github') {
// do something specific to the github provider
}
return Promise.resolve(hook);
};
}
app.service('users').hooks({
before: {
create: [customizeGithubProfile()],
update: [customizeGithubProfile()]
}
});