docs: def buildSignedUrl(self, methodName, *args, **kwargs):
          """ Build a signed URL.  This URL contains the credentials needed to access
          a resource."""
  
          if 'expiration' in kwargs:
              expiration = kwargs['expiration']
              del kwargs['expiration']
          else:
              expiration = self.options['signedUrlExpiration']
  
          expiration = int(time.time() + expiration)  # Mainly so that we throw if it's not a number
  
          requestUrl = self.buildUrl(methodName, *args, **kwargs)
  
          if not self._hasCredentials():
              raise exceptions.TaskclusterAuthFailure('Invalid Hawk Credentials')
  
          clientId = utils.toStr(self.options['credentials']['clientId'])
          accessToken = utils.toStr(self.options['credentials']['accessToken'])
  
          def genBewit():
              # We need to fix the output of get_bewit.  It returns a url-safe base64
              # encoded string, which contains a list of tokens separated by '\'.
              # The first one is the clientId, the second is an int, the third is
              # url-safe base64 encoded MAC, the fourth is the ext param.
              # The problem is that the nested url-safe base64 encoded MAC must be
              # base64 (i.e. not url safe) or server-side will complain.
  
              # id + '\\' + exp + '\\' + mac + '\\' + options.ext;
              resource = mohawk.base.Resource(
                  credentials={
                      'id': clientId,
                      'key': accessToken,
                      'algorithm': 'sha256',
                  },
                  method='GET',
                  ext=utils.toStr(self.makeHawkExt()),
                  url=requestUrl,
                  timestamp=expiration,
                  nonce='',
                  # content='',
                  # content_type='',
              )
              bewit = mohawk.bewit.get_bewit(resource)
              return bewit.rstrip('=')
  
          bewit = genBewit()
  
          if not bewit:
              raise exceptions.TaskclusterFailure('Did not receive a bewit')
  
          u = urllib.parse.urlparse(requestUrl)
  
          qs = u.query
          if qs:
              qs += '&'
          qs += 'bewit=%s' % bewit
  
          return urllib.parse.urlunparse((
              u.scheme,
              u.netloc,
              u.path,
              u.params,
              qs,
              u.fragment,
          ))