现在我们有一个很现实的问题,小程序的数据存储必须通过你自己服务器的HTTPS的接口存储到你自己的服务器(基于HTTPS的第三方服务器API,下面统称第三方接口)上面,但是小程序不支持cookie,这就意味着服务器不能识别每一个客户端,SESSION也随之失效。
也就是说,用户登陆小程序通过第三方接口将资料提交之后,即使第三方接口在服务器端配置了SESSION,也是没有用的,因为服务器的SESSION是通过用户提交的时候头部(header)携带的PHPSESSID来区分用户的,而PHPSESSID是存储在cookie里面的。
小程序不支持cookie,就必须找一个途径来解决这个问题。官方API文档给出了一个说明,通过第三方接口将sessionid(PHPSESSID)传给小程序客户端(一般会包含在header里面的Set-Cookie里面),然后使用wx.setStorageSync()存储到本地,然后每次发起请求(wx.request)的时候,将这个sessionid,放在header的Cookie里面提交给第三方接口。
Laravel的实现
在Laravel中,抛弃了PHP原生的SESSION,也就没有PHPSESSID,不过取而代之Laravel使用了一个等同的变量laravel_session。
所以当你在小程序登陆后,使用wx.request请求第三方接口让第三方服务器获取登陆登陆状态之后,第三方接口在返回的Response Header里面会有一个Set-Cookie值,里面包含了laravel_session,你可以使用正则表达获取(res.header["Set-Cookie"].match(/laravel_session=(.*?);/)[1])到laravel_session然后存储到本地。然后在以后的每次wx.request请求里面都添加header,携带参数laravel_session="你存储的值"。
这样就解决了小程序使用第三方接口的登陆问题。
有人说,同一个session的路由要放在同一个路由group里面:
Route::group(['middleware' => ['web']], function(){
Route::any('login', 'LoginController@login');
Route::get('account/info', 'AccountController@info');
});
我是用的是Laravel 5.4,好像没有这个问题。
如果还有疑问可以 联系我
您的赞助将会支持作者创作及本站运维
评论
共3条如果不使用session呢?
在获取到openid、session_key后,openid保存到数据库,session_key保存到的redis,生成的session也保存到redis,用户每次操作,就延长session、session_key的有效期
这种方式可行吗?感觉太简单,而且很不laravel
直接用微信的session_key,感觉也是一种不错的思路
谢谢楼主,laravel 后端几乎不需要做什么,前端自己构造cookie就行了
发表评论