微信企业号用户 UserId 安全问题

2016-08-15 21:36:17 +08:00
 liky88

关于微信企业号 UserId 在通过 oauth2 接口返回后,存储在 cookie 以后(例如: user_id: your_user_id) 问题:这样直接明文形式存储在 cookie 里面,这样安全么?

之后如果通过 URL 参数来请求数据,安全么?例如: localhost:8080/wechat?userId=xxxx

这样会不会在请求的时候被其他人给获取到?

7977 次点击
所在节点    问与答
13 条回复
abelyao
2016-08-15 21:54:40 +08:00
你为啥要直接存 UserID 到 cookie 中?不是应该把 SessionID 存到 cookie 中吗,至于 session 是什么内容就是服务端的事了
liky88
2016-08-15 21:57:11 +08:00
@abelyao

微信企业号就是这么建议的啊。从微信企业号 oauth2 返回的就是 user_id.
***************
通过此接口获取成员身份会有一定的时间开销。对于频繁获取成员身份的场景,建议采用如下方案:

1 、企业应用中的 URL 链接直接填写企业自己的页面地址

2 、成员跳转到企业页面时,企业校验是否有代表成员身份的 cookie ,此 cookie 由企业生成

3 、如果没有获取到 cookie ,重定向到 OAuth 验证链接,获取成员身份后,由企业生成代表成员身份的 cookie

4 、根据 cookie 获取成员身份,进入相应的页面
****************
zhouxuchen
2016-08-15 22:06:37 +08:00
接口做一个签名验证机制吧
liky88
2016-08-15 22:14:31 +08:00
@zhouxuchen

可否详说?
我原来想的是对 UserId 做加密处理,客户端收到服务端返回来的加密好的 UserId 以后,然后之后的请求,客户端把加密好的字段发送给后端,进行解密处理
zhouxuchen
2016-08-15 22:25:38 +08:00
@liky88 把所有请求按照 key 排序,拼接成一个字符串,带一个 secret key 使用 md5 加密成一个签名,请求的时候也带上。后端同样处理,签名相同就继续操作,否则返回签名错误。
abelyao
2016-08-15 22:27:19 +08:00
@liky88 唉… 难道你会在普通的网站开发中,把用户的登录帐号和密码存到 cookie 吗?
willerce
2016-08-15 22:43:59 +08:00
1. 正常情况下只有同域可以获取 cookie
2. 担心请求被拦截抓包请上 HTTPS
neosfung
2016-08-15 22:45:29 +08:00
我记得微信的实现里,同一个用户,在不同的公众号里,对应的 user_id 是不一样的。也就是说,哪怕别人知道这个 user_id ,但是没有你的公众号的 app secret ,也没办法获得用户的信息。
bdbai
2016-08-15 23:03:44 +08:00
@willerce HTTPS 也防不了抓包
liky88
2016-08-15 23:21:28 +08:00
@neosfung 就怕企业用户之间获取到对方的 user_id ,然后获取到对方的信息
terence4444
2016-08-15 23:23:31 +08:00
理论上微信有一个判断消息 IP 来源是不是微信服务器的功能,但是 IP 库更新滞后严重…
wujichao
2016-08-16 09:14:09 +08:00
lz 可以参考下我毕业论文里的流程 完整的代码在这里 https://github.com/wujichao/wencheng/
##微信用户认证流程介绍
用户认证和路由都是在前端做的, 参考[react-router/examples/auth-with-shared-root]( https://github.com/reactjs/react-router/tree/master/examples/auth-with-shared-root)实现.
微信消息的用户认证比较简单, 直接使用 message 里面的 openid 即可.
而微信内 web 页用户认证比较复杂, 当用户点进去我们的 web 页, 我们怎么知道是哪一个用户点进去的?

- 比较简单的方法是给页面 url 加上一个参数`?openid=123456`, 然后通过 openid 来区分用户. [广科小喵]( https://github.com/paicha/gxgk-wechat-server)就是这样做的. 缺点一个是安全性不好, openid 不能泄露. 另一个就是用户点击自定义菜单, 不能直接进入页面, 因为没有 openid 参数啊, 需要返回一个有 openid 参数的 url 链接让用户主动点击.

- 标准的做法是利用微信的 OAuth 流程, 先跳转到微信的 OAuth 页, 然后带着一个 code 参数跳转回来, 然后用这个 code 参数值去拿 openid, [文档]( http://mp.weixin.qq.com/wiki/4/9ac2e7b1f1d22e9e57260f6553822520.html), 然后用 openid 去用户绑定表拿到 user 信息, 最后存在 session 里.

我们使用标准的做法, 同时我们还期望这些 web 页脱离微信也可以正常登陆使用. 具体流程如下图.
![流程图]( https://raw.github.com/wujichao/wencheng/master/screenshots/auth_flow.png)
cz5424
2017-11-21 10:31:45 +08:00
@wujichao OAuth 流程之后,分享课表又麻烦了起来,菜单点击的话,就算用?openid=123456 也可以做到点击跳转到自己的,用混合 oauth 和 openid 作为参数的方法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/299502

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX