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

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 )?

谢谢

11217 次点击
所在节点    程序员
56 条回复
miketeam
2018-01-25 10:05:12 +08:00
还有每个 API 有个时间请求的限制,1 秒
houn1995
2018-01-25 10:12:47 +08:00
接口根据需求加认证权限,比如登陆之后才能用的,可以在登陆之后,返回前端一个 token,每次前端在请求的时候吧 token 放到 header 的验证中,这样后台判断这个 token 是否正确从而确定是否返回接口数据,通常 token 也会有个有效时间。
qiutc
2018-01-25 10:15:56 +08:00
服务端 session 生成 sid 放在 cookie 中,登录时在返回的 Header Set-Cookie,之后的请求都会带上这个 cookie,服务端拿 cookie 对应 session 来验证。
edisonchen
2018-01-25 10:41:06 +08:00
对于这个问题,假设服务端用 JWT 等方式,我用账号密码登陆后可以获取到这个返回 token,然后我自己用我自己的这个 token 拿爬虫来调接口,这种方式算不算上文提到的:(---这个请求是从自己官方的客户端发出的呢?--)
yifeng1212
2018-01-25 10:43:32 +08:00
总结楼上几位的评论:
大体分为两种方法,

1.API 鉴权,可以使用 cookie,或者登录 token。如果是开发 API,可以参考微信或微博的开发者平台 API,他们所有的接口都要通过 token 来鉴权

2.API 访问限制,可以限制同一个 IP 请求次数,或者限制请求频率(每天限额,或者单位时间请求数有上限)

不能做到绝对的安全,但能提高被不怀好意利用的成本。
xkeyideal
2018-01-25 11:03:33 +08:00
说一下,我的做法:
1、前端只做 UI 的展示层,登录,权限校验,均交给后端完成
2、登录接入公司统一的登录,类似 OAuth 这种,贵司不可能没有吧?
3、每个 api 都有相应的路由权限控制,权限控制系统由后端完成,类似做个 middleware 或拦截器
4、访问 api 必须带着当前登录用户的 token,用于校验用户信息,并且查询该用户能够操作的数据,token 是一天变化一次,并没有使用 JWT 这类的开源实现,原因就是太重
5、每行数据都只能有该数据权限的人才能访问和操作

总结:前端是无设防的,不可以信任; 全部的校验都由后端完成
NEETLEE
2018-01-25 11:08:47 +08:00
我司目前的项目就是用 jwt 做的验证,jwt 也有一定的局限,不过仅仅是避免被爬应该可以胜任的
AlisaDestiny
2018-01-25 11:10:40 +08:00
添加拦截器。为每个请求都做验证。通过验证的请求才交路由处理器。
wujunchuan2008
2018-01-25 11:29:49 +08:00
前端做验证只是为了用户体验,比如控制按钮的显示隐藏,单页应用的路由跳转等等。
后端才是最终的保障。
timwei
2018-01-25 11:43:02 +08:00
@ericgui

先不讨论爬虫,浏览器 XHR 有同源策略,除非你有配置 CORS 相关的 Header,其他人在浏览器中无法直接调用你的 API

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS

爬虫的话,即使你做了相关的验证还是很好破

以前用 captcha 挺有用的,不过自从 Google Vision 之类的 OCR 服务方便使用后也不靠谱了

辨识率挺高的
hlwjia
2018-01-25 11:48:03 +08:00
首先,要了解传统方式(你一直在用的)里,后端是前端发来的请求的怎么验证身份的?

如果这个都不清楚,就还是先补补基础
StevenTong
2018-01-25 11:49:31 +08:00
jwt token
hlwjia
2018-01-25 11:49:37 +08:00
在身份验证上其实没有本质区别
ericgui
2018-01-25 13:45:49 +08:00
@xkeyideal 目前是 password 来做校验。所以我也有点晕。有了 password,还要用 jwt 么?
xkeyideal
2018-01-25 14:11:32 +08:00
@ericgui 我们的做法是使用 token,password 那是登录做的事情,如果接入了统一登录,系统是拿不到用户密码的,至于 jwt 我没用过,太重
alinwu05
2018-01-25 14:28:51 +08:00
API 没有权限控制,如果跳一跳被随便 Post 数据一样,必须有验证啊!只是好多教程是前端写的,不太熟悉后端,所以都忽略了这一块。之前我写过一篇科普文章,看完你就明白了。https://my.oschina.net/u/248080/blog/875243
wizardoz
2018-01-25 14:47:04 +08:00
楼主可以区别一下 Authentication 和 Authorization,一个是 password 干的事情一个是 token 干的事情,对于一个完整的业务来说,两者都是必须的,只是具体如何实现就很灵活了。比如 OAuth2 的话 Authentication 和 Authorization 就可能在不同的地方进行。
pandaaa
2018-01-25 14:52:33 +08:00
楼主可以 google 一下 Anti CSRF Token
MaxTan
2018-01-25 15:11:43 +08:00
v2 月经贴
CoderGeek
2018-01-25 15:17:25 +08:00
jwt 签名+自定义 token 先过了签名验证再验证 token

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

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

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

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

© 2021 V2EX