微信小程序 服务器端生成用户登陆环节的 3rd_session
一、环境:
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/ 里没有 urandom 和 random 文件(必须两者同时存在),可以用下面方法生成这两个文件:
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.ini 的 open_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的更多相关文章
- 微信小程序动态生成保存二维码
起源:最近小程序需要涉及到一些推广方面的功能,所以要写一个动态生成二维码用户进行下载分享,写完之后受益良多,特此来分享一下: 一.微信小程序动态生成保存二维码 wxml: <view class ...
- 微信小程序一键生成源码 在线制作定制功能强大的微信小程序
微信小程序发展到现在,短短的一年不到的时间(很快就要迎来微信小程序周年庆),在快迎来周年庆之际,百牛信息技术bainiu.ltd特记录一下这个发展的历程,用于将来见证小程序发展的辉煌时刻,我们还能知道 ...
- 微信小程序canvas生成并保存图片
---恢复内容开始--- 微信小程序canvas生成并保存图片,具体实现效果如下图 实现效果需要做以下几步工作 一.先获取用户屏幕大小,然后才能根据屏幕大小来定义canvas的大小 二.获取图 ...
- 【微信小程序】获取用户地理位置权限,二次请求授权,逆解析获取地址
摘要:微信小程序内获取用户地理位置信息授权,被拒绝后二次获取,获取权限后逆解析得到用户所在省市区等.. 场景:商城类小程序,在首页时需展示附近门店,即用户刚进入小程序时就需要获取到用户位置信息 ste ...
- 【小程序+thinkphp5】 用户登陆,返回第三方session3rd
服务器环境: centos7 php7.0 准备工作: 注册小程序,并获取 appid .appsecret 下载微信解密算法sdk : https://mp.weixin.qq.com/debu ...
- 微信小程序授权 获取用户的openid和session_key【后端使用java语言编写】,我写的是get方式,目的是测试能否获取到微信服务器中的数据,后期我会写上post请求方式。
在这里给大家分享下我的心得,1.写代码前一定要对整个流程有个了解.我就是因为在先不了解整个过程中去ctrl+c+v他人的博客代码,花费很多无用的时间去处理还不知道能不能跑的起来的代码. 2.本人比较喜 ...
- [重要更新]微信小程序登录、用户信息相关接口调整:使用 wx.getUserProfile 取代 wx.getUserInfo
2021年2月24日,微信官方团队发布了一个调整通知:<小程序登录.用户信息相关接口调整说明>,公告明确从4月13日起,所有发布的小程序将无法使用 wx.getUserInfo 接口(JS ...
- 微信小程序常见两种登陆注册方式(一)
普通登录注册以及用户授权登陆 普通登陆注册 概述 此功能的实现简单的借助了微信小程序的云开发,具体在哪里使用,我会标出来.对于用户名.账号.密码都做了简单的校验.主要练手功能的实现,样式只做了简单的编 ...
- 微信小程序授权获取用户详细信息openid
小程序获取用户的头像昵称openid之类 第一种使用wx.getUserInfo直接获取微信头像,昵称 wx.getUserInfo({ success: function (res) { that. ...
随机推荐
- JavaScript中for循环的使用详解
or循环是循环最紧凑的形式,并包含有以下三个重要部分组成: 循环初始化计数器的初始值.初始化语句执行循环开始之前. 测试语句,将测试如果给定的条件是真还是假.如果条件为真,那么将要执行的循环中给定的代 ...
- iOS的内存分析和内存管理
iOS的内存分析和内存管理 [内存管理]一直是iOS开发中的一个重点. 本文就带你从内存分析开始一步步了解内存的占用情况,从真实的情况中领悟真正项目开发过程中的内存的使用情况. 注:本文默认你熟悉 M ...
- ThinkPHP3.2 生成二维码
下面是整合将phpqrcode整合到TP生成二维码就可以解决这个问题了.其实也很简单,使用方法如下:先下载附件解压至ThinkPHP/Extend/Vendor目录,目录不存在自己创建. v ...
- C# 模拟浏览器请求
public string getHtml(string Url, string type = "UTF-8") { try ...
- js传宗接代---继承
前几天重温了一下js的继承,今天分享给大家: 一,类式继承. 所谓的类式继承就是:第二个类的原型prototype被赋予了第一个类的实例,如subcals.prototype=new supercls ...
- Visual Studio 2017 for Mac 体验之Android.Form
微软官方说明: Visual Studio 2017 for Mac Last Update: 2017/6/16 我们非常荣幸地宣布 Visual Studio 2017 for Mac 现已推出. ...
- 【LeetCode】66. Plus One
题目: Given a non-negative number represented as an array of digits, plus one to the number. The digit ...
- JavaScript函数部分
函数部分学习:+parseInt(): -parseInt()函数将其收到的任何输入值(通常是字符串)转换成整数类型输出,如果转换失败就返回NaN. -parseInt(“参数”,第二参数基数):没有 ...
- 14.如何解决使用webpack打包之后,font-awsome路径不对的问题,终极解决方法
问题描述: 使用webpack打包vue项目,使用font-awsome字体,发现打包之后,font-awsome图标不显示,报错为路径不对 看了下打包的路径,的确路径不对,打包之后font-awso ...
- Vim练级笔记(持续更新)
漫漫练级路...作为一个VS重度依赖患者,又加上visual assist X 这种懒人必备的神级插件,转投vim门下,真是各种疼... vim用着用着就有拿鼠标去点的冲动,有木有啊! 不过经过一段时 ...