【发布时间】:2021-01-18 05:51:09
【问题描述】:
我有以下配置最少的 Spring Boot 应用程序
application.properties
server.port=8081
spring.security.oauth2.resourceserver.jwt.issuer-uri = http://localhost:8080/auth/realms/master
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.nurgasemetey</groupId>
<artifactId>springboot-keycloak</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-keycloak</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
控制器
@RestController
@RequestMapping("/users")
public class UsersController {
@GetMapping("/status/check")
public String status(@AuthenticationPrincipal Jwt principal) {
return "working";
}
}
似乎 Spring Boot Oauth2 不使用公钥,正如我在代码中看到的那样:
OAuth2ResourceServerProperties
/**
* JSON Web Key URI to use to verify the JWT token.
*/
private String jwkSetUri;
/**
* JSON Web Algorithm used for verifying the digital signatures.
*/
private String jwsAlgorithm = "RS256";
/**
* URI that can either be an OpenID Connect discovery endpoint or an OAuth 2.0
* Authorization Server Metadata endpoint defined by RFC 8414.
*/
private String issuerUri;
/**
* Location of the file containing the public key used to verify a JWT.
*/
private Resource publicKeyLocation;
但是我没有给publicKeyLocation,但是app不用公钥也可以验证。
在底层它使用JwtIssuerValidator 和JwtTimestampValidator 验证器。
另一方面,express-jwt,需要公钥才能离线验证
const express = require('express');
const jwt = require('express-jwt');
const app = express();
const secret = 'secret';
const fs = require('fs');
var publicKey = fs.readFileSync('public.pub');
app.get('/protected', jwt({ secret: publicKey, algorithms: ['RS256'] }), (req, res) => {
res.send('protected');
})
app.listen(3000, () => console.log('server started'));
Spring Boot Oauth 如何在没有公钥的情况下进行验证?
【问题讨论】:
-
http://localhost:8080/auth/realms/master提供什么?大多数令牌颁发者应该公开一个/.well-known/openid-configuration端点,Spring Boot 将尝试自动查找该端点。这个端点告诉 Spring Boot 如何找到 JWKS 端点,这是可以找到公钥的地方。 -
是的,它公开了公钥。感谢您的澄清
标签: spring-boot spring-security jwt spring-oauth2 express-jwt