小编ash*_*ina的帖子

推送通知已成功发送,但设备未收到(偶尔)

从昨天开始,我遇到了一些设备无法接收推送通知的问题.证书/设备令牌似乎是正确的,因为该设备用于成功接收推送通知直到昨天.

在服务器端,没有错误或连接拒绝,并且推送通知似乎每次都成功发送.

但是,在很多情况下,设备无法正确接收推送.

一些周边信息:

  • 我在生产环境中这样做.
  • 服务器端没有错误/连接拒绝
  • 我每次都发送完全相同的JSON.
  • 自昨天起,我们的2台设备未收到AT ALL的推送通知
  • 我们的设备中有一个接收推送通知的成功率(约70%)低于昨天
  • 即使是现在,我们仍有1到2台设备成功接收推送通知.
  • 所有上述设备都能够在生产环境中正确接收推送通知,直到昨天.

当推送成功时,以及当设备没有收到时,服务器端结果没有区别......因此几乎不可能识别问题.

这是我使用的服务器端PHP代码:

        $ctx = stream_context_create();
        stream_context_set_option($ctx, 'ssl', 'local_cert', $this->apnsData[$development]['certificate']);
        $fp = stream_socket_client($this->apnsData[$development]['ssl'], $error, $errorString, 100, (STREAM_CLIENT_C ONNECT|STREAM_CLIENT_PERSISTENT), $ctx);

        if(!$fp){
                $this->_pushFailed($pid);
                $this->_triggerError("Failed to connect to APNS: {$error} {$errorString}.");
        }
        else {
                $msg = chr(0).pack("n",32).pack('H*',$token).pack("n",strlen($message)).$message;
                $fwrite = fwrite($fp, $msg);
                if(!$fwrite) {
                        error_log("[APNS] push failed...");
                        $this->_pushFailed($pid);
                        $this->_triggerError("Failed writing to stream.", E_USER_ERROR);
                }
                else {
                        error_log("[APNS] push successful! ::: $token -> $message ($fwrite bytes)");
                }
        }
        fclose($fp);
Run Code Online (Sandbox Code Playgroud)

日志告诉我推送成功(删除令牌以保护隐私):

[Wed Dec 12 11:42:00 …
Run Code Online (Sandbox Code Playgroud)

php iphone apple-push-notifications

9
推荐指数
1
解决办法
9556
查看次数

使用时间戳的API身份验证:客户端的时间设置更改后该怎么办?

我正在实现REST API身份验证系统.

我基本上使用本网站解释的方法:

http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/

基本上它使用请求主体来创建哈希,将其与实际请求一起发送到服务器,服务器重新创建并比较它,以及什么不...

我不打算解释细节.重要的是我正在使用时间戳来防止"重放攻击".

从网站引用,它解释说:

将当前服务器的时间戳与客户端发送的时间戳进行比较.确保两个时间戳之间的差异在可接受的时间限制内(可能是5-15分钟),以阻止重播攻击.

我现在面临的问题是,如果客户端的时钟设置被修改,它可能会导致意外的API身份验证失败,因为时间戳在客户端和服务器之间不同.

有没有办法解决这个问题?我是否必须放弃使用时间戳?

如果有人能帮助我解决这个时间戳问题,或者我可以阻止重放攻击的任何其他方式,我将非常感激.

注意:我知道向客户端发布一个nonce是防止"重放攻击"的一种很好的方法,但我想把它作为我的最后手段,因为创建一个nonce-issuing-API的实现成本和管理的后端nonce太大了.

security authentication api rest

6
推荐指数
1
解决办法
2015
查看次数

在 iOS7 GM 中接收 SSL 错误 - “AddTrust External CA Root”不受信任?

我在 NSURLConnection 类中收到 SSL 错误,突然来自 iOS7 GM。我无法访问我的任何 API 或 webView 页面,这是一个严重的紧急情况。

有人可以帮我吗?

错误如下:

NSURLConnection/CFURLConnection HTTP 加载失败(kCFStreamErrorDomainSSL,-9813)

我查了一下错误,解释如下:

errSSLNoRootCert = -9813, /* 证书链未经 root 验证 */

我的域的根证书(通过浏览器访问确认)是

“添加信任外部 CA 根”

这不太可能不受信任,因为:

  1. 此根证书甚至列在“iOS5 和 6:受信任的根证书列表”中。 http://support.apple.com/kb/ht5012

  2. 这个错误在iOS6之前从来没有出现过,甚至直到iOS7 beta 6。它突然出现在iOS7 GM中。

  3. 我的浏览器告诉我这是一个受信任的证书。

  4. 我的证书的有效期没有问题。

我想知道这是否是操作系统中的错误,或者我是否必须购买不同根的证书,或者问题是否出在其他地方。

PS 我的 NSURLConnection 周围没有用于处理身份验证挑战的代码。

ssl nsurlconnection ios ios7

5
推荐指数
1
解决办法
7322
查看次数