2014-09-29 233 views
3

我有一組基於DropWizard的RESTful Web服務。目前我正在使用BasicAuth來驗證用戶使用API​​。使用DropWizard進行OAuth身份驗證

這涉及開銷另一個DB與用戶/密碼的詳細信息。我正在研究基於令牌的身份驗證,並發現DropWizard支持Oauth2開箱即用。

任何人都可以幫助我的基於Oauth2的身份驗證的示例實現嗎?那麼架構如何實現呢?

任何幫助,將不勝感激。

+0

這不是一個真正的Oauth2支持我會說。如果你檢查這個例子,它只是給你一個字符串,並希望你自己驗證它。因此,要麼實現自己的基於令牌的身份驗證,要麼將其他身份驗證庫集成到其中。 – Natan 2014-11-25 14:08:52

+0

此處有任何更新?有人知道,如何在驗證器中注入範圍? – heaphach 2015-04-13 11:19:06

回答

0

Dropwizard GitHub repo中有一個OAuth2身份驗證示例。

下面有對Dropwizard的最新版本(V0.7.1)的例子:

... 

public OAuthFactory(final Authenticator<String, T> authenticator, 
        final String realm, 
        final Class<T> generatedClass) { 
    super(authenticator); 
    this.required = false; 
    this.realm = realm; 
    this.generatedClass = generatedClass; 
} 

private OAuthFactory(final boolean required, 
        final Authenticator<String, T> authenticator, 
        final String realm, 
        final Class<T> generatedClass) { 
    super(authenticator); 
    this.required = required; 
    this.realm = realm; 
    this.generatedClass = generatedClass; 
} 

@Override 
public AuthFactory<String, T> clone(boolean required) { 
    return new OAuthFactory<>(required, authenticator(), this.realm, this.generatedClass); 
} 

public T provide() { 
    try { 
     final String header = request.getHeader(HttpHeaders.AUTHORIZATION); 
     if (header != null) { 
      final int space = header.indexOf(' '); 
      if (space > 0) { 
       final String method = header.substring(0, space); 
       if (PREFIX.equalsIgnoreCase(method)) { 
        final String credentials = header.substring(space + 1); 
        final Optional<T> result = authenticator().authenticate(credentials); 
        if (result.isPresent()) { 
         return result.get(); 
        } 
       } 
      } 
     } 
    } catch (AuthenticationException e) { 
     LOGGER.warn("Error authenticating credentials", e); 
     throw new InternalServerErrorException(); 
    } 

    if (required) { 
     throw new WebApplicationException(Response.status(Response.Status.UNAUTHORIZED) 
       .header(HttpHeaders.WWW_AUTHENTICATE, String.format(CHALLENGE_FORMAT, realm)) 
       .type(MediaType.TEXT_PLAIN_TYPE) 
       .entity("Credentials are required to access this resource.") 
       .build()); 
    } 

    return null; 
} 

@Override 
public Class<T> getGeneratedClass() { 
    return generatedClass; 
} 
... 

完整代碼,here

+2

謝謝,但它根本沒有幫助。 – h4ck3d 2014-09-30 18:50:44

1

這個問題已經有一段時間了,但是對於未來的遊人,我把這裏的一篇文章,解釋如何使用自定義的註釋做得很好:

基本上這個想法是用我們自己的邏輯來實現我們自己的註釋(在這個例子中是使用JWT),但是這篇文章也指出了Dropwizard需要的自定義設置。