如何在Spring Boot中使用OAuth 2.0 GitHub token


  • GIVEN:

Spring Boot App,GitHub Client ID,GitHub Client Secret

SecurityConfigurationclass:

@AllArgsConstructor
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
public class SecurityConfiguration {
private final AuthenticationExceptionHandler authenticationExceptionHandler;
private final AccessDeniedExceptionHandler accessDeniedExceptionHandler;
private final OAuth2UserService<OAuth2UserRequest, OAuth2User> oAuth2UserService;
@Bean
protected SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.headers().frameOptions().sameOrigin()
.and()
.authorizeRequests(a -> a
.antMatchers("/", "/login/**", "/error", "/webjars/**").permitAll()
.anyRequest().authenticated()
)
.exceptionHandling(e -> e
.authenticationEntryPoint(authenticationExceptionHandler)
.accessDeniedHandler(accessDeniedExceptionHandler)
)
.csrf(c -> c
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
)
.logout(l -> l
.logoutSuccessUrl("/").permitAll()
)
.oauth2Login();
return http.build();
}
  • WHEN:

使用Postman发送请求GET http://{server:port}/oauth2/authorization/github,我得到响应:

Token Name:GitHub Token
Access Token: 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
Token Type: bearer
scope: read%3Auser
access_token_url: https://github.com/login/oauth/access_token
client_id: 8946552286f96669e25a
client_secret: efd47baa823358fbbf109c5249e2699612ab44b2
timestamp: 1680770881579
  • What I do:

我将以下内容添加到GET http://{server:port}/api/v1/users请求GitGub Access Token标头:

Authorization: Bearer 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
  • THEN:

I got error:

{
"httpStatus": "UNAUTHORIZED",
"exceptionBody": {
"errorMessages": [
"Access denied. Only authenticated users can perform this action"
],
"errorCode": 40106
}
}
  • QUESTIONS:

在发送后续请求时如何继续使用此接收令牌?

Spring Boot里面有地方检查这个令牌的有效性吗?

我正在Spring Boot应用程序中等待(可能在过滤器链中)验证GitHub令牌。

您显然缺乏关于OAuth2的一些背景知识,应该澄清您的意图。

  • 从Spring应用程序(使其成为客户端)调用Github api
  • 使用承载访问令牌授权请求到REST API(就像您在问题中所做的那样,并使您的应用程序成为资源服务器)

你写的OAuth2客户端配置(登录和注销)=>此安全过滤器链拦截的请求使用会话而不是访问令牌进行保护。STATELESS会话创建策略与conf的其余部分不一致(明白:这是行不通的)。

使用访问令牌保护的REST API是一个资源服务器,资源服务器不关心登录和注销,这是客户端业务(并且需要状态,通常是会话,来存储令牌)。

要让你的应用成为一个资源服务器,检查你的依赖项(使用spring-boot-starter-oauth2-resource-server,而不是spring-boot-starter-oauth2-client),并应用资源服务器配置(删除登录,注销,认证入口点,用户信息和用户服务)

警告:你的令牌不是JWT字符串。您必须对其进行内省(将您的资源服务器配置为"不透明")。令牌),这是非常低效的,并且对于远程授权服务器来说很难接受。您最好使用带有"社交登录"功能的自己的授权服务器。特性和发布的jwt (Keycloak, Auth0, Cognito和几乎任何其他OIDC提供商都有这种"Login with…")。特性)

我已经写了不少关于OAuth2的教程。您可以在这里找到完整的配置示例。不要跳过OAuth2 essentials部分我已经把第一句话连起来了。它涵盖了OAuth2客户端和OAuth2资源服务器之间的差异,以及内省和JWT解码之间的差异。

相关内容

  • 没有找到相关文章

最新更新