code: func (user *User) OAuthToken() string {
  	// todo: oauthtoken per host?
  	/*
  		host := user.ctx.ServiceBaseURL.Host
  
  		if host == "" {
  			host = user.ctx.Service().DefaultBaseURL.Host
  		}
  	*/
  	ps, _ := user.protectedSettings()
  
  	if ps != nil {
  		if ps.OAuthExpireDate != nil && ps.OAuthExpireDate.Before(time.Now().Add(time.Second*5)) {
  			token, err := user.ctx.OAuthProvider().OAuth2Client(user.ctx).TokenSource(oauth2.NoContext, &oauth2.Token{AccessToken: ps.OAuthToken, Expiry: *ps.OAuthExpireDate, RefreshToken: ps.OAuthRefreshToken}).Token()
  
  			if err != nil {
  				if strings.Contains(err.Error(), "revoked") || strings.Contains(err.Error(), "invalid_grant") {
  					//remove stored OAuthToken
  					//todo: provide revoked callback
  					ps.OAuthToken = ""
  					ps.OAuthExpireDate = nil
  					user.saveProtectedSettings()
  				}
  				user.ctx.Log().WithError(err).Error("OAuth token refresh failed")
  				return ""
  			}
  
  			if token != nil {
  				ps.OAuthToken = token.AccessToken
  				if token.RefreshToken != "" {
  					ps.OAuthRefreshToken = token.RefreshToken
  				}
  				ps.OAuthExpireDate = &token.Expiry
  				user.saveProtectedSettings()
  
  			}
  
  		}
  		return ps.OAuthToken
  	}
  
  	return ""
  }
docs: // OAuthToken returns OAuthToken for service