private ReactiveOAuth2UserService<OidcUserRequest, OidcUser> getOidcUserService() { ResolvableType type = ResolvableType.forClassWithGenerics(ReactiveOAuth2UserService.class, OidcUserRequest.class, OidcUser.class); ReactiveOAuth2UserService<OidcUserRequest, OidcUser> bean = getBeanOrNull(type); if (bean == null) { return new OidcReactiveOAuth2UserService(); } return bean; }
@Override public Mono<OidcUser> loadUser(OidcUserRequest userRequest) throws OAuth2AuthenticationException { Assert.notNull(userRequest, "userRequest cannot be null"); return getUserInfo(userRequest) .map(userInfo -> new OidcUserAuthority(userRequest.getIdToken(), userInfo)) .defaultIfEmpty(new OidcUserAuthority(userRequest.getIdToken(), null)) .map(authority -> { OidcUserInfo userInfo = authority.getUserInfo(); Set<GrantedAuthority> authorities = new HashSet<>(); authorities.add(authority); String userNameAttributeName = userRequest.getClientRegistration() .getProviderDetails().getUserInfoEndpoint().getUserNameAttributeName(); if (StringUtils.hasText(userNameAttributeName)) { return new DefaultOidcUser(authorities, userRequest.getIdToken(), userInfo, userNameAttributeName); } else { return new DefaultOidcUser(authorities, userRequest.getIdToken(), userInfo); } }); }
@Test public void loadUserWhenOAuth2UserThenUserInfoNotNull() { Map<String, Object> attributes = new HashMap<>(); attributes.put(StandardClaimNames.SUB, "sub123"); attributes.put("user", "rob"); OAuth2User oauth2User = new DefaultOAuth2User(AuthorityUtils.createAuthorityList("ROLE_USER"), attributes, "user"); when(this.oauth2UserService.loadUser(any())).thenReturn(Mono.just(oauth2User)); assertThat(this.userService.loadUser(userRequest()).block().getUserInfo()).isNotNull(); }
@Before public void setup() { this.userService.setOauth2UserService(this.oauth2UserService); }
private ReactiveOAuth2UserService<OidcUserRequest, OidcUser> getOidcUserService() { ResolvableType type = ResolvableType.forClassWithGenerics(ReactiveOAuth2UserService.class, OidcUserRequest.class, OidcUser.class); ReactiveOAuth2UserService<OidcUserRequest, OidcUser> bean = getBeanOrNull(type); if (bean == null) { return new OidcReactiveOAuth2UserService(); } return bean; }
@Override public Mono<OidcUser> loadUser(OidcUserRequest userRequest) throws OAuth2AuthenticationException { Assert.notNull(userRequest, "userRequest cannot be null"); return getUserInfo(userRequest) .map(userInfo -> new OidcUserAuthority(userRequest.getIdToken(), userInfo)) .defaultIfEmpty(new OidcUserAuthority(userRequest.getIdToken(), null)) .map(authority -> { OidcUserInfo userInfo = authority.getUserInfo(); Set<GrantedAuthority> authorities = new HashSet<>(); authorities.add(authority); String userNameAttributeName = userRequest.getClientRegistration() .getProviderDetails().getUserInfoEndpoint().getUserNameAttributeName(); if (StringUtils.hasText(userNameAttributeName)) { return new DefaultOidcUser(authorities, userRequest.getIdToken(), userInfo, userNameAttributeName); } else { return new DefaultOidcUser(authorities, userRequest.getIdToken(), userInfo); } }); }
@Test public void loadUserWhenOAuth2UserAndUser() { this.registration.userNameAttributeName("user"); Map<String, Object> attributes = new HashMap<>(); attributes.put(StandardClaimNames.SUB, "sub123"); attributes.put("user", "rob"); OAuth2User oauth2User = new DefaultOAuth2User(AuthorityUtils.createAuthorityList("ROLE_USER"), attributes, "user"); when(this.oauth2UserService.loadUser(any())).thenReturn(Mono.just(oauth2User)); assertThat(this.userService.loadUser(userRequest()).block().getName()).isEqualTo("rob"); }
private ReactiveOAuth2UserService<OidcUserRequest, OidcUser> getOidcUserService() { ResolvableType type = ResolvableType.forClassWithGenerics(ReactiveOAuth2UserService.class, OidcUserRequest.class, OidcUser.class); ReactiveOAuth2UserService<OidcUserRequest, OidcUser> bean = getBeanOrNull(type); if (bean == null) { return new OidcReactiveOAuth2UserService(); } return bean; }
@Test public void loadUserWhenOAuth2UserEmptyThenNullUserInfo() { when(this.oauth2UserService.loadUser(any())).thenReturn(Mono.empty()); OidcUser user = this.userService.loadUser(userRequest()).block(); assertThat(user.getUserInfo()).isNull(); }
@Test public void loadUserWhenOAuth2UserSubjectNotEqualThenOAuth2AuthenticationException() { Map<String, Object> attributes = new HashMap<>(); attributes.put(StandardClaimNames.SUB, "not-equal"); attributes.put("user", "rob"); OAuth2User oauth2User = new DefaultOAuth2User(AuthorityUtils.createAuthorityList("ROLE_USER"), attributes, "user"); when(this.oauth2UserService.loadUser(any())).thenReturn(Mono.just(oauth2User)); assertThatCode(() -> this.userService.loadUser(userRequest()).block()) .isInstanceOf(OAuth2AuthenticationException.class); }
@Test public void loadUserWhenOAuth2UserSubjectNullThenOAuth2AuthenticationException() { OAuth2User oauth2User = new DefaultOAuth2User(AuthorityUtils.createAuthorityList("ROLE_USER"), Collections.singletonMap("user", "rob"), "user"); when(this.oauth2UserService.loadUser(any())).thenReturn(Mono.just(oauth2User)); assertThatCode(() -> this.userService.loadUser(userRequest()).block()) .isInstanceOf(OAuth2AuthenticationException.class); }
@Test public void loadUserWhenUserInfoUriNullThenUserInfoNotRetrieved() { this.registration.userInfoUri(null); OidcUser user = this.userService.loadUser(userRequest()).block(); assertThat(user.getUserInfo()).isNull(); }