Google IOT核心 - http桥接"请求缺少必需的身份验证凭据"

时间:2018-02-28 10:11:00

标签: iot google-cloud-iot

我试图通过从命令行发布简单的http请求来开始使用Google IOT核心。

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

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

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

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

非常感谢任何指导

1 个答案:

答案 0 :(得分:0)

一些想法:

  • (更新)检查JWT在JWT.io
  • 上是否有效
  • 重新生成您的EC公钥/私钥并重新注册设备
  • 注意 maximum lifetime of a token is 24 hours
  • 确保您的设备已使用正确的凭据,区域和云项目注册。

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

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

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'))