簡體   English   中英

使用DropWizard進行OAuth身份驗證

[英]OAuth authentication with DropWizard

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

這涉及到擁有另一個帶有用戶/密碼詳細信息的數據庫的開銷。 我正在尋找基於令牌的身份驗證,並發現DropWizard開箱即用支持Oauth2。

任何人都可以幫我解決這個基於Oauth2的身份驗證的示例實現嗎? 那么實現的架構是什么?

任何幫助,將不勝感激。

這個問題已經存在了一段時間,但是對於未來的訪問者,我在這里放了一篇文章,解釋了如何使用自定義注釋做到這一點:

基本上我的想法是使用我們自己的邏輯(在這種情況下使用JWT)實現我們自己的注釋,但帖子還指出了Dropwizard需要哪些自定義設置。

盡管這個問題已經有四年了,但是我無法找到一個完整的應用程序示例,該應用程序使用您自己的驗證機制插入dropwizard Oauth2庫。

因此,為了將來從谷歌搜索發現這篇文章的人的利益, 是一個在最新的dropwizard版本1.3.8上運行的完整工作示例

祝好運!

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;
}
...

完整的代碼, 在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM