簡體   English   中英

Web應用程序和請求身份驗證

[英]Web app and request authentication

我目前有一個正在運行的Web應用程序,但是我需要為朋友網站提供使用我的數據的方法。

當前存在JSON響應,該響應從我的網站檢索一些數據給調用者。 目前尚無身份驗證,我想實現某種形式的每請求身份驗證。

我的Web應用程序具有已登錄的用戶,並且為此進行了身份驗證。

我總共有3個請求,呼叫者可以從他們的網站獲取數據,對於這3個請求,添加某種身份驗證的最簡單方法是什么?

我正在使用播放框架+ Java

伊莫為此的最佳選擇將是簡單的順序:

  • 基本身份驗證(因為可以選擇只進行一次身份驗證,然后進行基於會話的用戶識別或對每個請求進行授權)
  • 2路SSL
  • 兩者結合

您使用什么工具包進行身份驗證?

我個人堅持使用play-authenticate 因此,我也許可以回答有關此工具包的問題,​​請根據需要將其應用於您的特定工具包。

我將提供最簡單的基本身份驗證示例。 好處是:您可以從它開始,然后在其頂部添加(例如,稍后通過Apache添加客戶端證書身份驗證)。

因此,我的控制器代碼段

@Restrict(value = @Group({"ROLE_WEB_SERVICE1"}), handler = BasicAuthHandler.class)
public static Result ws1() {
  return TODO;
}

以及身份驗證處理程序本身

public class BasicAuthHandler extends AbstractDeadboltHandler {
    public static final String HEADER_PREFIX = "Basic ";
    private static final String AUTHORIZATION = "authorization";
    private static final String WWW_AUTHENTICATE = "WWW-Authenticate";

    @Override
    public Result beforeAuthCheck(final Http.Context context) {
        return basicAuthenticate(context);
    }
    private Result basicAuthenticate(Http.Context context) {
        if (PlayAuthenticate.isLoggedIn(context.session())) {
            // user is logged in
            return null;
        }
        final String authHeader = context.request().getHeader(AUTHORIZATION);
        if (authHeader == null || !authHeader.toLowerCase().startsWith(HEADER_PREFIX.toLowerCase())) {
            return onAuthFailure(context, "Basic authentication header is missing");
        }
        final String auth = authHeader.substring(HEADER_PREFIX.length());
        final byte[] decodedAuth;
        final String[] credentials;
        try {
            decodedAuth = Base64.base64ToByteArray(auth);
            credentials = new String(decodedAuth, "UTF-8").split(":");
        } catch (final IOException e) {
            Logger.error("basicAuthenticate", e);
            return Results.internalServerError();
        }

        if (credentials.length != 2) {
            return onAuthFailure(context, "Could not authenticate with absent password");
        }

        final String username = credentials[0];
        final String password = credentials[1];

        final AuthUser authUser = new AuthUser(password, username);
        final Enum result = AuthProvider.getProvider().loginUser(authUser);

        if ("USER_LOGGED_IN".equals(result.name())) {
            PlayAuthenticate.storeUser(context.session(), authUser);
            return null;
        }
        return onAuthFailure(context, "Authenticate failure");
    }

    @Override
    public Subject getSubject(final Http.Context context) {
        // your implementation
    }

    @Override
    public Result onAuthFailure(final Http.Context context,
                                final String content) { 
        // your error hangling logic
        return super.onAuthFailure(context, content);
    }
}

希望它填補了一些空白

暫無
暫無

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

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