【问题标题】:OAuth authentication with DropWizard使用 DropWizard 进行 OAuth 身份验证
【发布时间】:2014-11-23 13:01:03
【问题描述】:

我有一组基于 DropWizard 的 RESTful Web 服务。目前我正在使用 BasicAuth 对用户进行身份验证以使用 API。

这涉及使用另一个带有用户/密码详细信息的数据库的开销。我正在寻找基于令牌的身份验证,发现 DropWizard 支持 Oauth2 开箱即用。

谁能帮助我实现这个基于 Oauth2 的身份验证的示例?实现这样的架构是什么?

任何帮助将不胜感激。

【问题讨论】:

  • 我想说的并不是真正的 Oauth2 支持。如果您检查该示例,它只会为您提供一个字符串并希望您自己验证它。因此,您要么实现自己的基于令牌的身份验证,要么将其他一些身份验证库集成到其中。
  • 这里有什么更新吗?有人知道,如何在验证器中注入作用域吗?

标签: java rest oauth dropwizard


【解决方案1】:

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】:

这个问题已经存在了一段时间,但对于未来的访问者,我在这里放置了一篇文章,解释了如何很好地使用自定义注释:

基本上这个想法是用我们自己的逻辑(在本例中使用 JWT)来实现我们自己的注释,但该帖子还指出了 Dropwizard 需要哪些自定义设置。

【讨论】:

    【解决方案3】:

    尽管这个问题已经存在四年了,但我还是找不到一个完整的应用程序示例,该应用程序使用您自己的验证机制插入到 dropwizard Oauth2 库中。

    因此,为了让将来从 google 搜索中偶然发现这篇文章的人受益,here 是在最新的 dropwizard 版本 1.3.8 上运行的完整工作示例

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2015-03-22
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 2015-05-05
      相关资源
      最近更新 更多