在Restlet中使用Google身份验证

xyb*_*rek 0 java google-app-engine 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);
Run Code Online (Sandbox Code Playgroud)

如何使用Google身份验证方案进行调整?这样,它将不会显示用户名/密码浏览器弹出窗口,而是转到Google身份验证页面.

Thi*_*ier 5

我认为您不在挑战认证的环境中,您需要利用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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是这种验证器在扩展中存在org.restlet.ext.gae了一段时间.它利用了UserServiceGAE 的服务.所以我认为你使用的是Restlet版本.以下是使用示例:

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

    GaeAuthenticator guard= new GaeAuthenticator(getContext());
    guard.setNext(router);

    return guard;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

您可以注意到GAE身份验证器可以为此目的使用GAE enroler(即,如果它是管理员).

要实现这一点,您只需要实例化这样的enroler并将其设置在您的身份验证器上,如下所示:

GaeEnroler enroler = new GaeEnroler();
GaeAuthenticator guard = new GaeAuthenticator(getContext());
guard.setEnroler(enroler)
guard.setNext(router);
Run Code Online (Sandbox Code Playgroud)

在服务器资源中,您可以检查角色,如下所述:

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

    (...)
}
Run Code Online (Sandbox Code Playgroud)

希望它对你有帮助,蒂埃里