Dropwizard 身份验证 header 令牌
Dropwizard authentication header token
我正在尝试在 Dropwizard web-application 中实施 OAuth2 身份验证。我已经创建了所需的 Authenticator
和 Authorizer
类 并在我的应用程序的 run-method 中添加了 Dropwizard manual 中提供的代码,如下所示:
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));
我需要的行为是,在我的客户通过在我的登录页面上提供 his/her 凭据登录后,我想将客户重定向到我使用 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);
}
}
目前我在登录后收到 "Credentials are required to access this resource." 响应。在阅读了一些令牌身份验证 (nice explanation here) 之后,我发现令牌必须从 [=30] 中的客户端发送=] 每个请求。所以我的问题是如何告诉用户的浏览器(客户端)将令牌包含在未来请求的 header 中?
我通过执行以下操作设法解决了这个问题:
为了验证用户,必须以 Authorization: Bearer <token-value>
的形式在请求的 header 中发送令牌。此令牌由服务器在身份验证时发送,并且必须由客户端/用户存储以便在以后的请求中发送。当我按如下方式提交登录表单时,我通过使用 ajax 请求设法存储了令牌:
<#-- 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-variable 中接收到。所需的令牌位于 data.token - 然后存储。我在名为 "url" 的 JSON 中添加了第二个条目,以指示成功验证后重定向到的路径。
现在令牌在需要时存储在客户端。为了在请求 header 中发送此令牌,我需要改变使用 Dropwizard 提供的视图的方法。我没有直接要求身份验证,而是拆分了视图的资源和经过身份验证的数据资源。为了澄清,请考虑以下示例。用户登录,获取令牌,然后转到显示 his/her 用户名的页面。对于页面,使用 .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");
}
}
和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 可以从中检索用户名。现在要获取用户名并将其放在视图中,只需将脚本添加到 users.ftl
并向 getdetails 资源发出 ajax 请求,在 header 中提供令牌并使用结果将用户名放在视图中。请参阅下面的脚本。
<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 web-application 中实施 OAuth2 身份验证。我已经创建了所需的 Authenticator
和 Authorizer
类 并在我的应用程序的 run-method 中添加了 Dropwizard manual 中提供的代码,如下所示:
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));
我需要的行为是,在我的客户通过在我的登录页面上提供 his/her 凭据登录后,我想将客户重定向到我使用 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);
}
}
目前我在登录后收到 "Credentials are required to access this resource." 响应。在阅读了一些令牌身份验证 (nice explanation here) 之后,我发现令牌必须从 [=30] 中的客户端发送=] 每个请求。所以我的问题是如何告诉用户的浏览器(客户端)将令牌包含在未来请求的 header 中?
我通过执行以下操作设法解决了这个问题:
为了验证用户,必须以 Authorization: Bearer <token-value>
的形式在请求的 header 中发送令牌。此令牌由服务器在身份验证时发送,并且必须由客户端/用户存储以便在以后的请求中发送。当我按如下方式提交登录表单时,我通过使用 ajax 请求设法存储了令牌:
<#-- 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-variable 中接收到。所需的令牌位于 data.token - 然后存储。我在名为 "url" 的 JSON 中添加了第二个条目,以指示成功验证后重定向到的路径。
现在令牌在需要时存储在客户端。为了在请求 header 中发送此令牌,我需要改变使用 Dropwizard 提供的视图的方法。我没有直接要求身份验证,而是拆分了视图的资源和经过身份验证的数据资源。为了澄清,请考虑以下示例。用户登录,获取令牌,然后转到显示 his/her 用户名的页面。对于页面,使用 .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");
}
}
和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 可以从中检索用户名。现在要获取用户名并将其放在视图中,只需将脚本添加到 users.ftl
并向 getdetails 资源发出 ajax 请求,在 header 中提供令牌并使用结果将用户名放在视图中。请参阅下面的脚本。
<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>