static void Main(string[] args) { var user_attributes = new Dictionary <string, string>(); user_attributes["an_attribute_name"] = "my_attribute_value"; user_attributes["my_number_attribute"] = "1000.232"; var config = new LookerEmbedConfiguration() { HostName = "your-hostname.looker.com", //HostPort = 9999, Secret = "--- your secret here ---", ExternalUserId = "57", UserFirstName = "Embed", UserLastName = "User", Permissions = new string[] { "explore", "see_user_dashboards", "see_lookml_dashboards", "access_data", "see_looks", "download_with_limit" }, Models = new string[] { "imdb" }, GroupIds = new int[] { 4, 2 }, ExternalGroupId = "awesome_engineers", UserAttributeMapping = user_attributes }; string url = GetLookerEmbedUrl("/embed/dashboards/1", config); Console.WriteLine(url); Console.ReadLine(); }
public static Uri GetLookerEmbedUrl(string targetPath, LookerEmbedConfiguration config) { var uri = new UriBuilder { Scheme = "https", Host = config.HostName, Port = config.HostPort, Path = "/login/embed/" }; var builder = new StringBuilder(); builder.AppendFormat("{0}://{1}{2}{3}", uri.Scheme, uri.Uri.Authority, uri.Path, UrlEncodeForLooker(targetPath)); var unixTime = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; var time = unixTime.ToString(); var json_nonce = JsonConvert.SerializeObject(config.Nonce); var json_external_user_id = JsonConvert.SerializeObject(config.ExternalUserId); var json_permissions = JsonConvert.SerializeObject(config.Permissions); var json_group_ids = JsonConvert.SerializeObject(config.GroupIds); var json_external_group_id = JsonConvert.SerializeObject(config.ExternalGroupId); var json_user_attribute_values = JsonConvert.SerializeObject(config.UserAttributeMapping); var json_models = JsonConvert.SerializeObject(config.Models); var json_session_length = ((long)config.SessionLength.TotalSeconds).ToString(); // order of elements is important var stringToSign = String.Join("\n", new string[] { uri.Uri.Authority, "/login/embed/" + UrlEncodeForLooker(targetPath), json_nonce, time, json_session_length, json_external_user_id, json_permissions, json_models, json_group_ids, json_external_group_id, json_user_attribute_values, config.AccessFilters }); var signature = EncodeString(stringToSign, config.Secret); var json_first_name = JsonConvert.SerializeObject(config.UserFirstName); var json_last_name = JsonConvert.SerializeObject(config.UserLastName); var json_force_logout_login = JsonConvert.SerializeObject(config.ForceLogoutLogin); var qparams = new Dictionary <string, string>() { { "nonce", json_nonce }, { "time", time }, { "session_length", json_session_length }, { "external_user_id", json_external_user_id }, { "permissions", json_permissions }, { "models", json_models }, { "group_ids", json_group_ids }, { "external_group_id", json_external_group_id }, { "user_attributes", json_user_attribute_values }, { "access_filters", config.AccessFilters }, { "first_name", json_first_name }, { "last_name", json_last_name }, { "force_logout_login", json_force_logout_login }, { "signature", signature } }; builder.Append("?"); builder.Append(string.Join("&", qparams.Select(kvp => kvp.Key + "=" + (UrlEncodeForLooker(kvp.Value))))); return(builder.ToString()); }