2016-11-15 1 views
1

에서 토큰 갱신을 새로 고칩니다. OpenId Connect를 사용하여 타사 플랫폼을 인증 서버로 사용하고 있습니다. 기본적으로 내 문제는 만료 된 새로 고침 토큰을 처리하고 싶다는 것입니다.OAuth2를 내가 보안 리소스에 액세스하기 위해 허가를 얻기 위해 OAuth2를 토큰을 사용하는 안드로이드 응용 프로그램을 개발하고 있어요 안드로이드

현재 시나리오는

나는 싱글 같은 역할 및 보안 나머지 템플릿을 사용하여 내 모든 요청을 관리하는 NetUtils 클래스를 가지고있다. 이 나머지 템플리트는 요청 랩퍼를 사용하여 각 요청에 대해 필요한 Authorization 헤더를 주입합니다. NetUtils 클래스는 whith 토큰과 타임 아웃을 처리하여 사용자 환경 설정에 저장하고 필요할 때 새로 고칩니다. 새로 고침 토큰 자체가 만료 될 때

그러나, 문제는 온다. 인증 코드 흐름을 사용하기 때문에 WebView를 열고 사용자를 로그인 페이지로 리디렉션해야하지만 NetUtils 클래스가 새로 고침 토큰이 만료 된 것으로 확인하면이를 알 수 있습니다. 이상적으로, 앱이 WebView를 실행하면 사용자가 다시 로그인하고 저장된 요청이 실행됩니다.

다른 선택은 새로 고침 토큰을 오래하고 예를 들어 앱은 시작될 때마다 새로 고침하는 것

private AccessToken refreshToken(String idClient, String clientSecret, AccessToken accessToken) { 
    MultiValueMap<String, String> clientAuthenticationForm = new LinkedMultiValueMap<>(); 
    clientAuthenticationForm.add("grant_type", "refresh_token"); 
    clientAuthenticationForm.add("refresh_token", accessToken.getRefreshToken()); 
    clientAuthenticationForm.add("client_id", idClient); 
    clientAuthenticationForm.add("client_secret", clientSecret); 
    try { 
     long lastClientRefresh = mPrefs.getLong(Preferences.LAST_LOGIN_TIME, Long.MIN_VALUE); 
     boolean refreshTokenExpired = lastClientRefresh 
       + TimeUnit.SECONDS.toMillis(accessToken.getRefreshExpiresIn()) < System 
       .currentTimeMillis(); 
     if (!refreshTokenExpired) { 
      return regularRestTemplate 
        .postForEntity(tokenUrl(), clientAuthenticationForm, AccessToken.class) 
        .getBody(); 
     }else{ 
      //How to cope with this? 
      return null; 
     } 
    } catch (Exception ex) { 
     Log.e(TAG, ex.getMessage(), ex); 
     throw ex; 
    } 
} 

다른 선택 : 여기가 액세스 토큰을 새로 내 코드입니다. 나는 client_id가이고 은 client_secret이 현재 앱에 하드 코딩되어 있음을 언급해야한다. (클라이언트 자격증은 프로덕션 환경에서 사용할 수 없으므로 토큰을 검색하기 위해 여전히 사용자 이름과 암호를 제공해야한다.)

는 여기에서 가장 좋은 방법이 될 것입니다?

답변

1

은 내가 어떻게 자바로 코딩하는 방법을 제안 할 수 있다고 생각하지만, 그래서 아마 내 생각은 뭔가 도움이됩니다 PHP에 응용 프로그램을 만드는 동안 나는 또한 refresh_token도 함께 약간의 문제가 있었다. 처음에 나는 (구글 API처럼) 사용 기간 제한 없음 refresh_token도 찾고 있었다

그래서 난 그것을 하드 코딩 할 수 있고 나는 새로운 access_token이를 만들 때마다 사용합니다. 어쨌든 oAuth2에서는 정말 어렵습니다. 그래서 여기에이 문제에 대한 흥미로운 모습을 발견했다 : 그것은 나에게 refresh_token도 작동하도록 조금 다른 방법을 보여

Why do access tokens expire?

. 새 o_type을 얻기 위해 refresh_token을 사용할 때마다 새로운 refresh_token을 생성하고 반환하는 oAuth 서비스를 설정했습니다.

https://bshaffer.github.io/oauth2-server-php-docs/grant-types/refresh-token/

을 그리고 거기에 우리는 같은 것을 가지고 : 그 부분은 대부분 나에게 도움이 내가 어딘가에 저장하고 나는 그것을 필요로 할 때 내가하는 긴 라이브 refresh_token도이이 경우

$server = new OAuth2\Server($storage, array(
    'always_issue_new_refresh_token' => true, // this part 
    'refresh_token_lifetime'   => 2419200, 
)); 

을 그것을 사용하여 새 access_token을 얻지 만, 응답은 나에게 다시 저장할 수 있고 나중에 새 access_token을 얻기 위해 사용할 수있는 새로운 refresh_token을 제공합니다.

그래서 귀하의 경우에는 내가 가장 좋은 방법은 당신이 refresh_token도에 access_token이 요청 refresh_token도 매번 생성 유지하는 것입니다 생각합니다. 사용자가 APP를 오랫동안 사용하지 않을 경우 다시 인증해야한다고 생각합니다.

+0

답변 해 주셔서 감사합니다. 그것은 결국 내가 구현 한 것입니다. –

관련 문제