简体   繁体   English

Google Smart Home报告状态错误403

[英]Google Smart home report state error 403

I'm reporting states for devices using http post with a jwt generated using service account. 我正在报告使用http帖子和使用服务帐户生成的jwt的设备的状态。 Below is the payload for jwt 以下是jwt的有效负载

{
   "iss": "<service-account-email>",
   "scope": "https://www.googleapis.com/auth/homegraph",
   "aud": "https://accounts.google.com/o/oauth2/token",
   "iat": <current-time>,
   "exp": <current-time-plus-one-hour>
 }

after this I sign the jwt using the private key for my service account using the python library google.auth.crypt.RSASigner.from_service_account_file(path) and generate the jwt token. 之后,我使用python库google.auth.crypt.RSASigner.from_service_account_file(path)使用服务帐户的私钥对jwt进行签名,并生成jwt令牌。 I am further using this token to obtain the access token from https://accounts.google.com/o/oauth/token , which is also successful. 我进一步使用此令牌从https://accounts.google.com/o/oauth/token获取访问令牌,该令牌也成功。 After obtaining the access token I am making a post request to https://homegraph.googleapis.com/v1/devices:reportStateAndNotification?key=api_key 获取访问令牌后,我向https://homegraph.googleapis.com/v1/devices:reportStateAndNotification?key=api_key发送请求

with headers 带标题

{"Authorization": "Bearer <token>", "X-GFE-SSL": "yes", "Content-Type": "application/json"}

and json data 和json数据

{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "agent_user_id": "1234", "payload": { "devices": { "states": { "1458765": { "on": true }, "4578964": { "on": true, "isLocked": true } } } } }

But this gives me 但这给了我

{'error': {'code': 403, 'message': 'The request is missing a valid API key.', 'status': 'PERMISSION_DENIED'}}

I followed the steps from https://developers.google.com/actions/smarthome/report-state is there anything i'm doing wrong? 我按照https://developers.google.com/actions/smarthome/report-state中的步骤操作,我在做错什么吗? or am I missing any steps? 还是我缺少任何步骤?

UPDATE: I added the api key to the uri now it gives me another error in response 更新:我向uri添加了api密钥,现在它给了我另一个错误

{'error': {'code': 403, 'message': 'The caller does not have permission', 'status': 'PERMISSION_DENIED'}}

how do I resolve this issue? 我该如何解决这个问题?

In order to report the state to the Home Graph you have to: 为了向状态图报告状态,您必须:

  • Create a Service Account for the token creation from your SmartHomeApp project: 为您的SmartHomeApp项目中的令牌创建创建服务帐户
  • Go to APIs & Services => Click on Credentials 转到API和服务 =>单击凭据 转到“ API和服务” =>单击“凭据”
  • Click on Create credentials => Click on Service account key 单击创建凭据 =>单击服务帐户密钥 单击“创建凭据” =>单击“服务帐户密钥”
  • Fill with your data creating a new New service account => Select the role Service Accounts > Service Account Token Creator 填写数据以创建新的新服务帐户 =>选择角色服务帐户>服务帐户令牌创建者 填写数据以创建新的“新服务帐户” =>选择角色“服务帐户>服务帐户令牌创建者”
  • Download the JSON file with your keys and certificate 使用密钥和证书下载JSON文件
  • Get a valid signed JWT token : 获取有效的签名JWT令牌

     credentials = service_account.Credentials.from_service_account_file(service_account_file, scopes="https://www.googleapis.com/auth/homegraph") now = int(time.time()) expires = now + 3600 # One hour in seconds payload = { 'iat': now, 'exp': expires, 'aud': "https://accounts.google.com/o/oauth2/token", 'scope': SCOPE, 'iss': credentials.service_account_email } signed_jwt = google.auth.jwt.encode(credentials.signer, payload) 
  • Obtain a valid Access token : 获取有效的访问令牌

     headers = {"Authorization": "Bearer {}".format(signed_jwt.decode("utf-8")), "Content-Type": "application/x-www-form-urlencoded"} data = {"grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer", "assertion": signed_jwt} access_token = requests.post("https://accounts.google.com/o/oauth2/token", data=data, headers=headers).get("access_token") 
  • Send the reported states: 发送报告的状态:

     headers = {"Authorization": "Bearer {}".format(access_token), "X-GFE-SSL": "yes"} data = {"requestId": request_id, "agent_user_id": agent_user_id, "payload": {"devices": {"states": states}}} requests.post("https://homegraph.googleapis.com/v1/devices:reportStateAndNotification", data=json.dumps(data), headers=headers) 

NOTE : in order to work these snippets require to import google.auth.jwt , from google.oauth2 import service_account and import requests from google-auth , google-auth-httplib2 and requests packages. 注意 :为了运行这些代码片段,需要from google.oauth2 import service_account import google.auth.jwtfrom google.oauth2 import service_account并从google-authgoogle-auth-httplib2requests包中import requests

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM