在 Restlet 中使用 Google 身份验证
Using Google authentication with Restlet
我的应用程序有这个非常基本的身份验证:
MapVerifier mapVerifier = new MapVerifier();
mapVerifier.getLocalSecrets().put("user", "pass".toCharArray());
ChallengeAuthenticator guard= new ChallengeAuthenticator(null, ChallengeScheme.HTTP_BASIC, "Secured Resources");
guard.setContext(getContext());
guard.setVerifier(mapVerifier);
我如何调整它以使用 Google 身份验证方案?也就是说,它不会显示 Username/Password 浏览器弹出窗口,而是会转到 Google 身份验证页面。
我还没完全明白你的问题是什么?如果您想在您的系统中集成 Google 身份验证,请检查 link
google Oauth2
它不依赖于任何框架,它只是重定向和回调,你可以用普通的 servlet 来做,显然你也可以用 restlets 来做
我已经编写了一个简单的库来集成 google 和 Facebook oauth 2,您可以查看它以了解它是如何工作的
我认为您不在质询身份验证的上下文中,您需要利用 Google 的身份验证服务。
如果您想要自定义 Restlet Authenticator
实现,这里是此方法的一个实现(未测试):
public class GoogleAuthenticator extends Authenticator {
private UserService userService;
public GoogleAuthenticator(Context context) {
super(context);
this.userService = UserServiceFactory.getUserService();
}
protected User createUser(com.google.appengine.api.users.User googleUser,
Request request, Response response) {
return new User(googleUser.getUserId());
}
protected boolean authenticate(Request request, Response response) {
// Get current Google user
com.google.appengine.api.users.User googleUser = userService.getCurrentUser();
// Check if the user is authenticated
if (googleUser!=null) {
// Authenticated through Google authentication service
request.getClientInfo().setUser(
createUser(googleUser, request, response));
return true;
} else {
// Not authenticated. Redirect to the login URL
response.redirectSeeOther(userService.createLoginURL(
request.getRequestURI()));
return false;
}
}
}
然而,这种验证器在扩展 org.restlet.ext.gae
中存在了一段时间。它利用了 GAE 的服务 UserService
。所以我认为你有你使用的 Restlet 版本。下面是一个使用示例:
public Restlet createInboundRoot() {
Router router = new Router(getContext());
(...)
GaeAuthenticator guard= new GaeAuthenticator(getContext());
guard.setNext(router);
return guard;
}
已编辑:
您会注意到 GAE 验证器可以为此目的使用 GAE 注册器(即,如果它是管理员注册器)。
要实现这一点,您只需实例化此类 enroler 并将其设置在您的身份验证器上,如下所述:
GaeEnroler enroler = new GaeEnroler();
GaeAuthenticator guard = new GaeAuthenticator(getContext());
guard.setEnroler(enroler)
guard.setNext(router);
在您的服务器资源中,您可以检查角色,如下所述:
protected boolean hasAdminRole() {
ClientInfo clientInfo = getClientInfo();
List<Role> roles = clientInfo.getRoles();
boolean isAdmin = false;
for (Role role : roles) {
if (role.getName().equals("admin")) {
isAdmin = true;
break;
}
}
return isAdmin;
}
@Post
public XX handlePost(YY content) {
if (!hasAdminRole()) {
throw new ResourceException(Status.CLIENT_ERROR_FORBIDDEN);
}
(...)
}
希望对你有帮助,
蒂埃里
我的应用程序有这个非常基本的身份验证:
MapVerifier mapVerifier = new MapVerifier();
mapVerifier.getLocalSecrets().put("user", "pass".toCharArray());
ChallengeAuthenticator guard= new ChallengeAuthenticator(null, ChallengeScheme.HTTP_BASIC, "Secured Resources");
guard.setContext(getContext());
guard.setVerifier(mapVerifier);
我如何调整它以使用 Google 身份验证方案?也就是说,它不会显示 Username/Password 浏览器弹出窗口,而是会转到 Google 身份验证页面。
我还没完全明白你的问题是什么?如果您想在您的系统中集成 Google 身份验证,请检查 link google Oauth2
它不依赖于任何框架,它只是重定向和回调,你可以用普通的 servlet 来做,显然你也可以用 restlets 来做
我已经编写了一个简单的库来集成 google 和 Facebook oauth 2,您可以查看它以了解它是如何工作的
我认为您不在质询身份验证的上下文中,您需要利用 Google 的身份验证服务。
如果您想要自定义 Restlet Authenticator
实现,这里是此方法的一个实现(未测试):
public class GoogleAuthenticator extends Authenticator {
private UserService userService;
public GoogleAuthenticator(Context context) {
super(context);
this.userService = UserServiceFactory.getUserService();
}
protected User createUser(com.google.appengine.api.users.User googleUser,
Request request, Response response) {
return new User(googleUser.getUserId());
}
protected boolean authenticate(Request request, Response response) {
// Get current Google user
com.google.appengine.api.users.User googleUser = userService.getCurrentUser();
// Check if the user is authenticated
if (googleUser!=null) {
// Authenticated through Google authentication service
request.getClientInfo().setUser(
createUser(googleUser, request, response));
return true;
} else {
// Not authenticated. Redirect to the login URL
response.redirectSeeOther(userService.createLoginURL(
request.getRequestURI()));
return false;
}
}
}
然而,这种验证器在扩展 org.restlet.ext.gae
中存在了一段时间。它利用了 GAE 的服务 UserService
。所以我认为你有你使用的 Restlet 版本。下面是一个使用示例:
public Restlet createInboundRoot() {
Router router = new Router(getContext());
(...)
GaeAuthenticator guard= new GaeAuthenticator(getContext());
guard.setNext(router);
return guard;
}
已编辑:
您会注意到 GAE 验证器可以为此目的使用 GAE 注册器(即,如果它是管理员注册器)。
要实现这一点,您只需实例化此类 enroler 并将其设置在您的身份验证器上,如下所述:
GaeEnroler enroler = new GaeEnroler();
GaeAuthenticator guard = new GaeAuthenticator(getContext());
guard.setEnroler(enroler)
guard.setNext(router);
在您的服务器资源中,您可以检查角色,如下所述:
protected boolean hasAdminRole() {
ClientInfo clientInfo = getClientInfo();
List<Role> roles = clientInfo.getRoles();
boolean isAdmin = false;
for (Role role : roles) {
if (role.getName().equals("admin")) {
isAdmin = true;
break;
}
}
return isAdmin;
}
@Post
public XX handlePost(YY content) {
if (!hasAdminRole()) {
throw new ResourceException(Status.CLIENT_ERROR_FORBIDDEN);
}
(...)
}
希望对你有帮助, 蒂埃里