gpt4 book ai didi

java - 将 Google 身份验证与 ReSTLe 结合使用

转载 作者:行者123 更新时间:2023-12-01 16:59:20 25 4
gpt4 key购买 nike

我的应用程序有一个非常基本的身份验证:

    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 身份验证方案?这样,它将转到 Google 身份验证页面,而不是显示用户名/密码浏览器弹出窗口。

最佳答案

我认为您没有处于质询身份验证的环境中,您需要利用 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;
}
}
}

但是,这样的身份 validator 在扩展 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 身份 validator 可以使用 GAE 注册器来实现此目的(即,如果它是管理员身份 validator )。

要实现此目的,您只需实例化此类注册器并将其设置在您的身份 validator 上,如下所述:

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);
}

(...)
}

希望对你有帮助蒂埃里

关于java - 将 Google 身份验证与 ReSTLe 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28936580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com