使用OAuth2.0实现C2DM与PHP的通信(ClientLogin已弃用!)

11

注意:在您继续阅读之前,请知道C2DM本身已经被弃用,现在已由GCM(http://developer.android.com/guide/google/gcm/c2dm.html)取代。

-- 原始问题 --

我们有没有PHP服务器端代码的示例,可以使用C2DM向Android设备推送消息?

我搜索了许多使用已弃用的ClientLogin身份验证方法的代码示例。 参考:https://developers.google.com/accounts/docs/AuthForInstalledApps (重要提示:ClientLogin自2012年4月20日起已正式弃用。根据我们的弃用政策,它将继续工作,但我们鼓励您尽快迁移到OAuth 2.0。)


你看过 Yii 框架吗?http://www.yiiframework.com/extension/c2dm/ - Suchi
1
我非常期待答案... 给这个问题点个赞。 - drulabs
@Suchi 我已经在使用Zend框架了,所以我不想为此添加另一个框架。尽管它看起来非常好和简单。它是否使用OAuth2.0? - Doc
3个回答

4
由于C2DM是托管帐户,因此不适用于此情况。如果您查看https://developers.google.com/accounts/docs/AuthForInstalledApps,它会说:
“ClientLogin可用于授权访问Google常规和托管帐户。 托管帐户是Google Apps服务的一部分的用户帐户。”
此外,如果您查看图形界面,则涉及用户作为UI界面之间的明确交互,因为涉及CAPTCHA。
编辑:
顺便说一下,您可以从此帖子中看到,尽管在2011年10月之前的密钥将过期,但C2DM机制仍将使用ClientLogin,因此您需要重新创建它们。这是在ClientLogin被弃用8天前发布的一篇非常新的文章。 C2DM Client Login Key

你是对的,我们应该继续使用ClientLogin而不用担心弃用提示。更多讨论请参见此处https://dev59.com/PmTWa4cB1Zd3GeqPEIVd#10859270。 - Doc

2

我还不知道如何使用oAuth 2.0来使用C2DM,但是我尝试过以下方法。希望这能帮助解决类似的问题。

我找到了一个有用的资源,网址为http://aleksmaus.blogspot.com/2012/01/oauth2-with-google-c2dm-push.html。但是当我尝试通过OAuth 2.0发送C2DM消息时,它没有成功,而使用ClientLogin则可行。

这是我在控制台和Web浏览器中的做法 (我知道,您要求PHP实现。但我希望这对您也有所帮助)


客户端登录:(成功)

从以下位置获取授权令牌:

$ curl -k -d "accountType=HOSTED_OR_GOOGLE&service=ac2dm&source=test-1.0&Email=[email account with @gmail.com without brace]&Passwd=[Google account password without brace]" https://www.google.com/accounts/ClientLogin 

并发送类似以下的C2DM消息:
$ curl -k --header "Authorization: GoogleLogin auth=[my ClientLogin auth key without brace]" -d "registration_id=[can be acquired from Android application]" --trace c2dm_trace.txt -d collapse_key=0 https://android.apis.google.com/c2dm/send

我的应用程序成功接收到了C2DM消息。


oAuth 2.0:(失败)

通过访问以下URL从Web浏览器获取了oAuth 2.0授权凭据:

https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=[can be acquired from API Access menu in your API Console]&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=https%3A%2F%2Fandroid.apis.google.com%2Fc2dm&access_type=offline

(Google API 控制台:https://code.google.com/apis/console/ )

并像这样发送:

$ curl -k -H "Authorization: Bearer [my auth key from oAuth]" --trace curl_trace.txt -d "registration_id=[an be acquired from Android application]" -d "data.message=something to talk" -d collapse_key=0 https://android.apis.google.com/c2dm/send

然后收到了401错误响应 :(


有人能指出我做错了什么吗?

编辑

我在注册C2DM时的邮件中发现了句子"AC2DM目前是实验性API"。而且客户端登录弃用政策不适用于被标记为“实验”的版本、功能和特性。我不确定,但我认为这就是我们的代码无法工作的原因。

当然,我希望ClientLogin也很快被OAuth 2.0取代并弃用。


当您未被授权查看/访问指定的资源时,将会出现401错误。类似于禁止访问,确保您的OAuth令牌有效且未过期,并排除任何可能的拼写错误或错误。根据我的观察,您的curl请求看起来没问题。 - Tim
@Tim // 感谢您的回复。但是,当我看到401响应时,我已经检查了我的OAuth凭据,并且它是有效的。我认为这还没有得到支持,因为C2DM仍处于测试阶段 :( - Joon Hong

0

这里

你可以看一下,这对我有用。

你需要获取你的设备注册ID,并在post.php中输入你的c2dm帐户电子邮件地址和密码。

另外你需要知道的是关于c2dm.php,当它尝试检查服务器响应为“200 OK”时会出现错误。因为它试图从正文中获取此响应。只需简单地注释掉其中的一行,然后运行即可。


抱歉,我刚才没有看到你的意思是ClientLogin已经被弃用了。我的回答也使用了ClientLogin。 - osayilgan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接