0

在尝试让 Amazon S3 身份验证为我的 RESTful Web 服务工作时,我的测试清除了 S3 身份验证验证程序中可能存在的错误。如果您指定服务器机密中不存在的访问密钥,AwsVerifier 会引发 NullPointerException,从而导致 HTTP 500 内部服务器错误。问题从 AwsVerifier.java 的第 233 行开始:

char[] userSecret = getLocalSecret(userId);

如果本地机密中不存在 userId(即服务器机密映射中不存在的访问密钥),则没有关联的机密,因此 userSecret 变为空。当 AwsVerifier 在第 235 行调用 getS3Signature() 时:

String sigToCompare = AwsUtils.getS3Signature(request, userSecret);

你得到 NullPointerException。这对我来说似乎是一个错误......有人同意/不同意吗?

4

1 回答 1

0

我相信这是一个错误。但是,我找到了一种解决方法:只需将 AwsVerifier 子类化并覆盖 verify() 方法。确保将代码从超类 verify() 复制到子类中,但按如下方式更改:

public class NewAwsVerifier extends AwsVerifier {
    public NewAwsVerifier(LocalVerifier wrappedVerifier) {
        super(wrappedVerifier);
    }
    ...
    @Override
    public int verify(Request request, Response response) {
    ...
        char[] userSecret = getLocalSecret(userId);
        if (userSecret == null) {
            // If there is no userSecret for the given userId then the
            // request probably specified a user that doesn't exist
            // and using that userID in the getS3Signature call
            // will result in a NullPointerException, so we intercept it here
            return RESULT_INVALID;
        }
        char[] signature = getSecret(request, response);
        String sigToCompare = AwsUtils.getS3Signature(request, userSecret);
    ...
    }
}

然后确保你使用这个新的验证器:

MapVerifier verifier = new MapVerifier();
NewAwsVerifier newVerifier = new NewAwsVerifier(verifier);

// Get passwords from a more secure source (only here for illustration)!
verifier.getLocalSecrets().put("accessKey", "secretKey".toCharArray());
auth.setVerifier(newVerifier);

现在,如果您指定服务器机密中不存在的访问密钥,您将被优雅地拒绝访问,而不是收到 HTTP 500 内部服务器错误。

于 2013-08-19T15:33:02.900 回答