在Java应用程序中为网站使用google signin

在Java应用程序中为网站使用google signin,java,jersey,grizzly,google-oauth,Java,Jersey,Grizzly,Google Oauth,我已经创建了一个自托管Java应用程序,我想使用Google登录来登录。我举了下面的例子: 这当然有效,但现在我对如何授权服务器上的调用感到有点困惑。在后端,我使用Grizzly+Jersey。如上所述,您可以使用以检查服务器端的身份验证令牌 客户端 用户成功登录后,获取用户的ID令牌: 函数onSignIn(谷歌用户){ var idToken=googleUser.getAuthResponse().id\u token; ... } 并在每个请求中使用标准HTTPAuthorizati

我已经创建了一个自托管Java应用程序,我想使用Google登录来登录。我举了下面的例子:

这当然有效,但现在我对如何授权服务器上的调用感到有点困惑。在后端,我使用Grizzly+Jersey。

如上所述,您可以使用以检查服务器端的身份验证令牌

客户端 用户成功登录后,获取用户的ID令牌:

函数onSignIn(谷歌用户){
var idToken=googleUser.getAuthResponse().id\u token;
...
}
并在每个请求中使用标准HTTP
Authorization
头将
idToken
发送到服务器

服务器端 您可以使用筛选器执行身份验证和/或授权

为了将过滤器绑定到REST端点,JAX-RS提供了元注释,可以如下使用:

@NameBinding
@保留(运行时)
@目标({TYPE,METHOD})
公共@接口安全{}
@Secured
注释将用于修饰一个过滤器类,该过滤器类实现允许您处理请求、获取和验证令牌

帮助您从HTTP请求中提取信息

注释标记了一个扩展接口的实现,JAX-RS/Jersey运行时应该可以在提供者扫描阶段发现该接口

@Secured
@提供者
@优先级(Priorities.AUTHENTICATION)
公共类AuthenticationFilter实现ContainerRequestFilter{
@凌驾
公共无效筛选器(ContainerRequestContext requestContext)引发IOException{
//从HTTP授权请求标头获取令牌标头
字符串标记=
getHeaderString(HttpHeaders.AUTHORIZATION);
//检查令牌是否存在
if(token==null | | token.isEmpty()){
抛出新的NotAuthorizedException(“必须提供令牌”);
}
//验证令牌
validateToken(令牌);
}
私有void validateToken(字符串令牌){
GoogleIdTokenVerifier验证器=新的GoogleIdTokenVerifier
.Builder(新的NetHttpTransport(),新的GsonFactory())
.setAudience(Arrays.asList(客户端ID))
.build();
GoogleIdToken=验证器。验证(令牌);
if(idToken!=null){
有效负载=idToken.getPayload();
System.out.println(“用户ID:+payload.getSubject());
}否则{
抛出新的NotAuthorizedException(“无效令牌”);
}
}
}
要将筛选器绑定到端点方法或类,请使用上面创建的
@Secured
注释对它们进行注释。对于带注释的方法和/或类,将执行过滤器

@Path(“/示例”)
公共类MyEndpoint{
@得到
@路径(“{id}”)
@生成(“应用程序/json”)
公共响应myUnsecuredMethod(@PathParam(“id”)长id){
//此方法未使用@Secured进行注释
//在调用此方法之前,不会执行安全筛选器
...
}
@删除
@安全的
@路径(“{id}”)
@生成(“应用程序/json”)
公共响应mySecuredMethod(@PathParam(“id”)长id){
//此方法用@Secured注释
//将在调用此方法之前执行安全筛选器
...
}
}
在上面的示例中,安全筛选器将仅对
mySecuredMethod(Long)
执行,因为它是用
@Secured

注释的,如上所述,您可以使用以检查服务器端的身份验证令牌

客户端 用户成功登录后,获取用户的ID令牌:

函数onSignIn(谷歌用户){
var idToken=googleUser.getAuthResponse().id\u token;
...
}
并在每个请求中使用标准HTTP
Authorization
头将
idToken
发送到服务器

服务器端 您可以使用筛选器执行身份验证和/或授权

为了将过滤器绑定到REST端点,JAX-RS提供了元注释,可以如下使用:

@NameBinding
@保留(运行时)
@目标({TYPE,METHOD})
公共@接口安全{}
@Secured
注释将用于修饰一个过滤器类,该过滤器类实现允许您处理请求、获取和验证令牌

帮助您从HTTP请求中提取信息

注释标记了一个扩展接口的实现,JAX-RS/Jersey运行时应该可以在提供者扫描阶段发现该接口

@Secured
@提供者
@优先级(Priorities.AUTHENTICATION)
公共类AuthenticationFilter实现ContainerRequestFilter{
@凌驾
公共无效筛选器(ContainerRequestContext requestContext)引发IOException{
//从HTTP授权请求标头获取令牌标头
字符串标记=
getHeaderString(HttpHeaders.AUTHORIZATION);
//检查令牌是否存在
if(token==null | | token.isEmpty()){
抛出新的NotAuthorizedException(“必须提供令牌”);
}
//验证令牌
validateToken(令牌);
}
私有void validateToken(字符串令牌){
GoogleIdTokenVerifier验证器=新的GoogleIdTokenVerifier
.Builder(新的NetHttpTransport(),新的GsonFactory())
.setAudience(Arrays.asList(客户端ID))
.build();
GoogleIdToken=验证器。验证(令牌);
if(idToken!=null){
有效负载=idToken.getPayload();
System.out.println(“用户ID:+payload.getSubject());
}否则{
抛出新的NotAuthorizedException(“无效tok