@Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        URL url = invoker.getUrl();
        boolean shouldAuth = url.getParameter(Constants.SERVICE_AUTH, false);
        if (shouldAuth) {
            Authenticator authenticator = applicationModel
                    .getExtensionLoader(Authenticator.class)
                    .getExtension(url.getParameter(Constants.AUTHENTICATOR, Constants.DEFAULT_AUTHENTICATOR));
            try {
                authenticator.authenticate(invocation, url);
            } catch (Exception e) {
                return AsyncRpcResult.newDefaultAsyncResult(e, invocation);
            }
        }
        return invoker.invoke(invocation);
    }
@Test
    void testAuthSuccessfully() {
        String service = "org.apache.dubbo.DemoService";
        String method = "test";
        long currentTimeMillis = System.currentTimeMillis();
        URL url = URL.valueOf("dubbo://10.10.10.10:2181")
                .setServiceInterface(service)
                .addParameter(Constants.ACCESS_KEY_ID_KEY, "ak")
                .addParameter(Constants.SECRET_ACCESS_KEY_KEY, "sk")
                .addParameter(CommonConstants.APPLICATION_KEY, "test-provider")
                .addParameter(Constants.SERVICE_AUTH, true);
        Invoker invoker = mock(Invoker.class);
        Invocation invocation = mock(RpcInvocation.class);
        when(invocation.getAttachment(Constants.AK_KEY)).thenReturn("ak");
        when(invocation.getAttachment(CommonConstants.CONSUMER)).thenReturn("test-consumer");
        when(invocation.getAttachment(Constants.REQUEST_TIMESTAMP_KEY)).thenReturn(String.valueOf(currentTimeMillis));
        when(invocation.getMethodName()).thenReturn(method);
        when(invoker.getUrl()).thenReturn(url);

        String requestString = String.format(
                Constants.SIGNATURE_STRING_FORMAT,
                url.getColonSeparatedKey(),
                invocation.getMethodName(),
                "sk",
                currentTimeMillis);
        String sign = SignatureUtils.sign(requestString, "sk");
        when(invocation.getAttachment(Constants.REQUEST_SIGNATURE_KEY)).thenReturn(sign);

        ProviderAuthFilter providerAuthFilter = new ProviderAuthFilter(ApplicationModel.defaultModel());
        Result result = providerAuthFilter.invoke(invoker, invocation);
        assertNull(result);
    }