📜  Nodemailer Google Passport Oauth 策略 - Javascript (1)

📅  最后修改于: 2023-12-03 15:03:16.166000             🧑  作者: Mango

Nodemailer Google Passport Oauth 策略 - Javascript

简介

Nodemailer 是一个流行的 Node.js 应用程序,用于通过电子邮件发送消息。在某些情况下,您可能希望使用 Nodemailer 来通过 Gmail 发送电子邮件。Google 提供 Oauth 协议,允许您在不暴露用户密码的情况下,通过 Google API 访问帐户。此外,您可能希望使用 Passport.js 身份验证库来使用 Google Oauth 策略。本文将介绍如何使用 Nodemailer、Google Passport Oauth 策略和 Node.js 运行此操作。

步骤
步骤 1:创建新的 Google Cloud Console 应用程序

要使用 Google Oauth,您需要创建新的 Google Cloud Console 应用程序并获取 API 凭据(客户端 ID 和客户端密钥)。在您的 Google Cloud Console 控制台中,按照以下步骤进行操作:

  1. 打开 https://console.cloud.google.com 以访问控制台。
  2. 创建一个新项目。
  3. 启用 Gmail API。
  4. 创建相应的凭据。

在此过程中,您将获得客户端 ID 和客户端密钥,这将在接下来的步骤中使用。请记住,在将代码部署到生产环境之前,您应该保护这些凭据,以确保它们不会被滥用。

步骤 2:设置项目

打开终端并进入项目目录,然后执行以下步骤:

  1. 安装所需包:
npm i nodemailer google-auth-library passport-github passport-google-oauth20
  1. 创建 config.js 文件并在其中存储 API 凭据:
module.exports = {
  google: {
    clientID: CLIENT_ID,
    clientSecret: CLIENT_SECRET,
    callbackURL: CALLBACK_URL
  }
};

替换 CLIENT_IDCLIENT_SECRETCALLBACK_URL 变量,以反映您在步骤 1 中获得的值。您将这些值传递给 Passport 稍后在应用程序中使用。

  1. app.js 文件中,添加以下代码:
const express = require('express');
const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20').Strategy;

const app = express();

app.use(passport.initialize());
app.use(passport.session());

passport.use(new GoogleStrategy({
  clientID: config.google.clientID,
  clientSecret: config.google.clientSecret,
  callbackURL: config.google.callbackURL
}, function (accessToken, refreshToken, profile, cb) {
  User.findOrCreate({ googleId: profile.id }, function (err, user) {
    return cb(err, user);
  });
}));

该代码将确保 Google 策略被加载,并将 Passport 集成到应用程序中。在这里,您需要导入 passportpassport-google-oauth20 库,并定义一个新的 Google 策略。请注意,每个 Google 策略需要在 Google Cloud Console 中设置回调 URL,以便 Passport 将用户重定向到正确的位置。

在此阶段,您还应具有一个用于 user 对象的数据库存储方案(即 MongoDB)。在示例中,使用 Mongoose。

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const UserSchema = new Schema({
    googleId: String
});

const User = mongoose.model('User', UserSchema);
  1. app.js 文件的末尾添加以下路由:
app.get('/auth/google', passport.authenticate('google', { scope: ['profile'] }));

app.get('/auth/google/callback',
  passport.authenticate('google', { failureRedirect: '/login' }),
  function(req, res) {
    // Just redirecting for now.
    res.redirect('/');
  });

该路由确保将用户重定向到 Google 身份验证中心,并且如果成功,将返回到 /auth/google/callback URL。

  1. index.js 文件中,实现使用 Nodemailer 和 Passport 策略启动 Gmail 电子邮件的代码。
const nodemailer = require('nodemailer');
const authService = require('./services/auth');
const passport = require('passport');
const { google } = require('googleapis');
const OAuth2 = google.auth.OAuth2;

const oauth2Client = new OAuth2(
  process.env.GOOGLE_CLIENT_ID, // 客户端 ID
  process.env.GOOGLE_CLIENT_SECRET, // 客户端密钥
  'https://developers.google.com/oauthplayground' // 授权重定向 URL
);

oauth2Client.setCredentials({
  refresh_token: process.env.GOOGLE_REFRESH_TOKEN
});

const tokens = authService.getAccessToken(oauth2Client);

const transporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {
    type: 'OAuth2',
    user: process.env.MAIL_USER,
    accessToken: tokens.access_token,
    clientId: process.env.GOOGLE_CLIENT_ID,
    clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    refreshToken: process.env.GOOGLE_REFRESH_TOKEN,
    pass: process.env.MAIL_PASSWORD,
    expires: tokens.expiry_date
  }
});

const mailOptions = {
  from: process.env.MAIL_USER,
  to: process.env.MAIL_RECEIVER,
  subject: 'Testing Nodemailer with Gmail OAuth',
  text: 'Hi there, this email was sent using Nodemailer and Google OAuth2 authentication!'
};

transporter.sendMail(mailOptions, (error, response) => {
  error ? console.log(error) : console.log(response);
  transporter.close();
});
结论

本文讲解了使用 Nodemailer、Google Passport Oauth 策略和 Node.js 进行电子邮件发送所需的步骤。使用 Nodemailer 和 Google API,可以在不向服务器发送密码的情况下从 Gmail 发送电子邮件。在使用 Google Passport Oauth 策略时,可以轻松地通过 Google Oauth 访问帐户。此外,本文还介绍了如何将 Passport 策略与 MongoDB 集成。