【问题标题】:Problem with Zend Oauth and writing Access Token in mySQL databaseZend Oauth 和在 mySQL 数据库中写入访问令牌的问题
【发布时间】:2010-08-27 08:21:44
【问题描述】:

我使用 Zend Oauth 将我的应用程序连接到 Twitter,如下所述: http://framework.zend.com/manual/en/zend.oauth.introduction.html

它可以完美地保存 Twitter 请求令牌和 Twitter 像这样使用序列化和反序列化的会话中的访问令牌 (略):

1: $consumer = new Zend_Oauth_Consumer($config);
2: $token = $consumer->getRequestToken();
3: $_SESSION['TWITTER_REQUEST_TOKEN'] = serialize($token); //write Request Token

...和...

4: $consumer = new Zend_Oauth_Consumer($config);
5: $token = $consumer->getAccessToken($_GET,
unserialize($_SESSION['TWITTER_REQUEST_TOKEN']));
6: $_SESSION['TWITTER_ACCESS_TOKEN'] = serialize($token); //write Access Token

...和...

7: $token = unserialize($_SESSION['TWITTER_ACCESS_TOKEN']);
8: $client = $token->getHttpClient($configuration);

现在我想在第 6 行之后将访问令牌保存在我的 mySQL 数据库中。 问题是,只要我这样做,数据库中的条目就会包含 像这样的奇怪字符:

O:23:"Zend_Oauth_Token_Access"?:{s:10:"�*�_params";a:4:{s:11:"oauth_token";s:50:"64658798-xOvsSyC83P2lhZRVvvaQLQddaifKO2qmN2KL91eaI";s:18:"oauth_token_secret";s:42:"R4nBLeWhNRXleKsN6H3crubYd2FEmfHFRtLbEh8gos";s:7:"user_id";s:8:"64658798";s:11:"screen_name";s:13:"MyTwitterAccount";}}

这会导致第 7 行中的通知(280 字节的偏移 30 处出错) 第 8 行出现致命错误,因为 $token 是非对象。 所以我试图找出错误并已经将问题发布在 Zend 论坛,但没有人可以帮助我... 我最好的猜测是这是一个编码错误。数据库和我所有的 文档在 utf-8 中正确编码,但我从来没有 以前有这样的问题... 第 3 行中的 var_dump($token) 告诉我已经有密码 那里的字符。摘录如下:

"Accept-Encoding" ["Content-encoding"]=>  string(4) "gzip" ["Content-length"]=>  string(3) "146" ["Connection"]=>  string(5) "close" } ["body":protected]=>  string(146) "�������E˹� ��п��J;80���4(,9��� ��.M��ؖ�"K���H���Q��a|;W����d2��.�׸Je�-���-y.���3��〺  object(Zend_Oauth_Http_Utility)#89 (0)

内容编码 gzip 有问题吗?或者是问题引起的 Zend 和 getRequestToken() 方法? 非常感谢任何帮助。 在此先感谢

【问题讨论】:

  • 我遇到了同样的问题。你最后解决了吗?

标签: database zend-framework twitter oauth token


【解决方案1】:

取自 php.net 关于序列化的帮助

在序列化受保护和私有变量时添加有线字符,它是一个空字节

如果将要存储到 postgresql 数据库中的对象序列化,则为私有和受保护成员注入的“空字节”会给系统带来麻烦。甚至 pg_escape_bytea() 在值上,并将值存储为二进制类型在某些情况下也会失败。

对于一个肮脏的工作:

$serialized_object = 序列化($my_object); $safe_object = str_replace("\0", "~~NULL_BYTE~~", $serialized_object);

?>

这也允许您以可读的文本格式存储对象。回读数据时:

$serialized_object = str_replace("~~NULL_BYTE~~", "\0", $safe_object); $my_object = unserialize($serialized_object);

?>

使用此方法的唯一问题是,如果您的对象成员名称或值可能以某种方式包含奇怪的“~~NULL_BYTE~~”字符串。如果是这种情况,则将 str_replace() 转换为一个字符串,保证您在 serialize() 返回的字符串中没有任何其他位置。 还要记得在调用 unserialize() 之前定义类。

如果您将会话数据存储到 postgresql 数据库中,那么这种解决方法是绝对必须的,因为传递给会话写入函数的 $data 已经序列化。

【讨论】:

    猜你喜欢
    • 2011-05-24
    • 2011-03-26
    • 1970-01-01
    • 2014-12-14
    • 2012-03-27
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 2019-07-23
    相关资源
    最近更新 更多