我正在使用Spring OAuth2实现单独的资源和自定义身份验证服务器。我已经通过发出和验证JWT令牌配置了与身份验证服务器的交互,看起来一切都很好。
现在我正在尝试添加SSO功能,但真的坚持了下来。我研究了官方的Spring示例和附带的指南,但是当涉及到将SSO部分与自定义服务器身份验证连接时,它的措辞非常简短。而且实际上作者只使用外部提供程序资源(“user”信息)来显示进程。
我认为这是正常的事情,所有的SSO方式的身份验证和自定义注册。例如,我可以看到它在stackoverflow中很好地工作。
我正在寻找关于在资源服务器上处理由多个SSO提供程序和自定义身份验证服务器发出的不同类型令牌的任何信息的指导。也许我可以使用auth链来做到这一点和一些意思区分令牌格式,以知道如何处理它。Spring Oauth2有可能吗?或者我需要手动做这个魔术?
现在,我只有一个“也许很奇怪”的想法:完全不让我自己的资源服务器参与SSO。在收到Facebook(例如)令牌后-只需将其与自定义身份验证服务器交换为api JWT令牌(在途中关联或创建用户),然后与资源服务器一起使用标准基础
我至少找到了一些东西。我读过关于在授权链中配置过滤器的文章,并将给定的社交令牌翻译为“POST Authenticate”(毕竟不是一个疯狂的想法)。但这主要是通过SpringSocial完成的。所以现在的问题是:如何做到这一点?忘记说我正在使用密码授予在自定义服务器上进行身份验证。客户端将只是可信的应用程序,我甚至不确定浏览器客户端(只考虑本机移动选项)。即使我决定使用浏览器客户端,我也要确保它有后端来存储感知信息
好的,在努力实现这样的行为之后,我使用了两个不同的库(SpringSocial&OAuth2)。我决定走自己的路,用Spring Oauth2就行了:
>
我有资源服务器、身份验证服务器和客户机(由Java备份并使用OAuth2客户机库,但可以是任何其他客户机)--我的资源只能使用由我自己的身份验证服务器提供的我自己的JWT身份验证令牌来消耗
在自定义注册的情况下:客户端从身份验证服务器获取JWT令牌(带有刷新令牌)并将其发送到res服务器。Res服务器使用公钥验证它并将资源返回
在SSO的情况下:客户端获得Facebook(或其他社交平台令牌),并用我的自定义身份验证服务器将其交换为我的自定义JWT令牌。我已经使用自定义的SocialTokenGranter在我的身份验证服务器上实现了这一点(目前仅处理facebook社交令牌。对于每个社交网络,我都需要单独的授权类型)。该类对facebook身份验证服务器进行额外调用,以验证令牌并获取用户信息。然后它从我的db中检索社交用户或创建新的并将JWT令牌返回给客户端。到现在为止没有进行用户合并。现在已经超出了范围。
public class SocialTokenGranter extends AbstractTokenGranter {
private static final String GRANT_TYPE = "facebook_social";
GiraffeUserDetailsService giraffeUserDetailsService; // custom UserDetails service
SocialTokenGranter(
GiraffeUserDetailsService giraffeUserDetailsService,
AuthorizationServerTokenServices tokenServices,
OAuth2RequestFactory defaultOauth2RequestFactory,
ClientDetailsService clientDetailsService) {
super(tokenServices, clientDetailsService, defaultOauth2RequestFactory, GRANT_TYPE);
this.giraffeUserDetailsService = giraffeUserDetailsService;
}
@Override
protected OAuth2Authentication getOAuth2Authentication(ClientDetails clientDetails, TokenRequest request) {
// retrieve social token sent by the client
Map<String, String> parameters = request.getRequestParameters();
String socialToken = parameters.get("social_token");
//validate social token and receive user information from external authentication server
String url = "https://graph.facebook.com/me?access_token=" + socialToken;
Authentication userAuth = null;
try {
ResponseEntity<FacebookUserInformation> response = new RestTemplate().getForEntity(url, FacebookUserInformation.class);
if (response.getStatusCode().is4xxClientError()) throw new GiraffeException.InvalidOrExpiredSocialToken();
FacebookUserInformation userInformation = response.getBody();
GiraffeUserDetails giraffeSocialUserDetails = giraffeUserDetailsService.loadOrCreateSocialUser(userInformation.getId(), userInformation.getEmail(), User.SocialProvider.FACEBOOK);
userAuth = new UsernamePasswordAuthenticationToken(giraffeSocialUserDetails, "N/A", giraffeSocialUserDetails.getAuthorities());
} catch (GiraffeException.InvalidOrExpiredSocialToken | GiraffeException.UnableToValidateSocialUserInformation e) {
// log the stacktrace
}
return new OAuth2Authentication(request.createOAuth2Request(clientDetails), userAuth);
}
private static class FacebookUserInformation {
private String id;
private String email;
// getters, setters, constructor
}
}
并从扩展AuthorizationServerConfigurerAdapter的类:
private TokenGranter tokenGranter(AuthorizationServerEndpointsConfigurer endpoints) {
List<TokenGranter> granters = new ArrayList<>(Arrays.asList(endpoints.getTokenGranter()));
granters.add(new SocialTokenGranter(giraffeUserDetailsService, endpoints.getTokenServices(), endpoints.getOAuth2RequestFactory(), endpoints.getClientDetailsService()));
return new CompositeTokenGranter(granters);
}
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
oauthServer
...
.allowFormAuthenticationForClients() // to allow sending parameters as form fields
...
}
clientSecret(取决于客户端类型。不适用于单页客户端)
用户名
密码
refresh_token
授予类型
对于'Facebook_Social'授予类型,客户端应发送下一个参数:
facebook_social_token(自定义域)
授予类型
根据客户机的设计,发送这些请求的方式将有所不同。在我的例子中,基于测试Java的客户机使用Spring OAuth2库获取社交令牌,我使用重定向控制器(使用facebook开发页面配置中定义的url调用控制器)执行令牌交换过程。
我正在使用预装的Visual Studio解决方案开发我的首批OAuth解决方案之一。 不过,同时我也希望我的服务器应用程序拥有“完全访问权限”。他们需要能够获得列表增加多个用户,删除东西等等。 下面是我的问题,我认为这些问题可以很容易地一起回答: 如何管理两个短期令牌(承载令牌?)连同永久令牌(API令牌?) 我在访问级别上有何不同,因此某些方法需要永久令牌? 在同一方法中,我在访问级别上有何不
我试图在一个反应式Spring Boot应用程序中配置一个Spring Security性,该应用程序具有一个Vuejs前端,在未经身份验证时将用户重定向到外部OpenID提供程序(用于身份验证)。在用户通过OpenID提供程序进行身份验证并重定向回应用程序(前端)后,将根据OpenID提供程序的响应创建用户名密码身份验证令牌(身份验证),并手动进行身份验证。 但是,在执行此操作时,应用程序似乎无
问题内容: 确保GWT + Tomcat应用程序执行身份验证和授权的最佳策略是什么? 问题答案: 有两种基本策略: 确保入口点; 保护远程服务。 最简单的方法是使用常规的Web应用程序安全工具来限制对GWT生成的html / js文件的访问: 春季安全; web.xml约束。 这样可以让您拥有eg 和。 保护远程服务 如果上述解决方案还不够,您可以进行更深入的研究。我已经通过Spring Secu
我的问题是,我们有一组运行SiteMinder但非常糟糕的遗留代码。它允许IIS匿名并避免使用Active Directory。 我们正在重建此应用程序,并希望将SiteMinder与IIS和集成。净额4.0。我知道我可以构建自己的安全框架,无需用户名和密码即可完成所有工作(因为我们不希望SiteMinder提供),但我想知道是否有办法使用内置的Windows身份验证(窗体或Windows)与Si
于是我在这里看到:https://firebase . Google . com/docs/auth/web/account-linking # link-auth-provider-credentials-to-a-user-account现在可以在Firebase中链接用户账号了。我还看到Firebase提供了匿名认证的功能,它为一个用户创建一个用户会话,不需要任何凭证。 在我们的应用程序中,