如何签署请求令牌?

Posted

技术标签:

【中文标题】如何签署请求令牌?【英文标题】:how to sign request tokens? 【发布时间】:2014-10-24 07:41:49 【问题描述】:

我目前正在尝试编写一个脚本来发送请求令牌,我有标头和声明集,但我不理解签名! OAuth 要求我的私钥使用 SHA256withRSA(也称为带有 SHA-256 哈希函数的 RSASSA-PKCS1-V1_5-SIGN)加密,但我能找到的最接近的是 RSAES-PKCS1-v1_5(具有 RSA,并且 SHA- 256 哈希)。我按照这个例子进行了调整,所以我可以设置它,但这是我的困境: 签名 = "" h = SHA.new(签名)

key = RSA.importKey(open('C:\Users\Documents\Library\KEY\My Project 905320c6324f.json').read())
cipher = PKCS1_v1_5.new(key)
ciphertext = cipher.encrypt(message+h.digest())
print(ciphertext)

我有点迷茫,我得到的 JSON 文件既有公钥又有私钥,我是否将私钥复制并粘贴到签名变量中(它给了我无效的语法)?或者我是否再次通过目录?我迷路了,我的头晕了哈哈。我目前正在运行 Python 3.4,使用 pyCrypto 作为签名。

【问题讨论】:

【参考方案1】:

根据您在下面所说的想要使用 gmail 编写命令系统的内容,我编写了一个简单的脚本来使用 IMAP 执行此操作。我认为这可能比尝试为单个用户使用 Google API 更简单,除非您只是为了练习而这样做。

import imaplib, logging
from time import sleep

USERNAME = 'YOUR_USERNAME_HERE' # For gmail, this is your full email address.
PASSWORD = 'YOUR_PASSWORD_HERE'
CHECK_DELAY = 60 # In seconds

LOGGING_FORMAT = '%(asctime)s %(message)s'
logging.basicConfig(filename='imapTest.log', format=LOGGING_FORMAT, level=logging.INFO)

logging.info("Connecting to IMAP server...")
imap = imaplib.IMAP4_SSL('imap.gmail.com')
imap.login(USERNAME, PASSWORD)
logging.info("Connected to IMAP server.")

def get_command_messages():
    logging.info("Checking for new commands.")
    imap.check()
    # Search the inbox (server-side) for messages containing the subject 'COMMAND' and which are from you.
    # Substitute USERNAME below for the sending email address if it differs.
    typ, data = imap.search(None, '(FROM "%s" SUBJECT "COMMAND")' %(USERNAME))
    return data[0]

def delete_messages(message_nums):
    logging.info("Deleting old commands.")
    for message in message_nums.split():
        imap.store(message, '+FLAGS', '\\DELETED')
    imap.expunge()

# Select the inbox
imap.select()

# Delete any messages left over that match commands, so we are starting 'clean'.
# This probably isn't the nicest way to do this, but saves checking the DATE header.
message_nums = get_command_messages()
delete_messages(message_nums)

try:
    while True:
        sleep(CHECK_DELAY)
        # Get the message body and sent time. Use BODY.PEEK instead of BODY if you don't want to mark the message as read, but we're deleting it anyway below.
        message_nums = get_command_messages()
        if message_nums:
            # search returns space-separated message IDs, but we need them comma-separated for fetch.
            typ, messages = imap.fetch(message_nums.replace(' ', ','), '(BODY[TEXT])')
            logging.info("Found %d commands" %(len(messages[0])))
            for message in messages[0]:
                # You now have the message body in the message variable.
                # From here, you can check against it to perform commands, e.g:
                if 'shutdown' in message:
                    print("I got a shutdown command!")
                    # Do stuff
            delete_messages(message_nums)
finally:
    try:
        imap.close()
    except:
        pass
    imap.logout()

但是,如果您打算使用 Gmail API,Google 强烈建议您使用他们现有的 Python 库,而不是像看起来那样尝试自己进行完整的身份验证等。有了这个,它应该或多或少地是用相关的 Gmail API 替换上面的 imap 调用的情况。

【讨论】:

我要离开谷歌开发者网站上所说的内容,除了需要使用 RSASHA256 签名之外,它没有提供太多信息。你有解释的链接吗? 那么Google's Python library 对你有用吗?如果是这样,该页面将解释如何使用它,并提供一个链接以仅下载 oauth 客户端(如果这就是您所需要的)。特别是,我怀疑 flow_from_clientsecrets() 方法将是您所需要的。除此之外,如果不知道您想使用特定的 Google API 做什么,我不确定是否能提供帮助。 我设置了一个服务帐户,并使用 Gmail API,我计划使用它通过 texing(电子邮件)连接我的电脑和手机,我希望使用类似这样的文本发送命令“命令:重新启动”。它或多或少是一个脚本,可以帮助我与 api 和更大的项目进行交互。我的问题仍然是令牌请求,因为我需要签署自己的 JWT。 好的,我自己来完成这个过程 - 看来您需要创建的是一个应用程序类型:已安装的应用程序(然后在其中选择“其他”类型)。然后,您可以使用正确的 client_secret.json 文件。从那里,我关注this,还必须安装python-gflags,并将Email AddressProduct Name 添加到Google 开发者控制台的同意屏幕上。在此之后,他们的快速入门代码起作用了。 一旦你完成了这项工作,按照 api 文档获取消息列表然后扫描特定消息以查找所需关键字应该相当容易。不过,您是否考虑过通过 IMAP 访问您的收件箱可能是一种更简单的方法?如果我误解了你想要达到的目标,请原谅我 - 也许你是故意这样做作为一种练习。

以上是关于如何签署请求令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 WCF 签署 X509 令牌

如何在 python 中使用 RSA SHA-256 签署令牌?

使用 x509 证书签署 JWT 令牌时遇到问题

使用 SymmetricSecurityKey 签署 jwt 时如何指定孩子?

快速中间件中的 Node.js JWT 刷新令牌

Azure KeyVault - 签署 JWT 令牌