我正在尝试创建一个 C# 项目,该项目将引导用户完成新 Google 云打印打印机的注册。我已经阅读了我能找到的所有文档和故障排除,但我仍然很难过。
可以在此处阅读Google 说明的完整详细信息。
流程应该是这样的:
- 打印机向 /register 发出未经身份验证的请求
- 打印机将用户定向到邀请 URL
- 用户登录并声明打印机
- 打印机轮询 URL,直到用户声明
- 认领后,打印机将获得一个 Auth Code
- 打印机交换访问/刷新令牌的 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 应用程序,并且得到相同的结果。
提前感谢您提供的任何线索或帮助。