使用Spring Boot创建gRPC应用程序,并使用Auth0等进行JWT身份验证
本文是SRA Advent Calendar 2023的第一天文章。
你好!我是关西事业部的佐佐木。
请用中国母语重新表达以下内容,只需要一种选项 :
使用SpringBoot开发gRPC应用程序
懂得使用SpringBoot构建Web应用程序的Java工程师应该不少。因此,在制作gRPC应用程序时,自然希望能够继续使用熟悉的Spring。使用SpringBoot来创建gRPC应用程序非常简单,只需添加依赖关系LogNet的grpc-spring-boot-starter([https://github.com/LogNet/grpc-spring-boot-starter] (https://github.com/LogNet/grpc-spring-boot-starter))。
如果使用Gradle的话
dependencies {
implementation 'io.github.lognet:grpc-spring-boot-starter:5.1.5'
}
只需进行一些设置,然后从proto文件生成的XxxGrpc.XxxImplBase 类进行继承并实现即可。
通过这样,就能使用SpringBoot创建gRPC应用程序,但如果想要在创建的gRPC应用中将Auth0作为授权服务器并集成JWT验证,应该怎么做呢?
实际上,当在互联网上搜索时,会得到一定数量的相关信息,但是关于这个问题直接解释的文章却很少。在上述的LogNet的grpc-spring-boot-starter中,在「10. Spring Security Integration」一节中,详细记录了关于 Basic、Bearer 和 Custom 方案所需的依赖库。
对于通过Auth0进行JWT验证的gRPC,我们需要将 “Authorization” 作为元数据的键,并设置值为 “Bearer <由Auth0颁发的JWT>”,然后发送请求。在这里,”Bearer” 是相应的方案。
因此,查看Bearer所需的依赖库时,我们可以看到
-
- org.springframework.security:spring-security-config
-
- org.springframework.security:spring-security-oauth2-jose
- org.springframework.security:spring-security-oauth2-resource-server
写了下来。
虽然可以老老实实地设置这三个库,但像我这样的懒人不愿意。
- org.springframework.boot:spring-boot-starter-oauth2-resource-server
在这个设定中只需要处理一个就很方便了。(还会添加上述的三个库)
当将这些库添加到依赖关系中时,将执行Spring Security的验证处理。
因此,如果直接调用它,将返回未授权错误。
接下来,在application.yml文件中将Auth0的URL设置为一个服务器(授权服务器),以便获取JWKS。
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: https://osakeganomitai.jp.auth0.com/
spring.security.oauth2.resourceserver.jwt.issuer-uri是用来配置Auth0服务器的关键字。请务必不要忘记最后的斜杠”/”。
作为应用程序的一方,到此为止。
请启动应用程序,将JWT设置到gRPC元数据中并执行请求。
如果没有出现UNAUTHENTICATED错误,则表示成功。
SpringBootTest该怎么做呢?
如果是普通的方法单位的单元测试,那么这与相干无关。
但是,对于通过@SpringBootTest进行的测试,在实际情况下会启动此应用程序,所以JWT验证功能会起作用。
在单元测试代码中访问Auth0并获取JWT是没有问题的,但是有一些麻烦。
在这种情况下,可以在src/test/resources下创建application.yml,而不是在src/main/resources中。
grpc:
security:
auth:
enabled: false
通过进行此设置,您可以仅在测试运行期间禁用JWT验证。
希望以上的内容对您有所帮助。