JBoss CapeDwarf 是Google App Engine API的一个实现,允许编写为Google AppEngine的应用程序在JBoss应用程序服务器上部署,无需修改。在幕后,CapeDwarf使用现有的JBoss API,如Infinispan、JGroups、PicketLink、HornetQ等。
用户API
在Google AppEngine中,按API方法的数量来说,用户API是最小的API之一。它基本上只包含以下API方法getLoginUrl, getCurrentUser和getLogoutUrl。通过使用用户API,应用程序开发者无需实现任何类型的登录系统,因为认证由AppEngine本身处理。应用程序无需将用户定向到自定义登录表单,只需将用户指向由getLoginUrl返回的URLgetCurrentUser即可。这将使用户能够使用他们的Google帐户、Google Apps域帐户或通过外部OpenID提供者进行登录。用户登录后,将被重定向回应用程序。然后,应用程序可以通过调用
API方法来简单地获取已登录用户的电子邮件地址。
为了允许现有GAE应用程序迁移到CapeDwarf以及从CapeDwarf迁移,CapeDwarf还必须支持使用Google帐户,而不引入任何自定义用户认证方法。多亏了PicketLink Social中的OpenID支持,这变得非常简单。
OpenID是一个开放标准,允许用户通过受信任的第三方服务进行认证。在CapeDwarf的情况下,第三方服务是Google帐户OpenID提供者。
使用PicketLink Social通过Google帐户认证用户是一个非常简单的过程。
将用户定向到OpenID提供者的认证页面getLoginUrl当用户请求由返回的登录URL时,CapeDwarf的AuthServlet实例化PicketLink Social的OpenIDManager的一个实例返回的登录URL时并将其与CapeDwarf自己的实现
OpenIDManager manager = new OpenIDManager(new OpenIDRequest("https://www.google.com/accounts/o8/id")); CapedwarfOpenIDProtocolAdaptor adapter = new CapedwarfOpenIDProtocolAdaptor(request, response, getReturnUrl(request)); OpenIDManager.OpenIDProviderList providers = manager.discoverProviders(); OpenIDManager.OpenIDProviderInformation providerInfo = manager.associate(adapter, providers); manager.authenticate(adapter, providerInfo);
幕后,管理员调用OpenIDManager并指示它将用户重定向到OpenID提供者的URL。重定向可以通过标准HTTP重定向或通过向浏览器发送自动提交的HTML表单来实现(当OpenID负载大于2048字节时,这是必要的)。
然后OpenID提供者将登录表单显示给用户(或以某种其他方式验证用户)。
处理用户从OpenID提供者认证页面的返回
用户认证成功后,提供者将浏览器重定向回消费者 - CapeDwarf。这个返回请求也由AuthServlet处理。Servlet通过在返回的登录URL时上调用verify()来验证用户是否已认证。如果用户已认证,CapeDwarf现在可以访问认证用户的电子邮件地址,将其存储在会话中,并将浏览器重定向到在第一步请求登录URL时应用程序提供的目标URL。
boolean authenticated = manager.verify(adapter, getStringToStringParameterMap(request), getFullRequestURL(request)); if (authenticated) { response.sendRedirect(request.getParameter(AuthServlet.DESTINATION_URL_PARAM)); }
在调用verify()方法期间,管理员调用我们的OpenIDManager返回两种类型的OpenIDLifecycleEvents: SESSION和SUCCESS。这些事件指示适配器将某些数据存储在会话中,而SESSIONSUCCESSSUCCESS事件显然表明认证成功。
认证过程现已完成。每当应用程序现在调用用户API的getCurrentUser方法时,CapeDwarf将返回已认证用户的电子邮件地址。电子邮件地址仅用于标识用户。应用程序可以使用该信息的方式由应用程序自己决定。
我们如何处理应用程序管理员
最后一点,还有一个我还没有提到的API方法,即isUserAdmin。从方法名称显然可以看出,如果登录用户是应用程序的管理员(无论是上传应用程序到Google AppSpot的Google用户,还是通过Google Cloud Console手动添加为管理员的另一个用户),则此方法返回true。
由于将AppEngine应用程序部署到CapeDwarf时没有与用户帐户/电子邮件相关联的概念,因此没有管理员的概念。要指定应用程序的管理员是谁,您需要像这样在capedwarf-web.xml中列出他们的电子邮件地址
<capedwarf-web-app> <admin>my.email@gmail.com</admin> <admin>another.admin.email@gmail.com</admin> </capedwarf-web-app>
更多信息
有关CapeDwarf如何使用PicketLink Social的完整源代码,请参阅CapeDwarf的用户模块,该模块位于GitHub存储库中