code: function start($urlState = null, $forceReapprove = false)
      {
          Checker::argStringOrNull("urlState", $urlState);
  
          $csrfToken = self::encodeCsrfToken(Security::getRandomBytes(16));
          $state = $csrfToken;
          if ($urlState !== null) {
              $state .= "|";
              $state .= $urlState;
          }
          $this->csrfTokenStore->set($csrfToken);
  
          return $this->_getAuthorizeUrl($this->redirectUri, $state, $forceReapprove);
      }
docs: Starts the OAuth 2 authorization process, which involves redirecting the user to the
  returned authorization URL (a URL on the Dropbox website).  When the user then
  either approves or denies your app access, Dropbox will redirect them to the
  `$redirectUri` given to constructor, at which point you should
  call {@link finish()} to complete the authorization process.
  
  This function will also save a CSRF token using the `$csrfTokenStore` given to
  the constructor.  This CSRF token will be checked on {@link finish()} to prevent
  request forgery.
  
  See <a href="https://www.dropbox.com/developers/core/docs#oa2-authorize">/oauth2/authorize</a>.
  
  @param string|null $urlState
  Any data you would like to keep in the URL through the authorization process.
  This exact state will be returned to you by {@link finish()}.
  
  @param boolean|null $forceReapprove
  If a user has already approved your app, Dropbox may skip the "approve" step and
  redirect immediately to your callback URL.  Setting this to `true` tells
  Dropbox to never skip the "approve" step.
  
  @return array
  The URL to redirect the user to.
  
  @throws Exception