本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
本文链接地址: 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/