如何使用后端服务器验证 google 家庭用户?

How to authenticate a google home user with the back-end server?

我们正在尝试 link google 家庭应用程序与我们的后端服务器。目前,我们可以使用 google 帐户登录 google 家庭应用程序,并将访问令牌发送到我们自己的 api。我们也可以使用 google 帐户登录我们自己的服务。但是我们如何才能验证是谁从 google 主页发送连接两个帐户的请求。

google 从我们的服务器登录收到的信息。

object(Google_Service_Oauth2_Userinfoplus)#48 (14) {
  ["internal_gapi_mappings":protected]=>array(3) {
    ["familyName"]=>string(11) "family_name"
    ["givenName"]=>string(10) "given_name"
    ["verifiedEmail"]=>string(14) "verified_email"
  }
  ["email"]=>NULL
  ["familyName"]=>string(6) "familyname"
  ["gender"]=>string(4) "male"
  ["givenName"]=>string(7) "givenname"
  ["hd"]=>NULL
  ["id"]=>string(21) "XXXXXXXXXXXXXXXXXX"
  ["link"]=>string(45) "https://plus.google.com/XXXXXXXXXXXXXXXXXXXX"
  ["locale"]=>string(2) "nl"
  ["name"]=>string(14) "firstname lastname"
  ["picture"]=>string(92) ""
  ["verifiedEmail"]=>NULL
  ["modelData":protected]=>array(2) {
    ["given_name"]=>string(7) ""
    ["family_name"]=>string(6) ""
  }
  ["processed":protected]=>array(0) {
  }
}
array(6) {
  ["access_token"]=>string(140) "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
  ["expires_in"]=>int(3599)
  ["scope"]=>string(206) "https://www.googleapis.com/auth/userinfo.profile
    https://www.googleapis.com/auth/plus.profile.language.read
    https://www.googleapis.com/auth/plus.me
    https://www.googleapis.com/auth/plus.profile.agerange.read"
  ["token_type"]=>string(6) "Bearer"
  ["id_token"]=>string(1085) "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
  ["created"]=>int(1534615815)
}

Post 从 google 主页到 webhook 的请求

{  
 "user":{  
  "userId":"XXXXXXXXXXXXXXXXXXXXXXXX",
  "accessToken":"XXXXXXXXXXXXXXXXXXXXXXXXX",
  "locale":"nl-NL",
  "lastSeen":"2018-10-15T14:17:23Z",
  "userStorage":"{\"data\":{}}"
  },
  "conversation":{  
  "conversationId":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "type":"ACTIVE",
  "conversationToken":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
},

如果您在对 webhook 的请求中收到 accessToken,那么这是您的 OAuth2 服务器应该向智能助理发出的访问令牌,以便它可以代表您执行操作。据推测,您会在您的身份验证系统中使用此令牌来识别用户的帐户,但具体的方法取决于您,因为它取决于您使用的 OAuth 服务器。

但是,由于您使用的是 Google 帐户,因此可以使用 Google Sign in for Assistant 大大简化操作。这会给你一个 idToken 而不是它,在解码和验证时,它将包括他们的 Google ID,它应该与你从他们的个人资料中获得的 id 相匹配。