Есть несколько способов сделать это.На стороне сервера у вас будет такая функция, как Accounts.onCreateUser((options, user) => {... })
.Если вы уже публикуете минимальные данные пользователя, вы можете добавить ключ с помощью onCreateUser
и сохранить что-то вроде: loginVia: "email"
или "FB"
и т. Д. Затем вы публикуете этот ключ или получаете его значение с помощью метода.
Прямое решение состоит в том, чтобы проверить, существует ли социальная служба, если искать конкретную услугу.Например:
const isFBUser: Meteor.users.find({ _id :.... }, { 'services.facebook': { $exists: true } }).count() // results in 1 record or 0 records = true / false
, если вы хотите узнать, приходит ли пользователь по электронной почте, а не от третьей стороны, вы можете проверить электронную почту
const isThirdParty = Meteor.users.find({_id: ...}, emails: { $exists: true })
Довольно часто также использоватьсистема слияния учетных записей, так что кто-то, пришедший из FB с электронной почтой gigi@gmail.com, получит письмо, чтобы войти в ваше приложение с электронной почтой вместо социальной учетной записи.В этом случае вам необходимо в конечном итоге сохранить источник последнего входа в систему.
Я оставлю здесь часть моего onCreateUser в качестве примера того, как извлечь данные из стороннего пользователя и сохранить его.в профиле использования.В этих же строках вы можете сохранить сторонний источник (как предложено выше)
if (user.services) {
const fb = user.services.facebook
const google = user.services.google
let avatar = null
let fbi = null // I use this to keep a record of the FB user Id
let ggli = null // // I use this to keep a record of the Google user Id
if (fb) {
/**
* I upload to S3 and I don't wait for a response. A little risky...
*/
put_from_url(`https://graph.facebook.com/${fb.id}/picture?width=500&height=500`, `avatar/${fb.id}.jpg`, (err, res) => {
if (err) {
console.log('Could not upload FB photo to S3, ', err)
} else {
// console.log(res)
}
})
user.profile = extend(user.profile, {
firstName: fb.first_name,
lastName: fb.last_name,
email: fb.email,
displayName: fb.name,
gender: startCase(toLower(fb.gender)),
avatar: `${fb.id}.jpg`
})
avatar = `${fb.id}.jpg`
fbi = fb.id
roles = ['user', 'social']
}
if (google) {
/**
* I upload to S3 and I don't wait for a response. A little risky...
*/
put_from_url(google.picture + '?sz=500', `avatar/${google.id}.jpg`, err => {
if (err) {
console.log('Could not upload Google photo to S3, ', err)
}
})
user.profile = extend(user.profile, {
firstName: google.given_name,
lastName: google.family_name,
email: google.email,
displayName: google.name,
gender: startCase(toLower(google.gender)),
avatar: `${google.id}.jpg`
})
avatar = `${google.id}.jpg`
ggli = google.id
roles = ['user', 'social']
}
/**
* Create a slug for each user. Requires a display name for all users.
*/
let slug
slug = Meteor.call('/app/create/slug', user.profile.displayName, 'user')
Также проверьте структуру объекта пользователя:
И проверьте это.Пользователи через сторонних производителей не имеют поля электронной почты, поэтому вы можете проверить его существование.