簡體   English   中英

Restlet框架中的AwsVerifier中可能存在的錯誤

[英]Possible bug in AwsVerifier in Restlet Framework

在嘗試使Amazon S3身份驗證適用於我的RESTful Web服務時,我的測試清除了Verifier for S3身份驗證中的可能錯誤。 如果您指定服務器機密中不存在的訪問密鑰,則AwsVerifier會引發NullPointerException,這將導致HTTP 500 Internal Server Error。 該問題開始於AwsVerifier.java的第233行:

char[] userSecret = getLocalSecret(userId);

如果本地機密中不存在userId(即服務器機密映射中不存在訪問密鑰),則沒有關聯的機密,因此userSecret變為null。 當AwsVerifier在第235行調用getS3Signature()時:

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

您會收到NullPointerException。 對我來說,這似乎是個錯誤……任何人都同意/不同意?

我相信這是一個錯誤。 但是,我找到了一種解決方法:僅將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 Internal Server Error。

暫無
暫無

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

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