使用 OAuth2.0 和 PHP 的 C2DM(ClientLogin 已弃用!)

Posted

技术标签:

【中文标题】使用 OAuth2.0 和 PHP 的 C2DM(ClientLogin 已弃用!)【英文标题】:C2DM with PHP using OAuth2.0 (ClientLogin is deprecated!) 【发布时间】:2012-05-07 13:47:13 【问题描述】:

注意:在您花时间阅读之前,请知道 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框架了吗yiiframework.com/extension/c2dm 我非常期待答案... +1 的问题。 @Suchi 我已经在使用 Zend 框架,所以我不想为此添加另一个框架。虽然它看起来非常好和简单。它使用OAuth2.0吗? 【参考方案1】:

这不适用于 C2DM,因为它是一个托管帐户,如果您看到它说的 https://developers.google.com/accounts/docs/AuthForInstalledApps

ClientLogin 可用于授权访问 Google 常规和 托管帐户。托管帐户是一个用户帐户,它是 Google Apps 服务。

此外,如果您看到图形是用户之间的清晰交互作为 UI 界面,因为涉及验证码。

编辑

顺便说一句,您可以从这篇文章中看到 C2DM 机制仍将使用 ClientLogin,但 2011 年 10 月之前的密钥将过期,因此您需要重新创建它们。这是 ClientLogin 被弃用前 8 天的最新帖子。 C2DM Client Login Key

【讨论】:

你说得对,我们应该继续使用 ClientLogin 而不必担心会被弃用。更多关于这个的讨论可以在这里看到***.com/a/10859270/1104697【参考方案2】:

我还不知道如何将 C2DM 与 oAuth 2.0 一起使用,但这是我尝试过的。希望这可以帮助某人解决类似的问题

我在http://aleksmaus.blogspot.com/2012/01/oauth2-with-google-c2dm-push.html 找到了有用的资源 但是,当我尝试通过 OAuth 2.0 使用 C2DM 发送消息时,它不起作用,但使用 ClientLogin 做得很好。

这就是我使用控制台和网络浏览器的方式 (我知道,你问过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 时可能从 Google 收到的邮件中发现了 “AC2DM 目前是实验室中的 API” 这句话。和 ClientLogin deprecation policy will not apply to versions, features, and functionality labeled as "experimental."我不确定,但我认为这就是我们的代码不起作用的原因。

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

【讨论】:

401 将在您无权查看/访问指定资源时发生。与禁止类似,请确保您的 OAuth 令牌有效、未过期以及任何潜在的拼写错误/错误。你的 curl 请求对我来说很好。 @Tim // 感谢您的回复。但是我已经检查了当我看到 401 响应时有效的 OAuth 凭据。我认为它还不受支持,因为 C2DM 仍处于测试阶段:(【参考方案3】:

Here

你可以看看,它对我有用。

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

您需要了解的另一件事是关于 c2dm.php,当它尝试检查服务器响应为“200 OK”时会发生错误。因为它试图从身体中得到这种反应。只需简单地注释其中的行,然后运行。

【讨论】:

对不起,我只是没看到你的意思是 ClientLogin 已被弃用。我的回答也使用了 ClientLogin。

以上是关于使用 OAuth2.0 和 PHP 的 C2DM(ClientLogin 已弃用!)的主要内容,如果未能解决你的问题,请参考以下文章

C2DM 应用服务器解决方案

C2DM:如何处理第 3 方 php 服务器中的注册 ID?

OAuth2 Demo PHP

Android C2DM 服务器发送错误

php实现第三方登录

oauth2-server-php-docs 概念