APP登录Token

作者: HolenZhou | 来源:发表于2016-08-29 15:36 被阅读317次

    在计算机身份认证中是令牌(临时)的意思。

    APP登录的时候发送加密的用户名和密码到服务器,服务器验证用户名和密码,如果成功,以某种方式比如随机生成32位的字符串作为token,存储到服务器中,并返回token到APP

    private void login(final String userName, final String password, String token, String refreshToken, String sdkToken) {
            //请求网络登录
            final long timeForLogin = System.currentTimeMillis();
            Timber.d("start login at " + timeForLogin);
    
            NetManager.getInstance().Login(
                    new NetManager.Listener<LoginRsp>() {
                        @Override
                        public void onResponse(LoginRsp rsp) {
                            Timber.i("login success rsp:" + rsp);
                            Timber.w("notifyLoginSuccess Login cost " + (System.currentTimeMillis() - timeForLogin) + "ms");
                            //获取登录态并存储
                            handlerLoginRsp(rsp);
                        }
    
                        @Override
                        public void onErrorResponse(String msg, int code) {
                            Timber.e("login error:" + msg + "," + code);
                            notifyLoginFailed(msg, code);
    
                            setAccountInfoBean(null);
                        }
                    }, userName, Check.isNotEmpty(password) ? MD5Utils.getMD5ofStr(password) : "", token, refreshToken, sdkToken);
        }
    

    登录接口调用成功后会返回一个token字符串给APP,APP将它保存在数据库中。


    带有token的回包

    在网络层面上token明文传输的话会非常的危险,所以建议一定要使用HTTPS,并且把token放在post body里。我们项目这里使用的是thrift协议,协议的请求包和响应包都是需要加密的。

    public byte[] getRequest(int requestId) {
            Timber.d("getRequest:" + getRequestName());
            report.startSend(getRequestName());
    
            Request request = new Request();
            request.header = makeHeader(requestId);
            request.body = getRequestBody(requestData);
    
            //打包request
            byte[] origins = RequestUtil.encode(request).array();
            //加密
            byte[] encrys = bEncyption ? EncryptionManager.getEncyption().encryption(origins) : origins;
            //加协议头
            byte[] wraps = bWrapHead ? RequestUtil.wrapHead(encrys) : encrys;
            return wraps;
        }```
    
    APP拿到token以后请求时,凡是需要验证的地方都要带上该token,然后服务器端验证token,成功返回所需要的结果,失败返回错误信息,让他重新登录。其中服务器上的token设置一个有效期,APP请求时验证token同时验证有效期,过期也需要重新登录。我们项目中,每一个网络请求都会带上token。
    

    public Header makeHeader(int requestId) {
    Header header = new Header();

        ……
    
        header.version = NetConfig.THRIFT_VERSION;
    
        header.token = AccountManager.getInstance().getToken();
        header.refresh_token = AccountManager.getInstance().getRefreshToken();
    
        header.accountName = AccountManager.getInstance().getAccountName();
    
        ……
    
        return header;
    }
    
    
    当服务器检测到APP携带的token错误或者过期了,会返回错误。APP接受到相应的错误后,提示用户重新登录。
    

    public void onErrorAction() {
    ……
    if (retCode == RetCode.RetCode_CheckToken_Error
    || retCode == RetCode.RetCode_Login_Expire) {
    // 弹出登录态过期的对话框,让用户重新登录
    UIUtils.showLoginExpireDialog();
    }
    }

    相关文章

      网友评论

        本文标题:APP登录Token

        本文链接:https://www.haomeiwen.com/subject/epwxettx.html