openid:身份认证_身份联合和OpenId

openid:身份认证

身份联合会目前是一个热门话题,至少对于我的客户而言。

它的开始是无辜的:不属于该组织的人需要访问应用程序。 没问题,让我们注册他。 一年后,需求成千上万的用户,身份管理的能力已经超出了它的能力:该软件的大小是针对组织的,而不是针对组织周围的众多第三方用户。 但是,合作伙伴,客户和提供者,他们都有充分的理由来访问内部应用程序,但与其他用户一样,它们也必须被标识并具有权限(身份验证和授权)。

这是身份联合适合的用例之一。身份联合到底是什么? 维基百科将其定义为:

跨多个IT系统甚至组织的用户身份验证过程。

我宁愿将其定义为跨多个域的用户身份验证。 域可以无关紧要地指粗粒度或细粒度的系统。

身份联合的其他用例包括:

  • 不希望投资于任何身份管理软件(已购买或开发)且希望委托第三方的初创公司
  • 需要出于身份的“新鲜”信息的组织将委派给几乎是“新鲜”的第三方,无论是出于法律原因还是仅仅因为
  • 一个分散的组织,该组织将身份验证委派给其单位,但仍需要其应用程序具有互操作性
  • 等等

身份联合的一个巨大优势是它是Single Sign-On的基础。 随着可用应用程序数量的增加,对该功能的需求也越来越高:用户忘记了他们的登录名或密码,或者在某个地方记下了它,这会破坏安全性。

无论如何,即使以前的技术提供了一些针对它的功能,身份联合在当今也变得越来越重要。 我在这里考虑LDAP,您可以在其中将LDAP树的某个分支托管在另一个LDAP上。 但是,这是有限的,因为主服务器和委托服务器仍必须共享相同的架构(如果我没记错的话,我已经很长时间没有使用LDAP了)。

随着对身份联合会的需求日益增长,自然而然地会有很多解决方案,但没有明确的标准,无论是标准化的还是事实上的 。 可用技术包括(但不限于): CASShibbolethOpenId 。 我最近对后者产生了兴趣,不是因为它比其他的要好(我是该领域的新手,并且没有足够的信息来通过这种判断),而是因为Google是在Google自己的ID管理或Google面前的OpenId提供程序应用程序的。 这意味着您可以在Google基础架构上管理您的身份(最多免费提供50个帐户),并使用OpenId对您的用户进行身份验证!

使用OpenId进行身份验证是一个多步骤过程:

  1. 应用程序从提供程序获取可用的身份验证端点
  2. 应用程序将用户重定向到这样的身份验证端点之一
  3. 用户在提供商基础架构上进行身份验证
  4. 如果成功,提供程序会将流重定向到应用程序
  5. 最后,应用程序检查身份验证是否成功

幸运的是,有一个可用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:身份认证

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值