Google云打印 - 授权代码交换提供401:unauthorized_client

时间:2015-02-17 04:54:06

标签: google-oauth google-cloud-print

我正在尝试创建一个C#项目,该项目将引导用户注册新的Google云打印机。我已经阅读了我能找到的每一份文档和疑难解答,而且我仍然感到难过。

Google说明的完整详情可以是read here

流程应该是这样的:

  1. 打印机向/ register
  2. 发出未经身份验证的请求
  3. 打印机将用户引导至邀请网址
  4. 用户登录并声明打印机
  5. 打印机轮询网址,直到用户声明
  6. 声明后,打印机会获得验证码
  7. 打印机交换访问/刷新令牌的验证码
  8. 我遇到第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,我得到了相同的结果。

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

1 个答案:

答案 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帐户声明打印机。

POST to Polling URL

POST to OAuth2 API

POST to /delete to clean up

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