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