2015-12-26 15 views
8

मैं इस कोड का उपयोग https://github.com/gdongus/spring-boot-oauth-jwt-example और सबकुछ सही काम करता है, लेकिन मुझे नहीं पता कि लॉगआउट कार्यक्षमता को कैसे कार्यान्वित किया जाए। क्या कोई मुझे सलाह दे सकता है? धन्यवाद।स्प्रिंग-बूट जेडब्ल्यूटी लॉगआउट

उत्तर

7

क्लाइंट-साइड लॉगआउट सरल है, बस अपने टोकन को छोड़ दें। सर्वर-साइड लॉगआउट कार्यक्षमता प्रदान करने के लिए आपके एप्लिकेशन को वर्तमान में प्रमाणीकृत क्लाइंट, दूसरे शब्दों में, मौजूदा टोकन के बारे में पता होना चाहिए। टोकन आधारित प्रमाणीकरण के साथ "बिल्ड-इन" समस्या यह है कि यदि टोकन प्रकाशित होता है तो यह मान्य होने तक वैध है और कोई "दूरस्थ अमान्यता" समाधान नहीं है। आपका एकमात्र मौका उन टोकन के अनुरोधों से बचने के लिए है जिन्हें आप अब भरोसा नहीं करते हैं।

तो आपको token store नामक कंटेनर में प्रत्येक प्रकाशित टोकन को याद रखना होगा।

मेमोरी में काम करने के लिए TokenStore इंटरफेस के कुछ कार्यान्वयन या शायद डेटाबेस (JdbcTokenStore) के साथ कुछ कार्यान्वयन हैं। एक साधारण उदाहरण के लिए InMemoryTokenStore पूरी तरह से पर्याप्त है।

इसका उपयोग करने के लिए, टोकन स्टोर को निम्नानुसार बनाया और कॉन्फ़िगर किया जाना है।

अपने AuthorizationServerConfiguration को यह करें:

@Bean 
public InMemoryTokenStore tokenStore() { 
    return new InMemoryTokenStore(); 
} 

और AuthorizationServerEndpointsConfigurer में इसका इस्तेमाल करते हैं:

@Override 
public void configure(AuthorizationServerEndpointsConfigurer configurer) throws Exception { 
    configurer.authenticationManager(authenticationManager); 
    configurer.userDetailsService(userDetailsService); 
    configurer.accessTokenConverter(accessTokenConverter()); 
    configurer.tokenStore(tokenStore()); 
} 

यह आपके ResourceServerConfiguration को भी जोड़ें:

@Autowired 
private InMemoryTokenStore inMemoryTokenStore; 
... 
@Override 
public void configure(ResourceServerSecurityConfigurer resources) throws Exception { 
    resources.resourceId("resource").tokenStore(inMemoryTokenStore); 
} 

लगभग सभी है कि। अब आप की तरह आप इसकी आवश्यकता है, हो सकता है एक विशेष अंत बिंदु जहाँ आप केवल टोकन (रों) प्राप्त करने के लिए के साथ अपने लॉगआउट कार्यक्षमता लागू कर सकते हैं और साथ टोकन की दुकान से इसे हटाने:

inMemoryTokenStore.removeAccessToken(accessToken); 
inMemoryTokenStore.removeRefreshToken(refreshToken); 

भी दूर करने के लिए ध्यान रखें टोकन रीफ्रेश करें, अन्यथा (यदि केवल एक्सेस टोकन हटा दिया गया है) क्लाइंट रीफ्रेश टोकन के साथ एक नया प्राप्त करने में सक्षम है। ,

@Test 
public void getUserWithValidAuth() throws Exception { 
    final HttpHeaders headers = getHttpHeader(CLIENT_USER, CLIENT_SECRET); 
    final HttpEntity<String> request = new HttpEntity<>(headers); 

    final String tokenUrl = getOAuthTokenUrl(OAUTH_TOKEN_USERNAME, OAUTH_TOKEN_PASSWORD); 
    final ResponseEntity<Object> response = restTemplate.exchange(tokenUrl, HttpMethod.POST, request, Object.class); 
    assertTrue("Did not get auth tokens!", response.getStatusCode().is2xxSuccessful()); 

    final Map result = (Map) response.getBody(); 
    final String accessTokenAsString = (String) result.get(ACCESS_TOKEN); 
    final String refreshTokenAsString = (String) result.get(REFRESH_TOKEN); 

    final String resourceUrlWithToken = "http://localhost:" + port + "/users?access_token=" + accessTokenAsString; 

    final ResponseEntity<String> userResponse = restTemplate.exchange(resourceUrlWithToken, HttpMethod.GET, null, 
      String.class); 
    assertTrue("Could not request user data!", userResponse.getStatusCode().is2xxSuccessful()); 

    final OAuth2AccessToken accessToken = inMemoryTokenStore.readAccessToken(accessTokenAsString); 
    final OAuth2RefreshToken refreshToken = inMemoryTokenStore.readRefreshToken(refreshTokenAsString); 
    inMemoryTokenStore.removeAccessToken(accessToken); 
    inMemoryTokenStore.removeRefreshToken(refreshToken); 

    try { 
     restTemplate.exchange(resourceUrlWithToken, HttpMethod.GET, null, String.class); 
     fail("Should not get here, expected 401 for request with access token!"); 
    } catch (HttpClientErrorException e) { 
     // would not be needed with MockMvc 
    } 

    final String refreshTokenUrl = REFRESH_TOKEN_URL + refreshTokenAsString; 
    try { 
     restTemplate.exchange(refreshTokenUrl, HttpMethod.POST, request, Object.class); 
     fail("Should not get here, expected 401 for request with refresh token!"); 
    } catch (HttpClientErrorException e) { 
     // would not be needed with MockMvc 
    } 
} 

और कम से कम सिर्फ एक सिफारिश MockMvc एक भयानक परीक्षण ढांचे यह आसान बाकी कॉल और आप परीक्षण करने के लिए बनाता है उपयोग कर रहा है:

यहाँ अपने परीक्षण के अनुसार अगर यह काम कर रहा है सत्यापित करने के लिए एक परीक्षण का मामला है RestTemplate के साथ काम करते समय बाधाओं और बॉयलर प्लेट कोड से छुटकारा पा सकते हैं। शायद आप इसे आज़माएं।

संबंधित मुद्दे