Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 错误:使用nodeEmailer和Firebase云函数授予OAuth2无效_Node.js_Firebase_Google Oauth_Nodemailer - Fatal编程技术网

Node.js 错误:使用nodeEmailer和Firebase云函数授予OAuth2无效

Node.js 错误:使用nodeEmailer和Firebase云函数授予OAuth2无效,node.js,firebase,google-oauth,nodemailer,Node.js,Firebase,Google Oauth,Nodemailer,我有下一个问题。我使用NodeJs、Typescript、OAuth2、Gmail在firebase云函数中实现。我遵循了一个类似的教程 我将在下面附上代码。问题是刷新令牌在某种程度上被撤销或过期,它会持续8天左右。我的workarround正在生成一个新的刷新令牌,就像教程中解释的那样,它修复了8天内对新访问令牌的请求。我做了很多尝试,但没有成功 云函数日志中提供的错误与此类似,还有许多其他无法理解的事情 { error: 'invalid_grant', error_descr

我有下一个问题。我使用NodeJs、Typescript、OAuth2、Gmail在firebase云函数中实现。我遵循了一个类似的教程

我将在下面附上代码。问题是刷新令牌在某种程度上被撤销或过期,它会持续8天左右。我的workarround正在生成一个新的刷新令牌,就像教程中解释的那样,它修复了8天内对新访问令牌的请求。我做了很多尝试,但没有成功

云函数日志中提供的错误与此类似,还有许多其他无法理解的事情

{
   error: 'invalid_grant',
   error_description: 'Token has been expired or revoked.' 
}
有人能帮我吗

import * as functions from "firebase-functions";
import * as admin from "firebase-admin";
import * as nodemailer from "nodemailer";
import * as goole from "googleapis";
admin.initializeApp();

// // Start writing Firebase Functions
// // https://firebase.google.com/docs/functions/typescript

export const mailPedidos = functions.firestore
  .document("example/{exampleId}")
  .onCreate(async (snapshot, context) => {

    //business logic removed
    let name = "Carl";        
    let mail = "example@gmail.com";
    const mailOptions = {
      from: "Kuxon <fromExample@gmail.com>",
      to: mail,
      subject: "Example Subject",
      html: `<p style="font-size: 16px;">Name: ${name} </p>
            `, // email content in HTML
    };

    try {
      const CLIENT_ID =
        "CLIENTID";
      const CLIENT_SECRET = "CLIENTSECRET";
      const REDIRECT_URI = "https://developers.google.com/oauthplayground";
      const REFRESH_TOKEN =
        "REFRESHTOKEN";

      const oAuth2Client = new goole.google.auth.OAuth2(
        CLIENT_ID,
        CLIENT_SECRET,
        REDIRECT_URI
      );
      oAuth2Client.setCredentials({ refresh_token: REFRESH_TOKEN });

      const accessToken = await oAuth2Client.getAccessToken();
      console.log("Access Token: " + accessToken);

      let aT: string | undefined = "";

      if (accessToken.token !== null) {
        aT = accessToken.token;
      }

      console.log("Access Token token: " + aT);

      const transporter = nodemailer.createTransport({
        service: "gmail",
        auth: {
          type: "OAuth2",
          user: "example@gmail.com",
          clientId: CLIENT_ID,
          clientSecret: CLIENT_SECRET,
          refreshToken: REFRESH_TOKEN,
          accessToken: aT,
        },
      });

      // returning result
      transporter.sendMail(mailOptions, (error: any, info: any) => {
        if (error) {
          console.log(error.toString());
        }
        console.log("Sended");
      });
    } catch (error) {
      console.log({ error });
    }
    return snapshot;
  }); 
import*作为“firebase函数”中的函数;
从“firebase管理员”导入*作为管理员;
从“nodeEmailer”导入*作为nodeEmailer;
从“googleapis”导入*作为goole;
admin.initializeApp();
////开始编写Firebase函数
// // https://firebase.google.com/docs/functions/typescript
export const mailPedidos=functions.firestore
.document(“example/{exampleId}”)
.onCreate(异步(快照、上下文)=>{
//删除业务逻辑
让name=“Carl”;
让邮件=”example@gmail.com";
常量邮件选项={
来自:“库克森”,
致:邮寄:,
主题:“示例主题”,
html:`Name:${Name}

`,//HTML格式的电子邮件内容 }; 试一试{ const客户端ID= “客户ID”; const CLIENT_SECRET=“CLIENTSECRET”; const REDIRECT_URI=”https://developers.google.com/oauthplayground"; 常量刷新令牌= “刷新令牌”; const oAuth2Client=new goole.google.auth.OAuth2( 客户ID, 客户的秘密, 重定向\u URI ); oAuth2Client.setCredentials({refresh_token:refresh_token}); const accessToken=等待oAuth2Client.getAccessToken(); 日志(“访问令牌:+accessToken”); let aT:string | undefined=“”; if(accessToken.token!==null){ aT=accessToken.token; } 日志(“访问令牌:+aT”); const transporter=nodemailer.createTransport({ 服务:“gmail”, 认证:{ 类型:“OAuth2”, 用户:“example@gmail.com", clientId:客户端ID, clientSecret:CLIENT_SECRET, 刷新令牌:刷新令牌, accessToken:aT, }, }); //返回结果 transporter.sendMail(mailpoptions,(错误:any,信息:any)=>{ 如果(错误){ log(error.toString()); } 控制台日志(“已发送”); }); }捕获(错误){ log({error}); } 返回快照; });
这可能是因为谷歌云平台的配置

一个Google云平台项目,其OAuth同意屏幕配置为外部用户类型,发布状态为“测试”,发布刷新令牌,7天后到期

链接到相关线程: