一、环境:

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 的要求,就不赘述了。

  1. function _3rd_session($len)
  2. {
  3. $fp = @fopen('/dev/urandom', 'rb');
  4. $result = '';
  5. if ($fp !== FALSE) {
  6. $result .= @fread($fp, $len);
  7. @fclose($fp);
  8. } else {
  9. trigger_error('Can not open /dev/urandom.');
  10. }
  11. // convert from binary to string
  12. $result = base64_encode($result);
  13. // remove none url chars
  14. $result = strtr($result, '+/', '-_');
  15. return substr($result, 0, $len);
  16. }
  17. 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 文件(必须两者同时存在),可以用下面方法生成这两个文件:

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

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

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

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

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

  1. service php-fpm restart

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

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

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

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

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

  1. 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. 使用FlashWavRecorder实现浏览器录制wav音频和上传音频文件,兼容IE8以上浏览器

    前言:本项目基于github开源插件实现,该插件使用flash实现,兼容IE8以上浏览器 感谢michalstocki的分享该项目,github项目地址:https://github.com/mich ...

  2. Python的核心数据结构

    数据结构 例子 数字 1234,3.1415,3+4j 字符串 'spam'."grace's" 列表 [1,[2,'three'],4] 字典 {'food':'spam','t ...

  3. 提高java编程质量 - (五)switch语句break不能忘以及default不同位置的用法

    先看一段代码: public class Test{ public static void main(String[] args){ System.)); } } public static Stri ...

  4. [BZOJ4907]柠檬

    4709: [Jsoi2011]柠檬 Time Limit: 10 Sec  Memory Limit: 128 MB Description Flute 很喜欢柠檬.它准备了一串用树枝串起来的贝壳, ...

  5. php调用java

    PHP调用JAVA方式 1.     背景 在开发招商银行信用卡分期付款功能过程中,在支付成功之后需要对银行的返回数据进行签名验证,因签名加密方式招商银行是不提供的,只提供了相应的JAVA验证类测试例 ...

  6. grid表格选择模式

    selModel: { // type: 'checkboxmodel', type: 'cellmodel', // mode: 'SIMPLE', mode: 'SINGLE', checkOnl ...

  7. php访问数据库$result=$mysql_qurey('')判断是否是空值

    在访问数据库后得到result值,前提是$relust为true,就是没有发生错误连接情况,但是查询的条件由于不满足导致返回值为空,此时判断就不能用!来决定是否有返回数据了,经过书籍搜索,用resul ...

  8. Nginx下支持ThinkPHP的Pathinfo和URl Rewrite模式

    下面介绍如何使Nginx支持ThinkPHP的Pathinfo和URL Rewrite模式. 1.ThinkPHP给出了ThinkPHP的官方解决方案,如下: 打开Nginx的配置文件 /etc/ng ...

  9. Tomcat7的热部署

    所谓热部署就是在tomcat不停机的情况下,将新的war包放上去,达到服务不中断,用户无察觉的目的,实现的原理很简单,这里做下记录,以便后期查看. 1.1 安装tomcat7 略 1.2 在tomca ...

  10. 常用html标签的只读写法

    <a href="baidu.com" onclick="event.returnValue=false;">百度</a> a链接的只读 ...