Androidはtokenでログイン状態を維持

6411 ワード

tokenとは
token(トークン)は、通常、サービス側によって生成される一意の文字列であり、登録が完了するとクライアントに返され、このユーザを識別し、クライアントはこの文字列をローカルに格納します.以降のネットワークリクエストの場合、クライアントはまずローカルのtokenをクエリーし、ある場合はこのトークンを直接使用してネットワークリクエストを行い、ない場合はログインしていないことをプロンプトし、ログイン登録インタフェースに移動します.また、サービス側またはクライアントに期限切れ判別メカニズムを追加することもできる.
tokenの役割
tokenは、サービス側のユーザー・テーブルに対するクエリーを大幅に削減し、ユーザーが毎回ログインする必要がなく、システムの可用性と堅牢性を向上させることができます.
SharedPreferencesを使用してtokenを保存
tokenを取得して保存
NetWorks.regPost(user, password, email, tel, new Observer() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {                
                Log.e("LoginActivity",e.getLocalizedMessage()+"--"+e.getMessage());
            }

            @Override
            public void onNext(User user) {
                if(user.getmMessage().equals("success")){
                    MainActivity.instance.finish();//        
                    Toast.makeText(getApplicationContext(),"    ",Toast.LENGTH_SHORT).show();
                    //token     
                    SharedPreferences sp = getSharedPreferences("loginToken", 0);
                    SharedPreferences.Editor editor = sp.edit();
                    editor.putString("userId",user.getmUserId());
                    editor.putString("userName",user.getmUserName());
                    editor.putString("phone",user.getmPhone());
                    editor.putString("email",user.getmEmail());
                    editor.putString("headImageUrl",user.getmHeadImageUrl());
                    editor.commit();
                    Intent i = new Intent(RegActivity.this,MainActivity.class);
                    startActivity(i);
                    finish();
                }else{
                    Toast.makeText(getApplicationContext(),"    "+user.getmMessage(),Toast.LENGTH_SHORT).show();
                }

            }
        });

私はretrofitフレームワークを使用してネットワーク要求を行い、上記は登録機能を実現する関数であり、onNext()関数でサービス側から返された結果を取得し、このフレームワークは自動的に返されたjsonデータを対応するクラスオブジェクト(すなわち、上記のuserオブジェクト)に解析する.tokenの本質は一意の文字列であるため、userIdはこの要求を満たす.userIdはサービス側によって生成され、一意であるため、私はuserIdをtokenとして使用する.
ネットワークリクエストを行う前にローカルtokenをクエリーする
例えば、サイドバーのアイコンをクリックし、ログインしていない場合はログイン画面にジャンプし、すでにログインしている場合は個人情報画面に入ります.この場合,ローカルtokenを検索して判別する必要がある.
private void initData() {
        sp = getSharedPreferences("loginToken", 0);
        name = sp.getString("userId", null);
        userName = sp.getString("userName", null);
        email = sp.getString("email", null);      
    }
@Override
    public void onClick(View view) {
        switch (view.getId()) {         
            case R.id.imageView:
                if (name == null) {
                    Intent i = new Intent(MainActivity.this, LoginActivity.class);
                    startActivity(i);
                } else {
                    Log.d("  ID", name);
                    Intent i = new Intent(MainActivity.this, PersonInfoActivity.class);
                    startActivity(i);
                }
                break;

        }
    }

コメント
この例ではuserIdをtokenとして使用しますが、簡単ですが、これはお勧めしません.userIdは明らかに期限切れであるか否かを判別できないため、tokenの期限切れの判別を実現する必要がある場合は、userIdを日付につなぐ方法を採用することができる.また、セキュリティのためにクライアントでtokenを生成しないでください.