1

我正在尝试创建一个 C# 项目,该项目将引导用户完成新 Google 云打印打印机的注册。我已经阅读了我能找到的所有文档和故障排除,但我仍然很难过。

可以在此处阅读Google 说明的完整详细信息。

流程应该是这样的:

  1. 打印机向 /register 发出未经身份验证的请求
  2. 打印机将用户定向到邀请 URL
  3. 用户登录并声明打印机
  4. 打印机轮询 URL,直到用户声明
  5. 认领后,打印机将获得一个 Auth Code
  6. 打印机交换访问/刷新令牌的 Auth 代码

我在第 6 步遇到问题,因为它总是返回 401:未授权客户端错误。

正如我从文档中了解到的那样,在第 1 步中,Google 正在为打印机创建一个“机器人”(或服务)帐户,而用户只是将自己作为所有者与该帐户相关联。打印机应该有自己的访问令牌来利用云打印 API 并接收 XMPP 消息(作业等)。

我有一个理论上的解决方法,让用户明确允许我的项目访问 /cloudprint 和 /googletalk API,然后使用用户登录中的访问和刷新令牌来控制打印机,但我担心机器人帐户的 JabberId将无法访问,因为我从未成功交换过验证码。

我一直主要使用https://apigee.com/console/others来模拟 Google 的各种 http 帖子,所以目前我真的没有任何代码可以显示。这是正在发送的第 6 步的 POST(隐藏了我的客户端 ID):

POST /o/oauth2/token HTTP/1.1
Host: accounts.google.com
Content-Length: 250
X-Target-URI: https://accounts.google.com
Content-Type: application/x-www-form-urlencoded
Connection: Keep-Alive

client_id=xxxxxxxxxx-xxxxxxxxxxxxxxxx.xxxxxxxxxxxx.apps.googleusercontent.com&
redirect_uri=oob&
client_secret=xxxxxxxxxxxxxxxxxxx-xxxxxxxxx&
grant_type=authorization_code&
code=4/ql0tDrttiY-xxxxxxxxxxxxxxxXXXXXXXXXxxxxxxxxxxxx

请注意,当我获得授予对 API 访问权限的特定用户的身份验证代码时,这个完全相同的请求可以完美运行。我还可以使用刷新令牌检索新的访问令牌,尽管该 API 也没有完全正确地记录;我需要用“refresh_token”替换“code”,但它给出的错误消息至少是有用的。

另一条信息是,在 Google Developer's Console 中,我的客户端 ID 用于“本机应用程序”,文档中的任何地方都没有指定它,但默认(且不可更改)重定向 Uris 似乎在很大程度上暗示了这一点。我曾尝试将客户端 ID 用于 Web 应用程序,并且得到相同的结果。

提前感谢您提供的任何线索或帮助。

4

1 回答 1

1

所以,我想我已经发现了问题所在。

在第 4 步期间(当我检索授权码时),Google 会采用您为 OAuth_client_id 参数提供的任何值,而不检查它是否实际上是有效的客户端 ID。我在 URL 参数中有一个额外的空格,我没有注意到,也没有给出错误。返回的 Auth Code 必须将此空间合并为它在步骤 6 中所期望的 Client ID 的一部分,我(当然)没有提供。我只是通过从头开始重新创建所有内容才发现我的错误。

希望这对将来的其他人有所帮助。

以下是我正在制作的帖子,供任何寻找示例的人使用:

POST 到 /Register 以创建新打印机

按照返回的 complete_invite_url 链接使用您的 Google 帐户申请打印机。

发布到投票 URL

POST 到 OAuth2 API

POST 到 /delete 进行清理

祝所有使用此 API 的人好运!

于 2015-02-17T14:50:25.470 回答