2016-04-29 115 views
3

我有一個Android應用程序,其登錄信息通過https發送到Java休息API,驗證登錄憑據,然後發回一個響應,說明登錄是否成功。我的問題很簡單,我應該怎麼做以確保用戶在重新啓動應用程序時不必再次登錄?Android,使用Rest API登錄

+0

你可以讓你的API提供,您可以使用爲將來的API請求驗證用戶身份驗證密鑰。您也可以設置此Auth令牌的有效性。有關更多信息,請閱讀JSON Web令牌。 –

回答

3

有很多方法可以處理一次性登錄,它很大程度上取決於架構如何在服務器端實現以使其工作。出於安全原因,通常登錄API是closely coupled。讓我舉個例子,我的意思是closely coupled

當你想LoginMobile App工作一次,下一次用戶打開你不想再次提示與SignIn屏用戶的Mobile app。當然您不希望將移動應用上的UsernamePassword等機密信息保存爲持久數據,因爲它可以從Android設備輕鬆獲取。那你幹什麼。

讓我們假設您通過Android Device唯一的登錄憑證deviceID。如下所示。以下是發送到LoginAPI

{ 
    "username": "[email protected]", 
    "password": "it's not a secret", 
    "deviceId": "123456789" 
} 

現在,當你不希望保存Login憑據JSON數據,服務器會在每次你登錄到移動時生成一個隨機的字母數字String將它傳遞給您迴應應用。

{ 
    "Success": true, 
    "SuccessMessage": "credentials are correct, really!", 
    "ErrorMessage": null, 
    "Date": "dd/mm/yyyy", 
    "token": "1eghe4qha23aehraeh456789" // now this is a nasty String 
} 

你現在可以保存date和移動應用的token作爲持久性數據。 因此,下次您的用戶打開應用程序,您可以讓用戶繞過SignIn屏幕,並在後臺您可以通過將其發送到服務器來檢查用戶令牌ID是否正確,如下所示。你可以選擇SharedPreferences或創建一個file,並保存有

{ 
    "API_TYPE": "login", 
    "deviceId": "123456789", 
    "token": "1eghe4qha23aehraeh456789" 
} 

服務器可以檢查對deviceID此令牌ID來檢查,​​如果這是在設備和響應正確的令牌。

您可能會問爲什麼我們再次檢查token,因爲這是由服務器首先發送的,說明憑證是正確的。我同意你確實有一點,如果用戶從網站更改密碼或導致更改服務器上的令牌以更改該用戶的令牌時,如果服務器拒絕由該服務提供的令牌你只需要用戶再次登錄。

這將確保用戶在任何給定的時間點只登錄到一個Android Device

+1

感謝您的幫助,這似乎是我見過的最好的方法。但是,我有一個問題,在設備上存儲令牌的時間太長是不是不好的做法?如果用戶每次首次登錄後返回應用程序,您會推薦以下方法: 1.用戶打開應用程序,將存儲在共享首選項中的令牌和設備ID發送到服務器 。服務器用存儲在服務器上的設備ID和令牌ID來驗證設備ID和令牌ID ...... –

+1

3.然後服務器產生一個新令牌,如果步驟2成功,它就會發送一個新令牌成功消息 4.令牌ID然後在共享首選項中與從服務器接收到的新令牌更新。 會是矯枉過正?另外,你會建議做ssl的令牌檢查嗎? –

+0

@BenC,你注意到你實際上在這種方法中找到了一些環形孔。你提出的建議是可以做到的,'SSL'選項也是如此。請記住我已經添加了一個'Date'鍵,它將作爲響應由服務器提供。這個日期可以用來檢查'Si​​gnIn'上次成功發生的時間,並且可以在10,20或30天后使標記無效並且要求用戶再次'SignIn' –

0

您可以在首次登錄後存儲憑據。 因此,當用戶重新啓動應用程序時,您可以自動進行請求認證。

你可以選擇是最好的選擇,以存儲使用文檔的憑據: Data-Storage

這是簡單的,但也許不是最好的方式做到這一點。

+0

如果在auth中使用密碼,請記住在存儲之前進行加密。 – Adley

0

我有同樣的problme,和我從服務器這樣

{"error":0,"message":"ok","token":"7c75015e92e40511911e34752ee456e1","execute_time":"0.2723"} 

一個JSON數據,所以我一直在SharedPreferences的StuToken,當我的應用程序啓動,檢查StuToken它存在,像這

Map<String, String> loginInfo = InfoUtil.getLoginInfo(MainActivity.this); 
    if (loginInfo != null) { 
     if (loginInfo.get("StuToken") != null) { 
      getStuInfo(loginInfo.get("StuToken")); 
      Toast.makeText(MainActivity.this, "登錄狀態", Toast.LENGTH_SHORT).show(); 
     } else { 
      initIntent(LoginActivity.class); 
      this.finish(); 
     } 
    } else { 
     initIntent(LoginActivity.class); 
     this.finish(); 
    } 
} 

希望會爲你工作

0

您可以使用共享的喜好來存儲用戶的價值和檢查用戶是否已經登錄。你可以關注這個Link.

0

試着在你的閃屏Activity.You這個代碼可以存儲在sharedPrefence一個值來檢查用戶是否登錄或沒有。

public class SplashActivity extends AppCompatActivity { 

    private static final long TIME_OUT_MILI = 3000; 
    private SharedPreferences mAppPreferences; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_splash); 
     mAppPreferences = AppUtil.getAppPreferences(this); 

     new Handler().postDelayed(new Runnable() { 

      @Override 
      public void run() { 
       if (mAppPreferences.getBoolean("is_Logged_in", false)) { 

        startActivity(new Intent(SplashActivity.this, MainActivity.class)); 

       } else { 

        startActivity(new Intent(SplashActivity.this, LoginActivity.class)); 

       } 
       finish(); 
      } 
     }, TIME_OUT_MILI); 
    } 


} 

在你LoginActivity我們做到這一點:

public class LoginActivity extends AppCompatActivity { 
private SharedPreferences mAppPreferences; 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_login); 
      SharedPreferences.Editor editor = mAppPreferences.edit(); 
editor.putBoolean(Constants.SETTINGS_IS_LOGGED_IN, true); 
         editor.commit(); 
} 
}