簡體   English   中英

在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身份驗證方案? 那樣,它不會顯示“用戶名/密碼”瀏覽器彈出窗口,而是會轉到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;
        }
    }
}

但是,此類身份驗證器在擴展名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登記者(即,如果它是管理員)。

要實現此目的,您只需實例化此類注冊者並將其設置在您的身份驗證器上,如下所示:

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

    (...)
}

希望對您有幫助,蒂埃里

我尚未完全了解您的問題是什么? 如果您想將Google身份驗證集成到您的系統中,請檢查鏈接google Oauth2

它不依賴於任何框架,而僅僅是重定向和回調,您可以使用普通servlet來完成,顯然您也可以使用restlet來完成。

我已經編寫了一個簡單的庫來集成google和Facebook oauth 2,您可以檢查一下以查看其工作原理

java oauth2 gae

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM