Spring - Oauth:如何用 JSON-Response 替换 HTML 身份验证失败页面

Posted

技术标签:

【中文标题】Spring - Oauth:如何用 JSON-Response 替换 HTML 身份验证失败页面【英文标题】:Spring - Auth: How to replace HTML authentification failure page with JSON-Response 【发布时间】:2020-11-08 16:39:24 【问题描述】:

我有两个 Spring Boot 服务。

    第一个是 AuthServer (@EnableAuthorizationServer) 第二个是 ResourceServer (@EnableResourceServer)

当我调用 ResourceServer 的 REST 接口的方法时,在没有发送有效令牌的情况下,我在 Postman 中收到以下错误:

<!doctype html>
<html lang="en">

<head>
    <title>HTTP Status 500 – Internal Server Error</title>
    <style type="text/css">
        body 
            font-family: Tahoma, Arial, sans-serif;
        

        h1,
        h2,
        h3,
        b 
            color: white;
            background-color: #525D76;
        

        h1 
            font-size: 22px;
        

        h2 
            font-size: 16px;
        

        h3 
            font-size: 14px;
        

        p 
            font-size: 12px;
        

        a 
            color: black;
        

        .line 
            height: 1px;
            background-color: #525D76;
            border: none;
        
    </style>
</head>

<body>
    <h1>HTTP Status 500 – Internal Server Error</h1>
</body>

</html>

一个错误HTML页面...但我更喜欢这样的东西:


    "timestamp": "2020-07-19T08:59:06.002+00:00",
    "status": 401,
    "error": "Invalid Token",
    "message": "Plz use a valid token",
    "path": "/rest/portfolio/2"

如何设置我的自定义身份验证失败响应?我必须在 AuthServer-Service 或 ResourceServer 中执行此操作吗?

如果我根本没有发送 Authoriation-Header,我会得到

<UnauthorizedException>
    <error>unauthorized</error>
    <error_description>Vollständige Authentifikation wird benötigt um auf diese Resource zuzugreifen</error_description>
</UnauthorizedException>

我也希望将其替换为自定义消息。

非常感谢

【问题讨论】:

【参考方案1】:

你需要有自己的Authentication Entry Point,并在ResourceServerConfigurerAdapter -&gt; (HttpSecurity http)中配置就好

...
.and()
.exceptionHandling()
.authenticationEntryPoint(customAuthenticationEntryPoint)
...

示例身份验证入口点:

/**
 * Returns a 401 error code (Unauthorized) to the client.
 */
@Component
public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint 
    @Autowired
    com.fasterxml.jackson.databind.ObjectMapper mapper;

    public void commence(HttpServletRequest request,
                         HttpServletResponse response,
                         AuthenticationException ae) throws IOException, ServletException 

           Map<String, Object> jsonResponse = new HashMap<>();
           jsonReponse.put("status", false);
           
           /*Put everything else into this map or better you can have a class       to hold your response and initialise that here */
          
          response.setStatus(HttpStatus.UNAUTHORIZED.value());
          response.setContentType(MediaType.APPLICATION_JSON_VALUE);
          objectMapper.writeValue(response.getWriter(), responseJson);     
    

【讨论】:

以上是关于Spring - Oauth:如何用 JSON-Response 替换 HTML 身份验证失败页面的主要内容,如果未能解决你的问题,请参考以下文章

Rest,Spring 拥有 OAuth2 服务器 + OAuth2 提供商,如 Facebook、Google、Yahoo

如何为 spring webflux 应用程序配置 oauth2 资源服务器?

Spring Security - OAuth2 和 CustomAuthenticationProvider。如何为每个配置不同的 URL 模式?

如何用 Spring 解锁 Liquibase 锁?

spring的ioc如何用注解完成?

Spring Data MongoDB:如何用 Spring Aggregation 描述聚合 $merge?