code: def token_info(token, refresh=True, refresh_cb=None, session=None):
      
      session = session or HTTP_SESSION
      params = dict(access_token=token.access_token)
      resp = session.get(TOKEN_INFO_URL, params=params)
      if resp.status_code != 200:
          if refresh:
              token = refresh_token(token, session=session)
              if refresh_cb is not None:
                  try:
                      refresh_cb(token)
                  except Exception:
                      LOGGER.exception('OAuth token refresh callback failed')
              info = token_info(token, refresh=False, session=session)
              info.update(refreshed=True)
              return info
          raise OAuthTokenRefreshRequiredError()
      info = __coerce_token_info(resp.json())
      info.update(token=token, refreshed=False)
      return nameddict(info)
docs: :param OAuthToken token
  
      :param bool refresh:
        whether to attempt to refresh the OAuth token if it expired.
        default is `True`.
  
      :param refresh_cb:
        If specified, a callable object which is given the new token
        in parameter if it has been refreshed.
  
      :param requests.Session session:
        Optional `requests` session to use.
  
      :return:
        token information. see
        https://developers.google.com/identity/protocols/OAuth2UserAgent#tokeninfo-validation
        - `scope`: this field is not a space-delimited set of scopes
           but a real Python `set`.
        - `token`: additional field that provides the `OAuthToken`
        - `refreshed`: boolean that will tell if the token has been refreshed
      :rtype: nameddict