SendGrid API密钥无效。“提供的授权许可无效、已过期或被撤销。”

45

SendGrid似乎阻止我的node js服务器发送电子邮件。

在发送电子邮件时,我收到响应中的此错误消息:

提供的授权授予无效、过期或被撤销

我已经设置了API密钥,并遵循了文档。


这个问题如果有一些代码的话会更容易调试 ;) - kunal batra
这是我之前工单中的代码:http://stackoverflow.com/questions/34788083/node-js-send-grid-issue-on-sending-basic-email - AngularM
你能重新检查一下你的 API 密钥吗?我刚把我的修改成不正确的了,然后出现了这个错误:"[Error: The provided authorization grant is invalid, expired, or revoked]"。请再仔细检查一下并让我知道。 - kunal batra
我已经仔细检查过了,看起来没问题。 - AngularM
我认为这可能是一个账户问题,你能否发送电子邮件至support@sendgrid.com并提供您的用户名,并告知他们发生了什么错误。 - kunal batra
显示剩余6条评论
11个回答

80

您需要使用生成的API KEY。

这里输入图片描述

请不要使用API KEY ID。

这里输入图片描述

当您创建API KEY时,Sendgrid只会显示生成的密钥一次。这里输入图片描述

如果在创建密钥时您没有将其记录在某个地方,则需要创建新密钥,然后您可能需要删除旧密钥,因为如果您不知道它是什么,它将无用。

提示:上面截图中的API密钥已被删除。我立即将其删除了,因此请不必担心我会泄漏该密钥。


我明白了,那在哪里可以找到呢?我正在 SendGrid 上搜索它。 - AngularM
Sendgrid 创建密钥时仅会显示一次生成的密钥。如果您在创建密钥时没有将其记录在某个地方,则需要创建新密钥。 - Justin Steele
他们不让我使用免费计划。甚至也不让我删除它。 - AngularM
点击“删除”几次。对我来说也有点故障。我点击了“删除”半打次,等了一分钟,然后刷新页面,最终删除成功。 - Justin Steele
嗯...我也有一个免费计划,我能够创建多个密钥。尝试禁用任何广告拦截器,并确保为新创建的API密钥分配一些访问权限(完全访问邮件发送)。 - Justin Steele
显示剩余4条评论

5

我知道这是一个晚回答且与JAVA有关.. 但我只是简单地复制了文档并没有注意到..

SendGrid sg = new SendGrid(System.getenv("SENDGRID_API_KEY"));

我刚把钥匙放在那里,却没有看到getEnv。当然很愚蠢..但是当试图快速解决问题时..


1
new SendGrid("SENDGRID_API_KEY"); 这对我起作用了。System.getenv 不起作用。 - Yuvaraj Chitela
是的,你的代码只需要像这样: SendGrid sg = new SendGrid("YOUR_SENDGRID_API_KEY"); 而不需要使用 System.getenv() 方法!不知道为什么文档中还要提到它。 - Akash Verma

4

对我而言,我只需要生成一个新的API密钥。由于某种奇怪的原因,以前的API密钥已经失效,所以我还添加了一个针对此情况的警报。


这对我也是一样的情况。你有任何想法为什么以前的API密钥变得无效了吗?另外,你设置了什么样的警报? - Ciambello
不知道为什么会这样,而且已经过去半年多了,所以很抱歉无法提供更多有用的信息。 - Asaf David

2
  • 如果您正在使用 node js
  • 请确保在需要使用 sendgrid/nodemailer 模块的文件中有 require('dotenv').config() 行。
  • 没有它,SendGrid 运输器 将具有 api_keyundefined 值。

2

在我的情况下,我试图通过使用telnet调试连接,但一直被拒绝。

事实证明,这两者并不等同,echo会在编码字符串中包含\n

echo 'apikey' | base64
printf 'apikey' | base64

所以,确保在API密钥中不包含换行符。

谢谢您的建议。我正在Kubernetes中使用SendGrid,并需要使用base64加密存储apikey值。我已经为此疯狂了几天,这正是我遇到的问题。 - matus

2
在 Sendgrid v3 中,我在使用 Node JS 的环境变量时遇到了类似的问题。如果我使用环境变量,就会出现上述问题。但是如果我将字符串放入 require 进程中,它就能正常工作。 无法正常工作:
SENDGRID_API_KEY=SG.XXXXXXXXXXXXXXXXXXX
var sg = require('sendgrid')(process.env.SENDGRID_API_KEY);

工作

var sg = require('sendgrid')('SG.XXXXXXXXXXXXXXXXXXX');

用API密钥生成的SG.XXXXXXXXXXXXXXXXXXX替换它(在密钥生成期间只能看到一次)。
编辑:
注意:确保不要将此保存到公共存储库。如果这样做,任何人都可以使用您的API密钥,并且Sendgrid团队会暂时暂停您的帐户,直到您从存储库中删除它。

这个解决方案对我有效,但你有没有想到如何修复它。对于使用.env文件的开发人员来说,这不是一个好的解决方案。 - Isak La Fleur
我遇到了相同的错误。所以如果有其他人遇到相同的问题,请仔细检查你的.env文件。密钥不应该用引号""或任何其他分隔符包裹。应该类似于:SENDGRID_API_KEY = 你的密钥在这里 - Dmytro Zharkov

0

对我来说,我刚刚创建了一个新的API密钥,然后它又可以工作了。我百分之百确定它在没有任何代码更改的情况下就能正常工作。

也许这是SendGrid的问题,或者是SendGrid的某种安全操作引起的。


0
这是我的解决方案:
  1. 安装dotenv包:npm i dotenv

  2. 进入应用程序的最早入口点(即index.js),并将以下内容放在顶部:

    const dotenv = require('dotenv').config();

  3. 创建一个.env文件并添加SENDGRID_API_KEY=<YOUR_API_KEY>。不要加引号''或""。

  4. 在使用sendgrid的文件中,将以下内容添加到顶部:

    const sgMail = require('@sendgrid/mail');

    sgMail.setApiKey(process.env.SENDGRID_API_KEY);

完成。


我按照这样的方式进行了集成,但是出现了相同的错误。 - Leffa

0

对于那些在Spring Boot中遇到相同问题的人,可能已经晚了,但是

这可能是由于在初始化时使用env或property值引起的

我在构造函数中初始化变量,而此时Spring尚未加载该值,因此会产生相同的输出。因此,请在调用SendGrid函数的方法中初始化它,或在加载值后进行初始化。


0

不要使用, api_key: ${process.env.SENDGRIDAPIKEY}

可以尝试, api_key: "" + ${process.env.SENDGRIDAPIKEY} + ""

这对我有用,


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接