docs: public DbxAuthFinish finishFromRedirect(String redirectUri,
                                              DbxSessionStore sessionStore,
                                              Map<String, String[]> params)
          throws DbxException, BadRequestException, BadStateException, CsrfException, NotApprovedException, ProviderException {
          if (redirectUri == null) throw new NullPointerException("redirectUri");
          if (sessionStore == null) throw new NullPointerException("sessionStore");
          if (params == null) throw new NullPointerException("params");
  
          String state = getParam(params, "state");
          if (state == null) {
              throw new BadRequestException("Missing required parameter: \"state\".");
          }
  
          String error = getParam(params, "error");
          String code = getParam(params, "code");
          String errorDescription = getParam(params, "error_description");
  
          if (code == null && error == null) {
              throw new BadRequestException("Missing both \"code\" and \"error\".");
          }
          if (code != null && error != null) {
              throw new BadRequestException("Both \"code\" and \"error\" are set.");
          }
          if (code != null && errorDescription != null) {
              throw new BadRequestException("Both \"code\" and \"error_description\" are set.");
          }
  
          state = verifyAndStripCsrfToken(state, sessionStore);
  
          if (error != null) {
              if (error.equals("access_denied")) {
                  // User clicked "Deny"
                  String exceptionMessage = errorDescription == null ?
                      "No additional description from Dropbox" :
                      "Additional description from Dropbox: " + errorDescription;
                  throw new NotApprovedException(exceptionMessage);
              } else {
                  // All other errors
                  String exceptionMessage = errorDescription == null ?
                      error :
                      String.format("%s: %s", error, errorDescription);
                  throw new ProviderException(exceptionMessage);
              }
          }
  
          return finish(code, redirectUri, state);
      }