使用spring security(openid连接流)将google code grant与access token交换

taor4pac  于 2023-10-20  发布在  Spring
关注(0)|答案(1)|浏览(151)

我想在我的应用程序中提供社交注册/登录。目前正在使用Spring Security来实现这一点。一旦我从谷歌获得令牌,我想在我的后端**生成一个JWT,并将其发布到UI。
Spring security内置流正在工作,但我想指定自定义的redirect-url(用于google provider),我想从google拦截令牌(在回调url中),并想生成我自己的JWT。
我也需要帮助。

配置者:

public class SecurityConfigurer {

    @Autowired
    private JwtTokenProvider jwtTokenProvider;

    @Bean
    @Order(2)
    public SecurityFilterChain oauthSecurityFilter(HttpSecurity http) throws Exception {
        http
                .authorizeRequests(authorizeRequests ->
                        authorizeRequests
                                .antMatchers("/","/webjars/**","/mylogin/**").permitAll()
                                .anyRequest().authenticated()
                )
                .oauth2Login();
        return http.build();
    }

    @Bean
    @Order(1)
    public SecurityFilterChain tokenSecurityFilter(HttpSecurity http) throws Exception {
        http
                .requestMatchers()
                .antMatchers("/api/**","/auth/**") //this is default
                .and()
                .authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .addFilterBefore(new JwtTokenFilter(jwtTokenProvider), UsernamePasswordAuthenticationFilter.class)
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        return http.build();
    }
}

应用程序.yml:

spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: 637192340032-s0f8qes6kvp5612advp3ohsrdf5f9agp.apps.googleusercontent.com
            client-secret:  ***...
            redirect-uri: http://localhost:8080/mylogin/oauth2/code/google
          facebook:
            client-id: 1022739078975165
            client-secret: ****....
            scope:
              - email
              - public_profile
        provide:
          facebook:
            user-info-uri: https://graph.facebook.com/me?email,public_profile
            authorization-uri: https://www.facebook.com/v4.0/dialog/oauth
            token-uri: https://graph.facebook.com/v4.0/oauth/access_token
  data:
    mongodb:
      uri: mongodb+srv://mittr926:[email protected]/mittr?retryWrites=true&w=majority

**回拨URL:**所以在这里我想从谷歌获取令牌,创建JWT并发送回客户端浏览器。

@Controller
public class MyController {

    @GetMapping("/mylogin/oauth2/code/google")
    public Map<String, Object> getToken() {

        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        //JwtAuthenticationToken token = (JwtAuthenticationToken) authentication;
        return Collections.singletonMap("token", "" + "_" + "token");
    }
}

但是authentication并没有像预期的那样到来。它是说匿名用户在点击下面的端点时:http://localhost:8080/mylogin/oauth2/code/google?state= w6CGNbnKtAKRzxRlqWVBwUtoVyObrhTZwNpQNkufqA%3D&code = 4%2F0AfJohXmspjfirTelBDUGGyR8ebD9gkOScuLALdm6MvAAQMmtXlz5ksJfJzbWetZZZ__OSAQ&scope =email+profile+openid+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email&authuser=1&prompt=consent
enter image description here

nue99wik

nue99wik1#

颁发访问令牌是OAuth2授权服务器的职责。您应该从Google选择具有身份联合的授权服务器。几乎市场上的任何OpenID提供商都有一些与任何其他OpenID提供商一起使用的“登录”功能:Keycloak是一个著名的示例,您可以在本地安装,Auth0,Okta和Amazon Cognito只是众多云产品中的几个示例,您甚至可以使用spring-authorization-server自己实现授权服务器(比其他解决方案需要更多的工作和更多的OAuth2知识)。
此外,除非前端呈现在您信任的服务器上(带有模板引擎(如Thymeleaf)的Spring MVC应用程序)您不应该为其提供令牌(最新建议是使用会话和CSRF保护此类应用程序)。你可以像我在this tutorial中一样使用BFF。

相关问题