openid:身份认证
身份联合会目前是一个热门话题,至少对于我的客户而言。
它的开始是无辜的:不属于该组织的人需要访问应用程序。 没问题,让我们注册他。 一年后,需求成千上万的用户,身份管理的能力已经超出了它的能力:该软件的大小是针对组织的,而不是针对组织周围的众多第三方用户。 但是,合作伙伴,客户和提供者,他们都有充分的理由来访问内部应用程序,但与其他用户一样,它们也必须被标识并具有权限(身份验证和授权)。
这是身份联合适合的用例之一。身份联合到底是什么? 维基百科将其定义为:
跨多个IT系统甚至组织的用户身份验证过程。
我宁愿将其定义为跨多个域的用户身份验证。 域可以无关紧要地指粗粒度或细粒度的系统。
身份联合的其他用例包括:
- 不希望投资于任何身份管理软件(已购买或开发)且希望委托第三方的初创公司
- 需要出于身份的“新鲜”信息的组织将委派给几乎是“新鲜”的第三方,无论是出于法律原因还是仅仅因为
- 一个分散的组织,该组织将身份验证委派给其单位,但仍需要其应用程序具有互操作性
- 等等
身份联合的一个巨大优势是它是Single Sign-On的基础。 随着可用应用程序数量的增加,对该功能的需求也越来越高:用户忘记了他们的登录名或密码,或者在某个地方记下了它,这会破坏安全性。
无论如何,即使以前的技术提供了一些针对它的功能,身份联合在当今也变得越来越重要。 我在这里考虑LDAP,您可以在其中将LDAP树的某个分支托管在另一个LDAP上。 但是,这是有限的,因为主服务器和委托服务器仍必须共享相同的架构(如果我没记错的话,我已经很长时间没有使用LDAP了)。
随着对身份联合会的需求日益增长,自然而然地会有很多解决方案,但没有明确的标准,无论是标准化的还是事实上的 。 可用技术包括(但不限于): CAS , Shibboleth和OpenId 。 我最近对后者产生了兴趣,不是因为它比其他的要好(我是该领域的新手,并且没有足够的信息来通过这种判断),而是因为Google是在Google自己的ID管理或Google面前的OpenId提供程序应用程序的。 这意味着您可以在Google基础架构上管理您的身份(最多免费提供50个帐户),并使用OpenId对您的用户进行身份验证!
使用OpenId进行身份验证是一个多步骤过程:
- 应用程序从提供程序获取可用的身份验证端点
- 应用程序将用户重定向到这样的身份验证端点之一
- 用户在提供商基础架构上进行身份验证
- 如果成功,提供程序会将流重定向到应用程序
- 最后,应用程序检查身份验证是否成功
幸运的是,有一个可用Java编写的OpenSource项目,它很好地将OpenId的详细内容包装在API中。 这个项目被恰当地命名为OpenId4Java,并且就像一个饰物一样工作。
前两个步骤由以下代码处理:
protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
try{
// API entry point
ConsumerManagermanager=newConsumerManager();
// Get available endpoints
List<?>discoveries=manager.discover("https://www.google.com/accounts/o8/id");
// Bind to endpoint
DiscoveryInformationdiscovered=manager.associate(discoveries);
// Create the auth request, providing return URL
AuthRequestauthReq=manager.authenticate(discovered,request.getRequestURL().toString());
// Redirects to provider login page
response.sendRedirect(authReq.getDestinationUrl(true));
}catch(Exceptione){
thrownewServletException(e);
}
}
只需尝试使用先前的代码,我们的用户就会进入Google的登录页面! 用户通过身份验证后,他将被发送回我们的应用程序:我们只需要管理令牌以验证其完整性即可。 OpenId4Java也可以做到这一点(必须对先前的代码进行一些修改,您可以在源代码中找到它):
protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
ParameterListopenidResp=newParameterList(request.getParameterMap());
DiscoveryInformationdiscovered=(DiscoveryInformation)request.getSession().getAttribute("discovered");
StringBufferreceivingURL=request.getRequestURL();
StringqueryString=request.getQueryString();
if(queryString!=null&&queryString.length()>0){
receivingURL.append("?").append(request.getQueryString());
}
try{
VerificationResultverification=manager.verify(receivingURL.toString(),openidResp,discovered);
Identifierverified=verification.getVerifiedId();
if(verified!=null){
AuthSuccessauthSuccess=(AuthSuccess)verification.getAuthResponse();
request.getRequestDispatcher("/WEB-INF/page/welcome.jsp").forward(request,response);
}else{
request.getRequestDispatcher("/").forward(request,response);
}
}catch(Exceptione){
thrownewServletException(e);
}
}
更好的是,Google支持OpenId扩展,即属性交换扩展(AX)。 当然,如果我们得到用户的同意,这可以让我们从OpenId提供程序中查询有关用户的信息。 OpenId4Java与这样的扩展无缝集成,我们只需要对请求和响应进行一些更新:
FetchRequestfetch=FetchRequest.createFetchRequest();
fetch.addAttribute("Email","http://schema.openid.net/contact/email",true);
fetch.addAttribute("FirstName","http://axschema.org/namePerson/first",true);
fetch.addAttribute("LastName","http://axschema.org/namePerson/last",true);
fetch.addAttribute("Country","http://axschema.org/contact/country/home",true);
fetch.addAttribute("Lang","http://axschema.org/pref/language",true);
authReq.addExtension(fetch);
if(authSuccess.hasExtension(OPENID_NS_AX)){
MessageExtensionext=authSuccess.getExtension(OPENID_NS_AX);
if(extinstanceofFetchResponse){
FetchResponsefetch=(FetchResponse)ext;
request.setAttribute("EMAIL",fetch.getAttributeValue("Email"));
request.setAttribute("FIRST_NAME",fetch.getAttributeValue("FirstName"));
request.setAttribute("LAST_NAME",fetch.getAttributeValue("LastName"));
request.setAttribute("COUNTRY",fetch.getAttributeValue("Country"));
request.setAttribute("LANG",fetch.getAttributeValue("Lang"));
}
}
使用OpenId和OpenId4Java,使用身份联合实际上只需几分钟!
您将在此处找到Eclipse / Maven格式的示例项目的源代码 。
翻译自: https://blog.frankel.ch/identity-federation-and-openid/
openid:身份认证