【问题标题】:Spring Security Oauth oauth2UserService(works on github but doesn't work on google)Spring Security Oauth oauth2UserService(在 github 上工作,但在 google 上不工作)
【发布时间】:2020-08-16 17:59:58
【问题描述】:

我正在学习教程https://spring.io/guides/tutorials/spring-boot-oauth2/ 在最后一个示例中,有一个添加错误消息的示例。 一切似乎都很好,但我不明白为什么当我使用 github 登录时,这个 bean 可以工作 但是当我用谷歌登录时它不起作用。(当我调试它时断点在github登录时停止并且在通过谷歌登录时不会停止)。 在哪里注意到仅适用于 github? bean(完全来自示例):

@Bean
public OAuth2UserService<OAuth2UserRequest, OAuth2User> oauth2UserService(WebClient rest) {
    DefaultOAuth2UserService delegate = new DefaultOAuth2UserService();// breakpoint here
    return request -> {
        OAuth2User user = delegate.loadUser(request); //and breakpoint here
        if (!"github".equals(request.getClientRegistration().getRegistrationId())) {
            return user;
        }

        OAuth2AuthorizedClient client = new OAuth2AuthorizedClient
                (request.getClientRegistration(), user.getName(), request.getAccessToken());
        String url = user.getAttribute("organizations_url");
        List<Map<String, Object>> orgs = rest
                .get().uri(url)
                .attributes(oauth2AuthorizedClient(client))
                .retrieve()
                .bodyToMono(List.class)
                .block();

        if (orgs.stream().anyMatch(org -> "spring-projects".equals(org.get("login")))) {
            return user;
        }

        throw new OAuth2AuthenticationException(new OAuth2Error("invalid_token", "Not in Spring Team", ""));
    };
}

【问题讨论】:

    标签: spring-boot spring-security oauth-2.0 spring-social


    【解决方案1】:

    您可以使用 OidcUserService 来挂钩 google oauth 身份验证过程。

    查看下面的文章。

    https://www.devglan.com/spring-security/spring-boot-security-google-oauth

    希望这有帮助..

    【讨论】:

    【解决方案2】:

    Sultan Zhumatayev,对于 google,您必须实施:

    @Bean
    public OAuth2UserService<OidcUserRequest, OidcUser> oidcUserService() {
        final OidcUserService delegate = new OidcUserService();
        return (userRequest) -> {
            // Delegate to the default implementation for loading a user
            OidcUser oidcUser = delegate.loadUser(userRequest);
    
            //OAuth2AccessToken accessToken = userRequest.getAccessToken();
            //Set<GrantedAuthority> mappedAuthorities = new HashSet<>();
    
            // TODO
            // 1) Fetch the authority information from the protected resource using accessToken
            // 2) Map the authority information to one or more GrantedAuthority's and add it to mappedAuthorities
    
            // 3) Create a copy of oidcUser but use the mappedAuthorities instead
            //oidcUser = new DefaultOidcUser(mappedAuthorities, oidcUser.getIdToken(), oidcUser.getUserInfo());
    
            return oidcUser;
        };
    }
    

    【讨论】:

      猜你喜欢
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      • 2017-04-10
      相关资源
      最近更新 更多