Отправка писем с использованием loopback 3.x с моделью пользователя по умолчанию - PullRequest
0 голосов
/ 19 марта 2019

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

Я пытался следовать официальной документации для коннектора электронной почты, и это мое datasources.json

"emailDs": {
    "name": "emailDs",
    "connector": "mail",
    "transports": [
      {
        "type": "smtp",
        "host": "smtp.gmail.com",
        "secure": true,
        "port": 465,
        "auth": {
          "user": "myemail@gmail.com",
          "pass": "password"
        }
      }
    ]
  }

для model-config.json У меня есть

...
"Role": {
    "dataSource": "db",
    "public": false
  },
  "Email": {
    "dataSource": "emailDs"
  },
  "user": {
    "dataSource": "db",
    "public": true,
    "options": {}
  }

Как вы можете видеть в этом файле, я также создал новую модель с именем user (без заглавной буквы U, что расширяет модель User по умолчанию. Я просто скопировал код этого пользователя из thisпример (прокрутите вниз для сброса пароля пользователя).

Я зарегистрировал новую модель user, чтобы видеть ее в domain.com:3000/explorer/ .. Итак, у меня есть модели user и User.

Я также создал файл в /boot/routes.js и вставил весь код из приведенного выше примера.

Теперь, так как у меня настроен источник данных электронной почты в datasources.json, он должен работать или нет?Потому что я попытался опубликовать сброс пароля с помощью /Users/reset, для которого в этой форме требуется только электронная почта (вероятно)

{ "email":"myuseraccount@email.com" }

, которая является электронной почтой пользователя, который уже зарегистрирован. ПростоКстати, я работаю над приложением для Android, регистрация и вход в систему работают нормально. Поэтому я нажал кнопку Try it outo выполнить запрос сброса пароля, я получаю 204 Request was successful, но я не получаю электронной почты.Даже консоль узла не отображает никаких ошибок, только когда я ввожу электронную почту, которой нет в базе данных зарегистрированных пользователей, ..

Для моей конфигурации электронной почты Gmail (электронная почта, которая должна отправлять сообщения о сбрасывании пароля пользователям),Я включил доступ к менее защищенным приложениям в учетной записи Gmail, я также попытался включить двухэтапную проверку и создал учетную запись для приложения, где gmail предоставил мне уникальный пароль только для этого приложения.Я использовал этот пароль и ввел его в datasources.json, и этот пароль никогда не использовался для входа в систему, так что это означает, что loopback никогда не выполняет функцию send для отправки этого сообщения о сбрасывании пароля, что полностью разочаровывает!

Есть идеи, как правильно настроить его для этого пользователя по умолчанию?Кстати, я пытался отправить запрос на пропуск от обеих моделей, User и user, и ни одна из них не работала ....

// Обновление

Я проследил, что когда я отправляю запрос по электронной почте (например, с помощью почтальона), выполняется функция User.resetPassword = function(options, cb) { .. } по умолчанию User модель user.js.Но что должно последовать дальше?Звоню send email куда-нибудь, но как и где?Я пытался понять документацию, но ее очень сложно понять.

// Обновление 2 Несмотря на то, что официальная документация говорит, что не нужно редактировать модель User по умолчанию, я редактировал ее.

Я добавил функцию отправки, и теперь она, наконец, отправляет электронную почту:

//send password reset link when requested
User.on('resetPasswordRequest', function(info) {
    var url = 'http://mywebsite.com:3000/api/Users/reset-password';
    var html = 'Click <a href="' + url + '?access_token=' +
        info.accessToken.id + '">here</a> to reset your password';

    User.app.models.Email.send({
        to: info.email,
        from: null,
        subject: 'Password reset',
        html: html
    }, function(err) {
        if (err) return console.log('> error sending password reset email');
        console.log('> sending password reset email to:', info.email);
    });
});

Проблема в том, что пароль сброса не работает, потому что, когда я получаю письмо, я нажимаю на URL, и все, что яget равен 401 Unauthorized access и через некоторое время он говорит Invalid token, я полагаю, у него есть некоторое время истечения.

...