现在很多项目都使用前后端分离技术,前后端分离,就需要做接口安全性,如何保证接口不被非法调用。网上查询了很多说法都是说用 Token 。比如说你写了一个api ,然后这个api 可能要给你的其他前端人员调用,你把api给到你的前端人员,然后他们直接在前端调用你的api。因为api部署在外网,所以其他只要知道你的接口地址的人员都可以调用。这个时候,你就增加了一个token验证,你告诉前端人员,我给你一个账号和密码,你用这个账号密码,调用一个接口获取一个token,然后每次在调用其他 api的时候 都吧这个token 添加到 headers 里面。这个时候前端人员如果要拿到token,只能在前端把你给的账号密码写死,然后通过这个账号密码去获取token,这样一来,其他不吧账号密码暴露出去了。任何人都可以拿到账号密码,就可以调用这个接口。跟没有验证有好像也没什么区别。
好像 token这种方式也没什么用。
没有办法,除非你不给人看。
都不用反解代码,直接外挂,如果字体随机、矢量矩阵化,还可以ocr。
你可以做验证,但验证大多也是破解了的,而且验证过多影响用户使用和体验。
信息想public,技术想private,这是一对矛和盾,只有相对。
没有理解楼主的问题点,为什么前端要写死账号密码?正常应该是在登入几面输入账号密码,后端鉴权,然后返回token给前端,前端存储token,之后所有的api都要添加token访问,后端试用token鉴权。
如果怕密码在传输过程中泄漏,可以在传输时加密,从http改为https。
token 用来代替session cookie 存储登录凭证这个是没有问题的,你说的这个我也能理解。但是如果用来做接口的安全验证感觉不适合,比如我开发了一套api ,我这套api可以给A,B,C三家公司使用。想要限制其他人不能使用。这个时候用token 好像就不适合。就好比,你去调用 微信接口的时候,微信会给你一个 appid和 对应的AppSecret 。假如这个接口支持跨域,并且前端html页面可以直接调用的话,你肯定需要用 这个appid 和 AppSecret 去换凭证,这个时候 你appid和 AppSecret 肯定会写在你的前端页面上面。这样就暴露了。AppSecret出去,然后通过页面查看原码就能活动AppSecret。就等于这个东西是没用的。
@yzy: 一套API给A,B,C三家公司,如果是给予oauth2授权,那我理解应该分发三个client客户端和secret,授权模式采用账号密码,或者简单授权根据情况而定,类似微信给每个开发者的appid和appsecret。这时每个人第三方都是不一样的,想要做一层业务校验可以可以加上自己的校验逻辑。
说回这个写到前台界面上的问题,我和楼下的观点是一致的,这种敏感信息是要写在后端的,就像你说的前端永远是不安全的,如果是调用第三方系统,所有的前端界面请求都要发送到自己的后端,然后通过自己的后端调用第三方,这样才能更好的控制逻辑,最好不要让前端发起第三方请求,这样后续会很难控制
你的理解有问题, 就那微信这个例子说:
你appid和 AppSecret不是写在前端页面上的, 是你在你的server端用的, 你调用微信接口都应该通过你的server中转请求.
另外, 如果是微信的接口由你的前端页面去调用, 接口的参数,token, 验签等信息都是在你server端生成好的.
参考微信,阿里云他们的api接口设计,一般不会直接暴露 密码,只提供 账号生成token,token不包含敏感信息。敏感信息要加密。
生成的token用非对称加密。token 有效期设置短一些。
我的系统用 rsa 非对称加密,前端每次登录时 生成一个公钥,再用公钥把账号和密码加密,一起提交到后端。
怎么说呢不想打击你们,用第三方吧,搞些指纹,不然毫无软用,光靠加密是不行的,还要加上风控
1,https可以防止90%的请求截获
2,IdentityServer能保护内网的api不被外网访问
3,token有效期可降低风险
4,重要业务流程(如:转账),可设置二次验证(如:验证指纹或短信验证码)
跨域处理吧