本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
本文链接地址: https://www.huangyunkun.com/2017/03/09/use-onelogin-okta-sso/
Okta是专业的身份管理平台,它是以整合的思路管理企业应用和资源。
如果企业有一个内部应用需要认证后使用,那么Okta提供的单点登录功能就是一个很好的集成点。集成Okta可以将用户认证部分从应用剥离,使用者还是可以使用Okta的信息登录,并且应用也能获得对应的信息。
本文选用的是通过SAML协议集成Okta。SAML即安全断言标记语言,英文全称是Security Assertion Markup Language。 它是一个基于XML的标准,用于在不同的安全域(security domain)之间交换认证和授权数据。
来个示意图:

从图中可以看到集成部分从收到Response之后应用就获得用户的信息(比如Name ID),之后的事情就是应用自己的了。
Saml毕竟是一个标准协议,直接使用公开的库就行了。OpenSaml本来是最合适的,但是使用有些麻烦,最后选择的是onelogin的java-saml库。
必要的配置只有五个
onelogin.saml2.sp.entityid onelogin.saml2.sp.assertion_consumer_service.url onelogin.saml2.idp.entityid onelogin.saml2.idp.single_sign_on_service.url onelogin.saml2.idp.x509cert
这个在Okta的配置页面就有。
一般应用程序需要提供两个功能点,一个是GET方法检测是否需要进入SSO流程,一个是POST方法用于接收Saml的返回断言。
@GET
public Response showLoginPage(@Context HttpServletResponse response,
@Context HttpServletRequest request) throws Exception {
Auth auth = new Auth(request, response);
auth.login();
return Response.ok().build();
}
@POST
public Response retrieveInformation(@Context HttpServletResponse response,
@Context HttpServletRequest request,
@Context UserRepository userRepository,
@Context AuthenticationService authenticationService) throws Exception {
Auth auth = new Auth(request, response);
auth.processResponse();
if(auth.isAuthenticated() && auth.getErrors().isEmpty()) {
String userId = auth.getNameId();
// 自己的逻辑处理
return Response.temporaryRedirect(uri).build();
}else{
return Response.serverError().build();
}
}
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
本文链接地址: https://www.huangyunkun.com/2017/03/09/use-onelogin-okta-sso/