我们正在谷歌主页上使用google上的操作构建一个智能家居应用程序。我们的应用程序需要登录我们的系统才能访问用户设备,以便他们可以使用谷歌主页上的语音控制它们。我们的用户后端是使用AWS Cognito构建的。我们使用API.AI作为Google Home应用的一部分。
我已将Cognito OAUTH2端点和Google应用上的操作配置为使用身份验证代码流和不同的范围相互协作,但我有些遗漏。当我尝试将用户帐户关联到Google Home应用时,我会被重定向到我们的登录页面。在填写用户详细信息后,我返回到Google Home' Discover'标签但是底部有一条消息说明:“Auth Code Exchange中IdP的响应不好”。
我也尝试过使用谷歌的OAUTH2游乐场。似乎在使用它时我能够从我们的OATUH服务器获取代码,但是当尝试交换令牌的代码时,我得到以下错误:
HTTP/1.1 400 Bad Request
Strict-transport-security: max-age=31536000 ; includeSubDomains
X-content-type-options: nosniff
X-application-context: application:prod:8443
Transfer-encoding: chunked
Set-cookie: XSRF-TOKEN=35f58337-76f4-4993-a0c9-93429134ea42; Path=/; Secure; HttpOnly
Expires: 0
Server: Server
Connection: keep-alive
X-amz-request-id: 284d862e-b021-4079-b5f5-3cbce675983c
X-xss-protection: 1; mode=block
Pragma: no-cache
Cache-control: no-cache, no-store, max-age=0, must-revalidate
Date: Wed, 23 Aug 2017 13:51:42 GMT
X-frame-options: DENY
Content-type: application/json;charset=UTF-8
{
"error": "invalid_client"
}
我检查并重新检查了客户端ID和客户端密码等,但找不到任何错误。
有谁知道如何解决这个问题?
提前致谢
答案 0 :(得分:1)
授权 如果客户端被发出秘密,则客户端必须通过基本HTTP授权在授权头中传递其client_id和client_secret。秘密是Basic Base64Encode(client_id:client_secret)。
他们需要将客户端和客户端sectet放入标题...
然后我使用aws http代理捕获了谷歌进展的请求。
Method request headers: {X-Cloud-Trace-Context=d7b6b9b8239965baf69acab659e80a01/13879251242019662389, CloudFront-Viewer-Country=US, CloudFront-Forwarded-Proto=https, CloudFront-Is-Tablet-Viewer=false, CloudFront-Is-Mobile-Viewer=false, User-Agent=google-oauth-playground AppEngine-Google; (+http://code.google.com/appengine; appid: s~oauth2playground), X-Forwarded-Proto=https, CloudFront-Is-SmartTV-Viewer=false, Host=en75z5h2rb.execute-api.us-east-1.amazonaws.com, Accept-Encoding=gzip, deflate, X-Forwarded-Port=443, X-Amzn-Trace-Id=Root=1-5a0fcef2-09197cd86a625ad47d78f0b7, Via=1.1 d63a8908759a2f4775b3f672ebf823cc.cloudfront.net (CloudFront), X-Amz-Cf-Id=nFdLK97vAS5HvmpNYkPpbUMOB4bCaM6pScHWTAReAnonLg1gXF7hSg==, X-Forwarded-For=107.178.195.199, 54.182.238.53, content-type=application/x-www-form-urlencoded, CloudFront-Is-Desktop-Viewer=true}
请求标头中没有授权。因此Cognito将返回
"error": "invalid_client"
根据此OAUTH2.0规范(https://tools.ietf.org/html/rfc6749#section-2.3.1)
我已经问过AWS支持了。他们说:
感谢您与AWS Support联系并向我们提供详细参考。我很乐意帮助您解决有关Cognito支持客户凭证的问题。
通过阅读OAUTH2.0标准RFC 6749 [0]后,看起来不建议在请求体中包含客户端凭据。这是该规范的摘录:
"建议不要使用这两个参数在请求体中包含客户端凭据,并且应限于无法直接使用HTTP Basic身份验证方案(或其他基于密码的HTTP身份验证方案)的客户端。 #34;