Как проверить, залогинен ли ты через сторонний сервис в Meteor Framework? - PullRequest
1 голос
/ 02 мая 2019

Как вы проверяете, вошел ли пользователь через третьих лиц (Google, Facebook, ...) в инфраструктуру Meteor? Кроме того, это возможно от клиента?

1 Ответ

2 голосов
/ 02 мая 2019

Есть несколько способов сделать это.На стороне сервера у вас будет такая функция, как 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')

Также проверьте структуру объекта пользователя:

enter image description here

И проверьте это.Пользователи через сторонних производителей не имеют поля электронной почты, поэтому вы можете проверить его существование.

enter image description here

...