摘要:微信提供了作为识别用户身份的凭证,可以结合设计一套用户身份权限认证机制。认证免疫跨站请求伪造,而认证则存在遭受的可能性。此处的是引导用户进入授权页面后微信服务器附加上去的,详细方法见微信公众平台的微信授权网页文档。
项目背景
最近在开发一个微信公众号商城,在调用下单、支付、查询订单等等接口时,需要验证用户的身份。微信提供了openid作为识别用户身份的凭证,可以结合openid设计一套用户身份权限认证机制。考虑到安全性和易实现程度,备选的方案有Session认证机制和Token认证机制,本文在比较了两者的特点后选择了Token认证机制,然后详细阐述了如何实现Token认证机制。
接口设计在寻找合适的认证方式之前,先说明一下项目前后端的设计。项目的前后端是分离的,前端使用AJAX的方式向后端请求操作资源(增、删、改);后端接口设计遵循RESTful API原则,结果以JSON格式返回。
身份认证备选方案 Session认证在web网站中,session可以将访客状态记录在服务器中,并分配一个唯一的session id给访客,并将该id附加在headers中返回给客户端。客户端接收到session id后,会将id存储在cookie,之后客户端每次访问服务器,传送的cookie中都会携带session id,服务器以此来识别访客的身份。
token认证方式中客户端和服务器的交互过程与session的类似,客户端向服务端请求token,拿到token后,客户端可以在之后的请求中将token附加在header,以验证用户的身份和权限。
【此处应该列举诸多不同,但是一定要提到为什么token更适合,而不是session】
token认证更灵活。对于session认证,客户端每次发送求情都会发送cookie;而对于token认证,可以在需要身份验证的场景下才发送token。
token允许多域名认证。cookie是绑定单域名的,在a域名生成的cookie无法用于b域名,所以session id无法作为不同域名的共同认证id。而token认证则不受限制,token可以附加在任何请求上。
在客户端的存储方式不同。session自动存储在cookie,而token则需要定义存储的方式。token通常可以存储在localStorage(永久存储,浏览器关闭时不清除token)、sessionStorage(浏览器关闭时token会被清除)、cookie。值得一提的是,即使将token存储在cookie,也可以免疫CSRF,因为cookie中的token并不用于认证。
CSRF(跨站请求伪造)。认证免疫CSRF(跨站请求伪造),而session认证则存在遭受CSRF的可能性。
跨站脚本攻击(XSS)。相对于session认证,token认证更容易遭受跨站脚本攻击(XSS)。
本项目考虑到Token认证机制更灵活,例如token可以控制是否附加在请求、token本身可以进行自定义加密、可以将token存储在cookie以外的地方,所以选定Token认证机制作为商城应用的用户身份权限认证机制。
获取token的流程客户端向服务端token接口提交code,请求获取token。此处的code是引导用户进入授权页面后微信服务器附加上去的,详细方法见微信公众平台的微信授权网页文档。
服务端通过code向微信公众平台换取用户的openid。微信授权网页有两种授权scope,本项目只需要用户的openid,不需要用户更多的信息,所以将scope设为snsapi_base。
微信公众平台向服务端返回了openid等等信息。
服务端生成token,将token和用户信息以键值对的形式存储后,服务端返回token给客户端。
存储token及用户信息的流程服务端获取用户的openid后,在数据库中登记用户的信息,并取出用户的id。
服务端以token为key,以openid、user id、权限信息等为value,将该键值对存入缓存中。在存入缓存时,注意设置缓存有效时间,过长的有效期存在安全隐患,对于本项目,用户办理业务后短时间内不会再访问,所以将token的有效期设置为2小时。
调用接口时的token认证流程客户端将token附加在header,向业务接口发送请求。
业务接口在执行业务逻辑前,凭token验证用户的身份。分别验证以下三点:
token的合法性(有记录)
token的有效性(没过期)
Token对应的用户权限Auth
总结 Token机制的特点使用灵活,可以选择性认证。
可以多个域名使用同一token认证体系。
在客户端的存储灵活,除了存储在cookie,还可以选择localStorage、sessionStorage。
免疫CSRF(跨站请求伪造)。
Token认证机制的三个流程获取Token的流程。
存储Token及身份权限信息的流程。
调用接口时的Token认证流程。特别注意需要验证token的合法性、时效性、关联的用户权限。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/28329.html
摘要:本文是浅析微信支付系列文章的第三篇,主要会讲一下在开发前的一些注意事项。浅析微信支付系列已经更新两篇了哟,没有看过的朋友们可以看一下。开通微信支付需要注册登陆微信商户平台,微信支付相关的信息都需要在这个平台上进行操作。 本文是【浅析微信支付】系列文章的第三篇,主要会讲一下在开发前的一些注意事项。 浅析微信支付系列已经更新两篇了哟~,没有看过的朋友们可以看一下。 浅析微信支付:前篇大纲...
摘要:时间年月日星期六说明本文部分内容均来自慕课网。第六章公众号与开发平台关联公众号与开放平台关联情景说明当使用端进行微信授权登录时,得到的和公众号授权登录时得到的不一样。 时间:2017年08月12日星期六说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:无学习源码:https://github.com/zccodere/s... 第一章:课程介绍...
摘要:自建网站对接微信公众号微信公众号技术平常我们有些写各种网站个人博客系统物流管理系统通信录管理系统校园二手网站我们都知道只需要租用一个服务器再配置一个备案好的域名就可以在浏览器上进行访问了不知大家不知大家有没有想过将你搭的网站对接微信公众 title: 自建网站对接微信公众号date: 2018-04-12 15:25tags: 微信公众号, PHP codeigniter cat...
阅读 973·2023-04-25 19:35
阅读 2484·2021-11-22 09:34
阅读 3634·2021-10-09 09:44
阅读 1668·2021-09-22 15:25
阅读 2915·2019-08-29 14:00
阅读 3349·2019-08-29 11:01
阅读 2574·2019-08-26 13:26
阅读 1717·2019-08-23 18:08