繁体   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