2017-10-11 5 views
0

휴대 기기의 비밀 만료를 관리하기위한 전략이 있는지 알고 싶습니다.클라이언트 자격증 명 흐름이있는 Android/IOS 비밀 만료 관리

인증 서버가 모바일 클라이언트가 클라이언트 자격증 명과 함께 리소스 소유자 암호 흐름을 사용하여 클라이언트에 대해 권한을 부여 할 수있는 시나리오에서 클라이언트 기밀은 만료 시간이 있습니다.

안드로이드 앱에 비밀을 안전하게 저장하는 방법이 있지만 최소한 새로운 버전의 앱을 게시하지 않고 어떻게 만료 기한을 관리합니까?

답변

3

다음은 앱에서 수행 한 작업입니다 (OAuth Refresh Token Standards).

1 단계 : here

HTTP/1.1 200 OK 
Content-Type: application/json;charset=UTF-8 
Cache-Control: no-store 
Pragma: no-cache 

{ 
    "access_token":"2YotnFZFEjr1zCsicMWpAA", 
    "token_type":"example", 
    "expires_in":3600, 
    "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA", 
    "example_parameter":"example_value" 
} 

2 단계 명시된 바와 같이 귀하의 API는 표준 인증 토큰 응답을 전송해야한다 : 공유 환경 설정/로컬 캐시/로컬 데이터베이스에서 해당 응답을 저장, 우리가 공유 사용 환경 설정 (accountToken 가정 클래스의 개체 인증 토큰의 응답)

SharedPreferences.Editor editor = getContext().getSharedPreferences("AUTH_PREFS_NAME", Context.MODE_PRIVATE).edit(); 
editor.putString("AUTH_ACCESS_TOKEN_KEY", accountToken.getAccess_token()); 
editor.putString("AUTH_REFRESH_TOKEN_KEY", accountToken.getRefresh_token()); 
editor.putLong("AUTH_EXPIRES_IN_KEY", accountToken.getExpires_in()); 
editor.putLong("AUTH_TIME_SAVED_KEY", ((int) (System.currentTimeMillis()/1000))); 
editor.commit(); 

3 단계에서 만든 : 당신이 액세스 토큰을 저장 사용해야 할 때마다,이 만료되어 있지 않은지 확인

,
public boolean needsTokenRefresh(String accessToken) { 
    if (accessToken == null || accessToken.length() == 0) { 
     // no access token to refresh. Don't refresh. 
     return false; 
    } 

    SharedPreferences pref = mContext.getSharedPreferences("AUTH_PREFS_NAME", Context.MODE_PRIVATE); 
    String refreshToken = pref.getString("AUTH_REFRESH_TOKEN_KEY", null); 
    if (refreshToken == null || refreshToken.length() == 0) { 
     // no refresh token. Can't refresh. 
     return false; 
    } 

    Integer timeSaved = pref.getInt("AUTH_TIME_SAVED_KEY", 0); 
    if (timeSaved == 0) { 
     // No recording of having saved the token. Don't refresh. 
     return false; 
    } 

    long expiresIn = pref.getLong("AUTH_EXPIRES_IN_KEY", 0); 
    int now = (int) (System.currentTimeMillis()/1000); 
    int timePassed = Math.abs(now - timeSaved); 
    boolean expired = false; 
    if (expiresIn <= timePassed) { 
     expired = true; 
    } 
    return expired; 
} 

needsTokenRefresh()false 인 경우 저장된 인증 토큰을 사용하십시오. true을 반환하면 다음 단계로 이동하십시오.

4 단계 : 같은 grant_type 세트로 다시 인증 호출을 확인 refresh_token 5 단계

stated in standards로 : 새로 고침 토큰과 새로운 refresh_token

+2

로 1 단계에서 설명한대로 호출 표준 인증 응답을 반환해야 인증 난 당신이 잊고 생각 ''AUTH_TIME_SAVED_KEY ''를 저장하는 호출을 기록하려면 토큰이 만료되었는지 여부를 결정할 때 의존해야하므로 자유를 추가하여 추가 할 수 있습니다. :) 일반적으로이 타임 스탬프는 약간 보수적이어야합니다. 지연 (공용)은 서버가 허용하지 않을 수도 있지만 메서드가 만료되지 않는다고 말하면 (로컬에서만 확인) 말입니다. 그것은 극단적 인 경우이지만 처리 할 수 ​​있습니다. – Gero

+0

나는 여분의 비트를 자르는 동안 그것을 놓쳤다 고 생각한다. 추가해 주셔서 감사합니다. – adnanyousafch

1

내가 생각할 수있는 유일한 방법은 서버에 연결하여 전화 fingerPrint를 보내는 응용 프로그램을 실행할 때 fingerPrint가 데이터베이스에 나열되어 있지 않으면 서버에서 파일을 보냅니다. 파일에는이 날짜의 현재 날짜와 디지털 서명이 포함되어있어 사용자가 값을 변경하지 않습니다. 및 앱을 실행할 때마다 VerifySignature 메소드를 적용하여 날짜와 날짜의 무결성을 확인하십시오.