App的登陆注册接口安全设计
最近一APP产品,我担任的主要模块之一是后台登录注册模块的接口开发。基本完成,就说说并记录一下关于登录注册接口的一些东西,因为也涉及到接口的安全方面的问题。
1.先一般的app的登录注册接口安全设计上有两种主要:一个是token,另外一个是session保持
关于选型:如果你的app的接口和你后台管理系统的接口并不是一个接口的话,可以考虑用token的方式。token方式能减轻服务端的负担,由于不是共用接口,所以在代码逻辑上更有又是,比如对登录用户进行异地判断等操作,如果用session保持的方式,则又需要多了一层判断。代码又要时刻注意不影响到pc端的使用。
如果你们是属于前后端分离的话,用的shiro,那么可以考虑session共享的方式。让App端去保持session。这样的好处是代码量开发上能少维护一套接口,接口安全也完全交给shiro就行。但是劣势也很明显:修改pc代码的时候要考虑接口是否会影响到App端,而且由于长时间保持session,服务端的压力会较大。
2.开发逻辑上需要注意的一些事项:
2.1.前期需要确认好app注册上的一系列逻辑:比如是否单个手机号可以绑定多个第三方
如果是可以绑定多个第三方,需要在前期的数据库设计上考虑周全,第三方进行分表设计
2.2.对于app的游客的访问上要提前考虑好。
2.3.第三方登陆绑定手机是否需要设置默认密码根据产品而定。如果不需要,请用加密方式给予初始密码,如果用户首次手机登陆需要进行初始密码校验,引导用户去设置密码
2.2.关于头像的问题
第三方平台的头像不要直接保存在自己数据库,由于第三方平台的头像在用户在修改头像后,会导致该url失效,可以拿到url后上传到自己的平台。
2.3.关于第三方登陆的后台验证问题
由于第三方的uid和token是第三方平台给的,所以一定要在后台对该参数进行有效性判断。否则如果用户的uid被恶意获取,对该用户的信息可能是致命的。有两种方式验证:
2.3.1:app只传第三方的accessToken,后台进行接口判断该token是否存在于系统中,如果没有就去第三方的接口进行判断用户。
2.3.2:app将uid和token都传过来,后台进行校验是否存在,如果不匹配就去第三方接口校验。
区别在于调用的接口不同而已,对于某些第三方平台如果支持accessToken和你的appid进行校验则采用该方式。
3.对于采用token方式,授予app token的时候,不要采用token加密的方式,比如jwt,如果采用该方式。被恶意者知道的加密方式,将会是致命的。
对于token可以后台随机生成uuid,然后将对应的用户信息已key-value的形式存到redis,在存value的时候可以考虑加上当前用户的ip,token生成时间等,在过滤器中进行一系列的校验。在请求的时候查看该token是否在redis有对应的值。另外,如果帐号只能同时登陆1个的话,可以在加一个redis值,用户id对应token。每次登陆,都将原先的token从系统中擦除。
4.对应session的方式,session过期后,统一返回code,然后app在进行调用登陆接口。
5.其他注意事项:
5.1:后台尽量前期与app人员说好上线后采用https协议。这样他们在前期也会做好对应的代码设计,不然上线前要增加,他们可能未考虑到,将会很麻烦。5.2:接口设计尽量简单,单个接口只完成一个功能。因为在app中,很多调用逻辑并不是像pc那样在一个页面能完成,开发中多与前段人员沟通。如果你不了解前端的开发上,请虚心请教
5.3:后期待补充
补充一个系统的登陆注册接口流程图