0

我正在尝试通过从命令行发布一个简单的 http 请求来开始使用 google IOT 核心。

我已经在控制台中设置了我的注册表和设备,并添加了公钥。我设置了一个遥测主题。我使用我找到的 Qt 应用程序,使用私钥生成了 JWT。我正在使用https://cloud.google.com/iot/docs/how-tos/http-bridge中指定的程序。我的命令是:

curl -X POST -H 'authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJzeWx2YW4tam91cm5leS0xOTU4MTUiLCJleHAiOiIxNTIwMzU4NjMyIiwiaWF0IjoiMTUxOTc1MzgzMiJ9.kDkwtWvfAE+AOYT2cObgh8Mux2n1DOuek1KR0YrsFSI=' -H 'content-type: application/json' --data '{"binary_data": "SGVsbG8="}' -H 'cache-控制:无缓存'' https://cloudiotdevice.googleapis.com/v1/projects/sylvan-journey-195815/locations/europe-west1/registries/MyDeviceRegistry/devices/FirstDevice:publishEvent '

当我尝试发布命令时,我收到错误 401“请求缺少所需的身份验证凭据。预期的 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据”

我不知道在哪里看。我的 JWT 有问题吗?命令的格式是否错误?我需要将公钥添加到注册表还是仅添加到设备。我如何找出问题所在?

非常感谢任何指导

4

1 回答 1

0

一些想法:

  • (更新)检查 JWT 在JWT.io上是否有效
  • 重新生成您的 EC 公钥/私钥并再次注册设备
  • 请注意,令牌的最长生命周期为 24 小时
  • 确保您的设备已使用正确的凭据、区域和云项目进行注册。
  • 确保为您的注册表启用 HTTP

你是如何注册你的设备的?如果设备使用已过期的证书注册,您可能会遇到身份验证问题。

下面的 Python 代码是我如何从命令行生成 JWT,以使用 RSA256 密钥对 HTTP 端点进行 Curl 测试:

import datetime
import jwt
import requests

algorithm = 'RS256'
cloud_region = 'your-cloud-region'
device_id = 'your-device-id'
private_key_file = 'path/to/rsa_private.pem'
project_id = 'your-project-id'
registry_id = 'your-registry-id'

token = {
        # The time the token was issued.
        'iat': datetime.datetime.utcnow(),
        # Token expiration time.
        'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=60),
        # The audience field should always be set to the GCP project id.
        'aud': project_id
}

# Read the private key file.
with open(private_key_file, 'r') as f:
    private_key = f.read()

print(jwt.encode(token, private_key, 
algorithm=algorithm).decode('ascii'))

下图显示了Cloud Console中用于启用 HTTP/MQTT 的设置,可在 IoT Core > Registry > Edit Registry 下找到。请注意,如果您禁用 HTTP,您将无法使用 HTTP 设备网桥。

在此处输入图像描述

于 2018-02-28T19:21:53.157 回答