前后端是怎么验证身份的?

2018-01-25 07:56:58 +08:00
 ericgui

我前几天看了一个写 RESTful API 的教程

前端用 React 后端用 Express JS 和 MongoDB

后端写了几个 API,然后前端是一个单页应用( SPA ),用 fetch 来请求 api,获取数据。

看着相当好。

后来我就觉得不对:这 api 连个验证都没有,岂不是谁都可以来请求这个 api。

这数据也不是机密数据吧,但如果任何人都可以请求 api,拿岂不是 api 暴露给任何人了,用个爬虫,轻松就把数据下载光了。流量和带宽,该多费钱。。。。。

所以能否请高人介绍一下,这前后端分离,一般是怎样验证这个“前端”是自己的、官方的,而不是爬虫或者什么其他人写的非官方前端。尤其是写 app 的时候,app 显然算是“前端”或者“客户端”,那么服务端怎么验证这个请求是从自己官方的客户端发出的呢?

JSON Web Tokens ( jwt )?

谢谢

11186 次点击
所在节点    程序员
56 条回复
MrVito
2018-01-25 07:59:44 +08:00
签名?
toku
2018-01-25 08:00:06 +08:00
token ?
conn4575
2018-01-25 08:05:31 +08:00
先登录获取合法的 token,然后后面的交互都先验证这个 token,token 每隔一小时左右更新一次,防止失效,参考 jwt 实现
CEBBCAT
2018-01-25 08:06:00 +08:00
这,我记得谷歌翻译 Web 版调用的 API 有一个参数是在页面内用 JS 生成的,除此之外好像也没啥验证了
Mutoo
2018-01-25 08:11:14 +08:00
对网页前端来说,并没有‘自己官方的客户端’这个说法,你的代码是运行在 UserAgent 上的,通常是浏览器。而爬虫也是一种 UserAgent,那么用户就可以授权 UserAgent 去获取数据。你能做的是对用户鉴权,而不是对 UserAgent。
ericgui
2018-01-25 08:11:28 +08:00
@conn4575 谢谢
ericgui
2018-01-25 08:16:39 +08:00
@Mutoo 这教程里说的前后端分离,大意是后端就是服务器,expressjs 做的,前端是广义的,可以是一个单页应用 SPA,也可以是一个 app,或者一个什么其他的东西。总之,就是一个广义的前端对后端的 api 发起请求。

请问“对用户鉴权”是这个意思么:用户登陆,后端 api 接收用户名和密码,如果匹配,就返回一个 token ?在 token 的有效期内,前端可以请求后端的 api,并且每次请求的时候,一起把 token 也发送回服务器,服务器要验证这个 token,如果验证通过,就返回相应的数据,如果验证不通过,就给一个 403 ( No Permission )?

请问是这个意思么?谢谢
zhlssg
2018-01-25 08:30:02 +08:00
Session 也是一样的,不过是教验 cookie 而已,所以接口做不到绝对安全
RqPS6rhmP3Nyn3Tm
2018-01-25 08:30:47 +08:00
我用的是 signature+token
ericgui
2018-01-25 08:35:36 +08:00
@BXIA 请教,用的啥 node module ?什么库?
fujie
2018-01-25 08:42:02 +08:00
1. 前端发起 http 请求时有携带 cookie,
2. 后端拿到此 cookie 对比服务器 session,有登陆则放过此请求,无登录,redirect 到登录页面。
3. 登录页面,前端登录,后端比对用户名密码,成功则生成唯一标识符,放在 session,并且种入浏览器 cookie。
另外,合法用户可以拿到自己合法的 cookie,用任何程序构造一个合法的客户端 http 请求。其他用户拿不到这个 cookie,
因个人过失暴露 cookie 给其他人,属于用户个人的行为,比如你在网吧里登录 QQ,服务端没有办法不允许这样操作。而客户端的人应有安全意识,在公共场所及时清空 cookie,或者停止使用一切 [不随 session 关闭而 cookie 失效] 的应用。
Mutoo
2018-01-25 09:04:08 +08:00
@ericgui #7 是的。
v2chou
2018-01-25 09:14:54 +08:00
我也有这种疑惑 比如在小程序中 接口都是请求的 没有登录的操作 怎么防止别人调用我的接口呢
LeeSeoung
2018-01-25 09:18:07 +08:00
防不了前端是不是自己的,但是可以针对一些特征返回脏数据,而不是直接拒绝返回,这样可以玩弄下初级爬虫的。。后台 API 加权限验证。
swordne
2018-01-25 09:18:57 +08:00
其实在 web 环境下,对用户的鉴权只能是不断提高伪造的成本,不能从根本上解决。
前端环境太复杂,所有的东西都是暴漏的,所有的鉴权参数获取都是成本问题而非技术问题。
oott123
2018-01-25 09:23:09 +08:00
不关心前端是不是自己的,甚至鼓励别人来写前端~
MyDaLin
2018-01-25 09:28:08 +08:00
都是高手,我路过的
geelaw
2018-01-25 09:28:31 +08:00
在客户端由不受信第三方(比如用户)控制的情况下,不存在能够验证请求来自“自己的”前端的方法。

如果客户端不受不受信第三方的控制——比如你可以确保你的(二进制)代码只被分发商看到,而最终用户无法看到代码——则可以在请求中使用密码学手段保证发送请求的程序“知道”某个秘密——比如一个密钥。

#7 的回复让我搞不明白楼主想要解决的问题,到底是验证发送请求的程序是自己的程序,还是使用程序的用户是在访问自己可以访问的数据。这是不同的问题。
RqPS6rhmP3Nyn3Tm
2018-01-25 09:28:52 +08:00
@ericgui tornado ……
miketeam
2018-01-25 09:54:51 +08:00
我目前是采用自己建 oauth2.0,登录一次,获取主 token,有效期一年。然后用这个 token 给每个 API 刷临时 token。这是我自己项目尝试。公司的项目用 cookie …

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

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

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

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

© 2021 V2EX