当前位置: 首页 > 知识库问答 >
问题:

Dropwizard身份验证标头令牌

颛孙喜
2023-03-14

我正在尝试在Dropwizard web应用程序中实现OAuth2身份验证。我已经创建了所需的<code>验证器

environment.jersey().register(new AuthDynamicFeature(
                new OAuthCredentialAuthFilter.Builder<User>()
                .setAuthenticator(new TokenAuthenticator(service))
                .setAuthorizer(new TokenAuthorizer())
                .setPrefix("Bearer")
                .buildAuthFilter()));
        environment.jersey().register(RolesAllowedDynamicFeature.class);
        //If you want to use @Auth to inject a custom Principal type into your resource
        environment.jersey().register(new AuthValueFactoryProvider.Binder<>(User.class));

我所需的行为是,在我的客户端通过在我的登录页面上提供他/她的凭据登录后,我想将客户端重定向到我使用Dropwizard Views创建的问候语页面,并且路径为“/me”,如下所示:

//After succesfull login and token generation
return Response.seeOther(new URI("/me")).build(); // redirect to greeting page

我的问候资源如下所示:

@Path("/me")
@Produces(MediaType.TEXT_HTML)
public class UserResource {

    @GET
    public UserView getView(@Auth User user) {
            return new UserView(user);
    }

}

目前,我得到一个“访问此资源需要凭据。”登录后的响应。在阅读了一些关于令牌认证的内容后(这里的解释很好),我意识到令牌必须在每个请求的报头中从客户端发送。所以我的问题是,我如何告诉用户的浏览器(客户端)在未来的请求头中包含令牌?

共有1个答案

常雅达
2023-03-14

我通过以下操作设法解决了这个问题:

为了验证用户,必须在请求的报头中以< code>Authorization: Bearer的形式发送令牌

<#-- Handle form submission response to save the token on the client side-->
<script>
    $('#loginForm').submit(function(event){
        event.preventDefault();
        $.ajax({
          url: $(this).attr('action'),
          type: 'POST',
          data : $(this).serialize(),
          dataType: 'json',
          success: function(data){
            //alert("The server says success!!: " +data);
            console.log(data);
            window.sessionStorage.accessToken = data.token;
            window.location = data.url;

          },
          error: function(data){
            alert("The server says error! : ");
            console.log(data);
          }
        });
});
</script>

然后登录资源生成JSON,它在上面代码中的数据变量中被接收。所需的令牌驻留在data.token中,然后存储。我在JSON中添加了第二个名为“url”的条目,以指示成功身份验证后重定向到的路径。

现在,令牌在需要时存储在客户端。为了在请求头中发送这个令牌,我需要改变我的方法,使用Dropwizard提供的视图。我没有直接要求认证,而是将视图的资源和经过认证的数据资源分开。为了清楚起见,考虑下面的例子。用户登录,获得令牌,然后转到显示他/她的用户名的页面。对于该页面,视图资源是用一个. ftl文件作为模板创建的。类似于:

@Path("/me")
@Produces(MediaType.TEXT_HTML)
public class UserResource {


    @GET
    public UserView getView() {
       return new UserView();

    }
}

和...

public class UserView extends View {

    public UserView() {
        super("user.ftl");

    }
}

和用户:

<#include "include/head.html">
<#include "include/header.html">

<!-- Header --> 
<div id ="headerWrapper">
</div>

<div class="container-fluid">

<div id="name">
    <p>Hello user</p>
</div>

</div>

<#include "include/footer.html">

现在,为了检索用户名,我创建了一个新资源,该资源在新路径上生成JSON。例如:

@Path("/getdetails")
@Produces(MediaType.APPLICATION_JSON)
public class UserDetailsResource {

    @GET
    @Timed
    @UnitOfWork
    public User getDetails(@Auth User user) {

        return user;
    }

}

该资源需要身份验证,并提供JSON,用户名可以从JSON中检索。现在要获取用户名并将其放入视图中,只需向users.ftl添加一个脚本,并向get详细信息资源发出ajax请求,在标头中提供令牌,并使用结果将用户名放入视图中。请参阅下面的脚本。

<script>

  $.ajax({
          url: '/getdetails',
          type: 'GET',
          headers: {"Authorization": window.sessionStorage.accessToken},
          dataType: 'json',
          success: function(data){
            //alert("The server says success!!: " +data);
            console.log(data);
            $("#name").text('Hello '+data.username);
          },
          error: function(data){
            alert("The server says error! : ");
            console.log(data);
          }
        });

</script>
 类似资料:
  • 在DropWizard中,我可以设置基本身份验证,如下所示(在impl中): 领域在DropWizard中是什么意思,在中指定它有什么意义?它创造了一些东西与这个领域在引擎盖下?

  • Dropwizard是否也支持摘要验证?我只找到了基本的身份验证和OAuth。这方面的示例代码会很好。 null

  • 我试图将用于需要基本HTTP身份验证的第三方服务。我正在使用。以下是我到目前为止的结论:

  • 我正在将swagger应用于我的一个项目。 然后,他们应该在标头中随每次调用一起发送此令牌。 所以它就像: 看看swagger文档,它似乎只是为了处理OAuth而设置的。有没有办法让swagger以我的方式处理身份验证?我的意思是在生成的代码中。我可以为项目生成代码,它只有“Basic:...”作为选项。

  • 问题内容: 这是一个具有登录屏幕的现有系统,现在我将某些服务公开为REST服务。我为此Rest(jersey)服务构建了一个身份验证令牌登录系统。用户发送用户名密码,然后服务器返回计算为的令牌; 用户将使用此令牌登录应用程序以获取进一步的请求。并且服务器将令牌的副本与时间戳和用户ID一起保留在数据库中,如果时间戳有效,则登录该用户。 考虑使用 HTTPS ,有几个问题; 我的设计看起来一切正常吗?

  • 我在REST api中使用JWT承载身份验证方案。为了在成功身份验证后将jwt令牌返回给客户端,目前我在正文中使用访问令牌响应,如中所述https://www.rfc-editor.org/rfc/rfc6750#page-10 但是也需要在其他HTTP请求中返回令牌,例如已经存在正文的注册。因此,正在考虑为其使用“身份验证信息”标头。但是承载方案没有在任何地方指定“身份验证信息”标头。我应该使用