关于session的使用限制以及解决方案的说明

特别声明:
本文档中的问题描述和解决方案对OAuth1.0及OAuth2.0下的代码开发都有效。

目录

1. 背景说明

在OAuth认证过程以及OpenAPI调用过程中,多次会用到appid,appkey,acess token等参数,需要把这些值存储起来。开发人员很容易想到用session来存储。
但是在正式网站运营环境中,我们并不建议使用session而是使用MySQL或者其他永久的存储来保存信息,以避免网站不止一台服务器的情况下,两次请求的sessoin信息可能不会保存在同一台服务器导致的访问出错等情况。

2. 使用session带来的问题

2.1 网站存在多个子域名的情况下如何共享session

默认情况下,子域名之间的session信息是不允许共享的。因此如果网站存在多个子域名,则有可能引发如下情况:
在登录过程用到了www.a.com,而在回调地址用到了www.i.a.com,由于session信息不能在两个子域名之间共享,导致用户访问回调地址出错。

2.2 同一个主域名不同服务器之间如何共享session

当网站服务器超过1台的时候,就出现了如何在不同服务器之间共享session信息的问题。

3. 解决方案

要解决如上问题,必须引入一个中间存储。数据库是一个非常合适的选择。

4. 示例代码

4.1 For OAuth2.0

我们暂时没有在OAuth2.0的SDK中给出该解决方案的示例代码,但是开发者仍然可以参考下面的OAuth1.0 SDK的示例代码。

4.2 For OAuth1.0

在PHP SDK中,我们在comm文件夹下建立了config.php文件,将appid,appkey,callback等信息存储在全局变量session中。

我们在PHP SDK V1.3版本中增加了session.php,以解决上述使用session带来的2个问题。

请开发者从SDK下载_OAuth1.0页面下载Beta V1.3 及以上版本的PHP SDK。


Tips:

使用前开发者需要对comm/php.session文件进行必要的修改。修改说明如下:

修改点1: 创建数据库表

以MySQL为例:

CREATE TABLE `tbl_session` 
(
    `session_id` varchar(255) binary NOT NULL default ,
    `session_expires` int(10) unsigned NOT NULL default '0',
    `session_data` text,
     PRIMARY KEY  (`session_id`)
) ENGINE=MyISAM;

修改点2: 指定Session中数据库相关的变量值

class Session 
{
   //mysql的主机地址,需要第三方指定ip地址 
   const db_host = "dbhost"; 
   //数据库用户名,需要第三方指定自己的用户名
   const db_user = "dbuser";   
   //数据库密码,需要第三方指定自己的库据库密码
   const db_pwd = "dbpwd"; 
   //数据库,需要第三方指定数据库
   const db_name = "dbname";      
   //数据库表,需要第三方指定数据表
   const db_table = "dbtable"; 
  
   ....//此处省去session打开,关闭,读取,写入,销毁,垃圾回收等逻辑。具体实现过程见SDK中的代码示例。
}

修改点3: 定义MAIN_DOMAIN常量

//".domain.com"是你网站的主域名,例如".qq.com"

define("MAIN_DOMAIN", ".domain.com");

修改点4: 开启“不同子域名下共享session信息”

//请将下面false改为true
define("COOKIE_DOMAIN", false); 
if (defined("COOKIE_DOMAIN") && COOKIE_DOMAIN)
{   
    //开启前需提前定义MAIN_DOMAIN常量,以设置主域名
    if (defined("MAIN_DOMAIN"))
        @ini_set("session.cookie_domain", MAIN_DOMAIN);
}

修改点5: 开启“同一个主域名不同服务器之间共享session信息”

//请将下面false改为true
define("USER_SESSION", false);
if (defined("USER_SESSION") && USER_SESSION)
{
   @ini_set("session.save_handler", "user");
   $session = new Session;
   @session_module_name("user");
   @session_set_save_handler(
       array(&$session, "open"),
       array(&$session, "close"),
       array(&$session, "read"),
       array(&$session, "write"),
       array(&$session, "destroy"),
       array(&$session, "gc"));
}




以上信息是否解决您的问题?

Copyright © 1998 - 2019 Tencent. All Rights Reserved.

腾讯公司 版权所有

有问必答 返回顶部