Custom SignIn&注册RESTlet + GAE / J?

时间:2011-03-23 13:53:10

标签: google-app-engine authentication restlet-2.0

我目前正在使用Google App Engine / Java上的RESTlet开发一个小项目。

我正在搜索..正在搜索..并且无法找到我怀疑的确切或可理解的解决方案。

我的问题是我怎么想实现自己的SignIn& SignUp模块没有使用谷歌的UserService或Spring Security ??

是否有可用的实际示例代码?

我的意思是SignUp部分只是一个简单的JDO插入&选择模块。我只想说我已经做到了。

我应该如何处理每个用户的请求会话和身份验证?

我正在考虑在每个请求上使用HTTPS。

任何建议或帮助都会非常感激!

提前致谢。

2 个答案:

答案 0 :(得分:1)

在Restlet中,您在客户端和服务器端都有安全支持。在客户端,您可以使用ChallengeResponse实体指定安全提示。此功能已打开,您可以指定所需的身份验证类型。在以下代码中,我使用基于用户名/密码的http基本身份验证:

ClientResource cr = new ClientResource(uri);
ChallengeScheme scheme = ChallengeScheme.HTTP_BASIC; 
ChallengeResponse authentication = new ChallengeResponse(
                          scheme, "username", "password"); 
cr.setChallengeResponse(authentication);

Restlet将在相应的请求中自动构建必要的标头。您可以注意到Restlet通过其扩展支持各种身份验证类型。我知道目前已经完成了一些工作来支持OAuth v2(参见http://wiki.restlet.org/developers/172-restlet/257-restlet/310-restlet.html)。

在服务器端,您需要使用ChallengeAuthenticator实体在路由级别保护访问,如下所述。这可以在您的Restlet应用程序中完成:

public Restlet createInboundRoot() {
    Router router = new Router(getContext());

    ChallengeAuthenticator guard = new ChallengeAuthenticator(getContext(),
                                         ChallengeScheme.HTTP_BASIC, "realm");
    guard.setVerifier(verifier);
    guard.setEnroler(enroler);

    guard.setNext(router);
    return guard;
}

与客户端类似,此支持是通用的,并且基于需要在防护上指定的两个接口:

  • 用于检查身份验证是否成功的验证者
  • 用于填写经过身份验证的用户的角色的enroler

您可以注意到双方都需要使用相同的安全技术......

如果要管理用户的身份验证会话,则需要使用cookie自行实现。

当在服务器端成功进行身份验证时,您可以返回包含安全令牌的cookie,该令牌允许您从数据库中检查用户(例如)。下面的一些代码可以实现:

CookieSetting cookie = new CookieSetting(0,
                 SECURITY_COOKIE_NAME, securityToken);
Series<CookieSetting> cookieSettings = response.getCookieSettings();
cookieSettings.clear();
cookieSettings.add(cookie);

您可以扩展例如Restlet的SecretVerifier类,以便对收到的安全数据添加测试,并在接收安全cookie时添加此代码。

在客户端,您需要首次添加身份验证提示,然后按照以下时间重新发送安全cookie:

ClientResource clientResource = (...)
(...)
Cookie securityCookie = new Cookie(0,
             SECURITY_COOKIE_NAME, securityToken);
clientResource.getRequest().getCookies().clear();
clientResource.getRequest().getCookies().add(securityCookie);

希望它会对你有所帮助! 亨利

答案 1 :(得分:0)

如果您对重新使用社交帐户感兴趣,则需要与facebook oauth

等每个帐户进行整合

和/或使用app engine authentication via OpenID

两种方式都定义了一个API来验证客户端,您可以使用UserService或通过cookie管理您自己的状态。