MalformedJwtException:JWT 字符串必须恰好包含 2 个句点字符

Posted

技术标签:

【中文标题】MalformedJwtException:JWT 字符串必须恰好包含 2 个句点字符【英文标题】:MalformedJwtException: JWT strings must contain exactly 2 period characters 【发布时间】:2020-04-07 06:41:15 【问题描述】:

我正在创建一个带有集成了 jwt 的 spring boot 后端的 react 项目。 虽然我可以让我的注册 api 在 POSTMAN 上工作。当我通过反应应用程序(通过 axios)调用我的 api 时,它会发出 MalformedJwtException。甚至在我将 Spring Security 集成到后端之前,一个 GET api 调用就可以正常工作。 我认为这与我创建此问题的 HTTPClient.js 文件有关。 下面是这个

import axios from 'axios'

const id_token = "secret";
axios.defaults.headers.post['Content-Type'] = 'application/json';

var instance = null;

export const setAuth = () => 
instance = axios.create(
    baseURL: '',
    timeout: 30000,

    headers: 
        'Authorization': 'Bearer ' + localStorage.jwt,
        'Content-Type': 'application/json'
    

)

instance.interceptors.response.use(function (response) 
    return response;
, function (error) 
    if (error.response.status === 401) 
        localStorage.removeItem('jwt');
        localStorage.removeItem('user');
        window.location = '/'
    
    else 
        return Promise.reject(error);
    
);


 export const Get=(route, data)=>
    instance|| setAuth()

    return instance.get(route,data)
 

 export const Post = (route, data) => 
  instance || setAuth()
  return instance.post(route, JSON.stringify(data))
 

export const Put = (route, data) => 
instance || setAuth()
return instance.put(route, JSON.stringify(data))


export const Delete = (route, data) => 
instance || setAuth()
return instance.delete(route, JSON.stringify(data))

编辑

cache-control: no-cache, no-store, max-age=0, must-revalidate
connection: close
content-length: 0
date: Sat, 14 Dec 2019 14:47:21 GMT
expires: 0
pragma: no-cache
x-content-type-options: nosniff
x-frame-options: DENY
X-Powered-By: Express
x-xss-protection: 1; mode=block
POST /register HTTP/1.1
Host: localhost:3000
Connection: keep-alive
Content-Length: 193
Accept: application/json, text/plain, */*
Origin: http://localhost:3000
Authorization: Bearer undefined
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/79.0.3945.79 Safari/537.36
Content-Type: application/json
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Referer: http://localhost:3000/Welcome
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

这是我的请求标头

【问题讨论】:

请发布您的请求标头在发送到后端时的样子。您可以通过在浏览器中检查请求来做到这一点。 其次,不要在本地存储中存储 jwt。这将使您的应用程序容易受到跨站脚本攻击 (XSS) 的影响。您应该始终使用 HttpOnly 标志设置为 true 的 cookie。 @ThomasAndolf 我已经添加了请求标头。不记名令牌未定义,但要求 Spring Security 无论如何都允许此请求 @ThomasAndolf 然后你必须处理 CSRF。使用任何一种方法都有风险。 @Joe 我从来没有说过你会受到全面保护,这是你所拥有的选择中较小的邪恶。 【参考方案1】:

我尝试在请求中根本不发送授权标头。不能让它未定义,它根本不应该存在。

【讨论】:

以上是关于MalformedJwtException:JWT 字符串必须恰好包含 2 个句点字符的主要内容,如果未能解决你的问题,请参考以下文章

JWT(Json WEB Token)

找不到类 Firebase\JWT\JWT

JWT实战教程

JWT实战教程

整合JWT

Shiro+JWT 实现权限管理--JWT