使用 Vue.js,我尝试使用 Spring Boot 在 RESTful API 中实现 JWT 登录表单,但除非我将不记名令牌添加到请求中,否则我得到的只是 403 状态。 我已将端点设置为无需任何许可即可访问,并且在邮递员上可以在没有授权标头的情况下发送请求。 这是我在 Spring 上的安全配置的一部分:
.antMatchers(HttpMethod.POST, "/auth/login") .permitAll()
这是我发出 POST 请求的 vue.js 服务:
import axios from 'axios' let USER_API_BASE_URL = 'http://localhost:8080/auth/login/' let config = { headers: { 'Content-Type': 'application/json', 'Authorization': "Bearer (hereGoesTheToken)" }} class LoginService{ postLogin(emailInput, passwordInput){ let user = JSON.stringify({email: emailInput, password: passwordInput}); var response = axios.post(USER_API_BASE_URL, user, config); console.log(response) return response } } export default new LoginService()
我想要做到这一点,这样就不需要令牌就可以访问您请求相同令牌的部分...有什么方法可以做到这一点吗?
我不是 100% 确定,但您的 403 很可能是由 CSRF 保护引起的。查看 JWT登录示例了解如何在服务器上启用 JWT 身份验证的示例。
综上所述,如果您启用HTTP basic (
.httpBasic()
)并禁用会话管理(.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
),您还可以禁用CSRF (.csrf() .disable()
)。这将是实现您想要做的事情的推荐方法,因为无状态服务器(就会话管理而言)不易受到 CSRF 保护的影响。您还可以实现自己的身份验证端点,这是您的示例,在这种情况下您不需要启用
.httpBasic()
。在这种情况下,您可以使用.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt)
。请查看此 Tanzu Tuesday 演讲,了解有关 JWT 身份验证的更多信息(为什么以及为什么不)。需要指出的是,服务器上任何形式的会话都会使您容易受到 CSRF 攻击,因此确保
JSESSIONID
或类似内容不会进入浏览器非常重要。请参阅这个问题和其他几个类似的问题,因为类似的问题已经以前经常问。