我正在尝试创建一个C#项目,该项目将引导用户注册新的Google云打印机。我已经阅读了我能找到的每一份文档和疑难解答,而且我仍然感到难过。
Google说明的完整详情可以是read here。
流程应该是这样的:
我遇到第6步的问题,因为它总是返回401:unauthorized_client错误。
据我所知,在文档中,在步骤1中,Google正在为打印机创建“机器人”(或服务)帐户,并且用户仅将自己与此帐户关联为所有者。打印机应该有自己的访问令牌来利用云打印API并接收XMPP消息(作业等)。
我有一个理论上的解决方法,让用户明确允许我的项目访问/ cloudprint和/ googletalk API,然后使用访问和刷新来自用户登录的令牌来控制打印机,但我担心机器人帐户的JabberId将无法访问,因为我从未成功交换过Auth代码。
我一直在使用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 。我尝试使用Web应用程序的客户端ID,我得到了相同的结果。
提前感谢您提供的任何线索或帮助。
答案 0 :(得分:1)
所以,我想我已经发现了问题所在。
在第4步(当我检索授权代码)期间,Google会为OAuth_client_id参数获取您为其提供的任何值,而不会检查它是否确实是有效的客户端ID。我在URL参数中有一个额外的空格,我没有注意到,也没有给出错误。返回的Auth Code必须将此空间作为其在步骤6中期望的客户端ID的一部分,我当然没有提供。我只是从头开始重新创造一切,才发现了我的错误。
希望这有助于将来的其他人。
以下是我正在制作的帖子,对于任何寻找示例的人来说:
POST to /Register that creates a new printer
按照返回的complete_invite_url链接,使用您的Google帐户声明打印机。
祝所有使用此API的人好运!