首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法验证AWSLambdaPython3 (Interactions_Endpoint_URL)上bot的不和谐签名

无法验证AWSLambdaPython3 (Interactions_Endpoint_URL)上bot的不和谐签名
EN

Stack Overflow用户
提问于 2021-05-19 21:50:11
回答 1查看 1.3K关注 0票数 1

我试图使用运行python 3.7的lambda函数中的不和谐的“交互端点URL”验证我的bot应用程序的签名。使用“安全和授权”部分下的文档这里,我似乎仍然无法获得签名的有效返回,每次都会触发异常。我不确定验证的哪个方面是不正确的。我使用将头转发到lambda函数,以便访问它们。如果能帮助我找到正确的方向,我将不胜感激。

编辑:

下面是lambda中事件的输出,以供参考。我删除了一些由<>标记的安全性值。

代码语言:javascript
复制
{'body': {'application_id': '<AppID>', 'id': '<ID>', 'token': '<Token>', 'type': 1, 'user': {'avatar': '4cbeed4cdd11cac74eec2abf31086e59', 'discriminator': '9405', 'id': '340202973932027906', 'public_flags': 0, 'username': '<username>'}, 'version': 1}, 'headers': {'accept': '*/*', 'content-type': 'application/json', 'Host': '<AWS Lambda address>', 'User-Agent': 'Discord-Interactions/1.0 (+https://discord.com)', 'X-Amzn-Trace-Id': 'Root=1-60a570b8-00381f6e26f023df5f9396b1', 'X-Forwarded-For': '<IP>', 'X-Forwarded-Port': '443', 'X-Forwarded-Proto': 'https', 'x-signature-ed25519': 'de8c8e64be2058f40421e9ff8c7941bdabbf501a697ebcf42aa0419858c978e19c5fb745811659b41909c0117fd89430c720cbf1da33c9dcfb217f669c496c00', 'x-signature-timestamp': '1621455032'}}
代码语言:javascript
复制
import json
import os
from nacl.signing import VerifyKey
from nacl.exceptions import BadSignatureError



def lambda_handler(event, context):
    


    # Your public key can be found on your application in the Developer Portal
    PUBLIC_KEY = os.environ['DISCORD_PUBLIC_KEY']
    
    verify_key = VerifyKey(bytes.fromhex(PUBLIC_KEY))
    
    signature = event['headers']["x-signature-ed25519"]
    timestamp = event['headers']["x-signature-timestamp"]
    body = event['body']
    
    try:
        verify_key.verify(f'{timestamp}{body}'.encode(), bytes.fromhex(signature))
    except BadSignatureError:
        return (401, 'invalid request signature')
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-23 16:20:04

我能诊断出这个问题。我无法验证签名,因为在我的lambda函数之前将主体更改为JSON。这使得签名验证每次都是无效的。我通过检查API网关中Integration部分的Lambda代理集成来解决这个问题。Lambda代理复选框。这允许一个未被改变的身体被送到Lambda,然后我可以验证我的不和谐传出的网钩。下面是我的最后代码。

代码语言:javascript
复制
import json 
import os 
from nacl.signing import VerifyKey 
from nacl.exceptions import BadSignatureError 

def lambda_handler(event, context):

    PUBLIC_KEY = os.environ['DISCORD_PUBLIC_KEY']
    
    verify_key = VerifyKey(bytes.fromhex(PUBLIC_KEY))
    
    signature = event['headers']["x-signature-ed25519"] 
    timestamp = event['headers']["x-signature-timestamp"] 
    body = event['body']

    try: 
        verify_key.verify(f'{timestamp}{body}'.encode(), bytes.fromhex(signature))
        body = json.loads(event['body'])
        if body["type"] == 1:
            return {
             'statusCode': 200, 
             'body': json.dumps({'type': 1})
         } 
    except (BadSignatureError) as e:
        return {
             'statusCode': 401, 
             'body': json.dumps("Bad Signature")
         } 
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67611361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档