Web应用程序和请求身份验证

时间:2013-12-17 11:55:01

标签: java json authentication playframework

我目前有一个有效的网络应用程序,但我需要为朋友网站提供使用我的数据的方法。

目前有JSON响应,可以从我的网站向调用者检索一些数据。它目前没有身份验证,我想实现某种请求身份验证。

我的网络应用程序包含已登录的用户,并且有适当的身份验证。但是

我总共有3个请求,呼叫者可以从我的网站上获取数据,为这3个请求添加某种身份验证的最简单方法是什么?

我正在使用play framework + java

1 个答案:

答案 0 :(得分:1)

Imo最好的选择是按照简单的顺序:

  • 基本身份验证(因为可以选择auth一次,然后进行基于会话的用户识别或对每个请求进行授权)
  • 双向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);
    }
}

希望它填补了一些空白