一、环境:

CentOS 6.8

nginx 1.8.0

php 7.0.10

二、背景

最近在开发一个微信小程序,不可避免的涉及到登陆的环节,登录时序图如下:

通过 wx.login() 获取到用户登录态之后,需要维护登录态。开发者要注意不应该直接把 session_key、openid 等字段作为用户的标识或者 session 的标识,而应该自己派发一个session 登录态

—— 微信官方文档(https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html#wxchecksessionobject)

所以,我们要给服务器上的 session 登录态设定一个 key 值,key 值就是本文说的 3rd_session

三、正文

下面就是生成 3rd_session 的方法了,具体代码的解释可以看注释和上文的登录时序图对 3rd_session 的要求,就不赘述了。

    function _3rd_session($len)
{ $fp = @fopen('/dev/urandom', 'rb'); $result = ''; if ($fp !== FALSE) { $result .= @fread($fp, $len); @fclose($fp); } else { trigger_error('Can not open /dev/urandom.'); } // convert from binary to string $result = base64_encode($result); // remove none url chars $result = strtr($result, '+/', '-_'); return substr($result, 0, $len); } echo _3rd_session(16);

四、遇到的问题

1、@fopen('/dev/urandom', 'rb') 的时候,报错 "Can not open /dev/urandom"

说明 fopen('/dev/urandom', 'rb') 没有成功打开文件,一般有三种原因:

1、路径不对

2、文件不存在

3、没有权限

1/2、路径不对 /文件不存在

如果 /dev/ 里没有 urandomrandom 文件(必须两者同时存在),可以用下面方法生成这两个文件:

 mknod -m 644 /dev/random c 1 8
mknod -m 644 /dev/urandom c 1 9
chown root:root /dev/random /dev/urandom
3、没有权限

如果有这两个文件存在,且你的接口所在项目的权限也没问题的时候,可能是 php 的访问权限造成的:

open_basedir 是 控制 php 访问路径权限的属性。

我查看了我的 php.ini,果然没有包含 /dev/

于是我修改了 php.iniopen_basedir 值,并重启了 php:

service php-fpm restart

再次打开 php.ini,哪尼? open_basedir 的值根本没变。

原来,是 nginx 的设置插了一脚。

在 nginx 的 nginx.conf 中的某个 server 中:

       location ~ \.php($|/) {
fastcgi_pass unix:/dev/shm/php-cgi.sock;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PHP_VALUE "open_basedir=$document_root:/tmp/";
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

把倒数第三行中的 open_basedir 添加上 /dev/ 路径,即为:

fastcgi_param  PHP_VALUE  "open_basedir=$document_root:/tmp/:/dev/";

完美。

五、知识点

(1)为什么在 '/dev/urandom' 里取随机数?

微信的官方文档推荐用这种操作系统提供真正随机数的方法。而不是

srand(当前时间) 然后 rand() 的方法。

(2)'/dev/urandom' 是真的随机数?

其实绝对随机的随机数只是一种理想的随机数,即使计算机怎样发展,它也不会产生一串绝对随机的随机数。

但是 '/dev/urandom' 和 '/dev/random' 已经算是很接近真随机数的随机数了。

他们的原理是,数据通常来自于设备驱动程序。例如,键盘驱动程序收集两个按键之间时间的信息,然后将这个环境噪声填入随机数发生器库。

linux 内核维护了一个熵池用来收集来自设备驱动程序和其它来源的环境噪音,它在每次有新数据进入时进行“搅拌” 。使得更随机。

(3)'/dev/random' 和 '/dev/urandom' 有什么区别?

因为熵池中返回的随机数依赖于外部,'/dev/random' 往往被取出过快导致熵池里没有剩余可用的随机数。

但是 '/dev/urandom' 仍可以从熵池的 MD5 散列中获得非常好的随机数,所以为了程序的健壮性,推荐使用 '/dev/urandom'。

但是 '/dev/random' 会比 '/dev/urandom' 安全,因为后者依赖MD5,会存在被破译的风险。

微信小程序 服务器端生成用户登陆环节的 3rd_session的更多相关文章

  1. 微信小程序动态生成保存二维码

    起源:最近小程序需要涉及到一些推广方面的功能,所以要写一个动态生成二维码用户进行下载分享,写完之后受益良多,特此来分享一下: 一.微信小程序动态生成保存二维码 wxml: <view class ...

  2. 微信小程序一键生成源码 在线制作定制功能强大的微信小程序

    微信小程序发展到现在,短短的一年不到的时间(很快就要迎来微信小程序周年庆),在快迎来周年庆之际,百牛信息技术bainiu.ltd特记录一下这个发展的历程,用于将来见证小程序发展的辉煌时刻,我们还能知道 ...

  3. 微信小程序canvas生成并保存图片

    ---恢复内容开始--- 微信小程序canvas生成并保存图片,具体实现效果如下图     实现效果需要做以下几步工作 一.先获取用户屏幕大小,然后才能根据屏幕大小来定义canvas的大小 二.获取图 ...

  4. 【微信小程序】获取用户地理位置权限,二次请求授权,逆解析获取地址

    摘要:微信小程序内获取用户地理位置信息授权,被拒绝后二次获取,获取权限后逆解析得到用户所在省市区等.. 场景:商城类小程序,在首页时需展示附近门店,即用户刚进入小程序时就需要获取到用户位置信息 ste ...

  5. 【小程序+thinkphp5】 用户登陆,返回第三方session3rd

    服务器环境: centos7   php7.0 准备工作: 注册小程序,并获取 appid .appsecret 下载微信解密算法sdk : https://mp.weixin.qq.com/debu ...

  6. 微信小程序授权 获取用户的openid和session_key【后端使用java语言编写】,我写的是get方式,目的是测试能否获取到微信服务器中的数据,后期我会写上post请求方式。

    在这里给大家分享下我的心得,1.写代码前一定要对整个流程有个了解.我就是因为在先不了解整个过程中去ctrl+c+v他人的博客代码,花费很多无用的时间去处理还不知道能不能跑的起来的代码. 2.本人比较喜 ...

  7. [重要更新]微信小程序登录、用户信息相关接口调整:使用 wx.getUserProfile 取代 wx.getUserInfo

    2021年2月24日,微信官方团队发布了一个调整通知:<小程序登录.用户信息相关接口调整说明>,公告明确从4月13日起,所有发布的小程序将无法使用 wx.getUserInfo 接口(JS ...

  8. 微信小程序常见两种登陆注册方式(一)

    普通登录注册以及用户授权登陆 普通登陆注册 概述 此功能的实现简单的借助了微信小程序的云开发,具体在哪里使用,我会标出来.对于用户名.账号.密码都做了简单的校验.主要练手功能的实现,样式只做了简单的编 ...

  9. 微信小程序授权获取用户详细信息openid

    小程序获取用户的头像昵称openid之类 第一种使用wx.getUserInfo直接获取微信头像,昵称 wx.getUserInfo({ success: function (res) { that. ...

随机推荐

  1. JAVA设计模式初探之装饰者模式

    定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种 ...

  2. pb传输优化浅谈

    在正式切入今天要谈的优化之前,先碎碎念一些自己过去这几年的经历.很久没有登录过博客园了,今天也是偶然兴起打开上来看一下,翻看了下自己的随笔,最后一篇原创文章发布时间是2015年的4月,今天是2017年 ...

  3. 利用Excel做一些简单的数据分析

    先来几个原始数据的截图,如下所示: 示例图就举一个吧,因为这些数据量还挺大的,大概的总结了一下,这下列这几栏中不合规范的数据占比很大: (1)民族(经分析,在此表中所涉及到的民族分别为:汉族,满族,蒙 ...

  4. Git添加远程报错:remote origin already exists.

    在本地创建了一个Git仓库,如何在Github创建一个Git仓库,并且让这两个仓库进行远程同步,这样Github上的仓库既可以作为备份仓库,还可以通过该仓库进行多人协作. 1.登录github,建立一 ...

  5. MySql数据库基础操作——数据库、用户的创建,表的制作、修改等

    MySql 是一款使用便捷.轻量级的数据库.因为他体积小.速度快.安装使用简单.开源等优点,目前是使用最广泛的数据库.目前位于Oracle甲骨文公司旗下.那今天我们就来介绍一下数据库的基本操作.具体介 ...

  6. Bash的命令替换

    命令替换:将命令替换为命令的输出,所有的shell支持使用反引号的方法进行命令替换.Bash支持两种形式:$(command) 和`command`命令替换是可以嵌套的,如果使用反引号的形式,在内部反 ...

  7. 如何用phpcms将静态网页生成动态网页?

    在前两篇随笔中已经简单介绍了phpcms,那么现在让我们来看一下如何用phpcms将静态网页生成动态网页? 1.在templates文件夹下新建模板文件夹ceshi(名字可以自己随笔起) 2.在ces ...

  8. C++之const限定符

    作者:tongqingliu 转载请注明出处: C++之const限定符 const初始化 const的特点: 用const加以限定的变量,无法改变. 由于const对象定义之后就无法改变,所以必须对 ...

  9. 记一次使用搬瓦工VPS的经历

    自己因为有需求上Google,以前是通过修改hosts的方法实现访问Google,但是最近不知道为什么改hosts后还是无法访问Google,于是决定搭建VPS来实现科学上网,看了一下价格,作为穷逼学 ...

  10. ES6的开发环境搭建

    在搭建es6开发环境之前,先简单介绍一下es6. ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在2015年6月正式发布了.它的目标,是使得 Java ...