{"id":273,"date":"2018-05-30T08:00:30","date_gmt":"2018-05-30T06:00:30","guid":{"rendered":"http:\/\/cwiok.pl\/?p=273"},"modified":"2018-06-06T23:31:52","modified_gmt":"2018-06-06T21:31:52","slug":"uwierzytelnianie-przy-uzyciu-wielu-loginow-i-hasel-do-jednego-zrodla-danych","status":"publish","type":"post","link":"https:\/\/cwiok.pl\/index.php\/pl\/2018\/05\/30\/uwierzytelnianie-przy-uzyciu-wielu-loginow-i-hasel-do-jednego-zrodla-danych\/","title":{"rendered":"Uwierzytelnianie przy u\u017cyciu wielu login\u00f3w i hase\u0142 do jednego \u017ar\u00f3d\u0142a danych"},"content":{"rendered":"<p><a href=\"http:\/\/cwiok.pl\/index.php\/pl\/2018\/05\/23\/zapetlenie-zapytania-internetowego-po-wierszach-w-tabeli-w-powerbi\/\">Zadanie z poprzedniego tygodnia <\/a>wymaga\u0142o jeszcze jednej rzeczy! Jak wspomnia\u0142em, klient pobiera\u0142 dane z API. Dodatkowo klient chcia\u0142 pobiera\u0107 dane dla dw\u00f3ch r\u00f3\u017cnych podmiot\u00f3w tj. musia\u0142 \u0142\u0105czy\u0107 si\u0119 z baz\u0105 za pomoc\u0105 dw\u00f3ch r\u00f3\u017cnych zestaw\u00f3w hase\u0142 i login\u00f3w. Poniewa\u017c wszystko mia\u0142o by\u0107 raportowane z Power BI, musia\u0142em znale\u017a\u0107 rozwi\u0105zanie. Zn\u00f3w postanowi\u0142em popisa\u0107 w M!<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-296\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/artykul_05_meditation.png\" alt=\"\" width=\"1200\" height=\"628\" \/><\/p>\n<p><strong>Informacja: To rozwi\u0105zanie przechowuje has\u0142o w tekscie w pliku .pbix. Jest to potencjalne ryzyko, poniewa\u017c normalnie has\u0142o nie jest zapisane w pliku pbix. Prosz\u0119 korzysta\u0107 z rozwag\u0105. Je\u015bli znasz inne rozwi\u0105zanie, daj mi zna\u0107!<\/strong><\/p>\n<p>Podczas \u0142\u0105czenia si\u0119 ze \u017ar\u00f3d\u0142em danych, kt\u00f3re wymaga uwierzytelnienia, Power BI pozwala na zapisanie has\u0142a na p\u00f3\u017aniej. Jest to bardzo wygodne i bezpieczne rozwi\u0105zanie w wi\u0119kszo\u015bci przypadk\u00f3w. Niestety, jest to du\u017ce ograniczenie kiedy chcemy \u0142\u0105czy\u0107 si\u0119 z tym samym \u017ar\u00f3d\u0142em dwoma has\u0142ami. Edycja has\u0142a odbywa si\u0119 za pomoc\u0105 &#8220;ustawie\u0144 \u017ar\u00f3d\u0142a danych&#8221;. Pozwala to zapisa\u0107 jedno has\u0142o na ka\u017cde \u017ar\u00f3d\u0142o:<\/p>\n<p><a href=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Artykul_02_01.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-258 size-full aligncenter\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Artykul_02_01.jpg\" alt=\"\" width=\"827\" height=\"599\" srcset=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Artykul_02_01.jpg 827w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Artykul_02_01-300x217.jpg 300w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Artykul_02_01-768x556.jpg 768w\" sizes=\"auto, (max-width: 827px) 100vw, 827px\" \/><\/a><\/p>\n<p>Rozwi\u0105zanie problemu wymaga\u0142o pracy z j\u0119zykiem M, kt\u00f3ry zosta\u0142 wygenerowany przez Power BI po po\u0142\u0105czeniu si\u0119 z API. Jak wida\u0107 poni\u017cej, Power BI u\u017cywa funkcji Web.Contents do pobrania danych z URL:<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"lang:default decode:true \" title=\"Connecting to Web page with JSON\"> \r\n.\r\nlet\r\n    Source = Json.Document(Web.Contents(\"&lt;Your URL&gt;\")),\r\n    Source1 = Source{0}\r\nin\r\n    Source1<\/pre>\n<p>&nbsp;<\/p>\n<p>Szybkie zerkni\u0119cie do <a href=\"https:\/\/msdn.microsoft.com\/en-us\/query-bi\/m\/web-contents\">dokumentacji<\/a> pokaza\u0142o, \u017ce M <em>naturalnie <\/em>pozwala na przekazanie nag\u0142\u00f3wk\u00f3w w funkcji Web.Contents. To \u015bwietnie! Ale jakie nag\u0142\u00f3wki przekaza\u0107? Login i has\u0142o? Mo\u017cliwe, ale to wymaga potwierdzenia. Przeczesywanie internet\u00f3w poprowadzi\u0142o do <a href=\"https:\/\/en.wikipedia.org\/wiki\/Basic_access_authentication#Client_side\">Wikipedii<\/a>. Musia\u0142em przekaza\u0107 parametr &#8220;Authorization&#8221; w formie &#8220;Basic co\u015btam&#8221; . To oznacza, \u017ce trzeba zakodowa\u0107 m\u00f3j login i has\u0142o za pomoc\u0105 Base64. Musia\u0142bym wykorzysta\u0107 do tego <em>pewnie <\/em>Pythona&#8230;. Ale poradzi\u0142em sobie i bez tego. Wszed\u0142em na URL API poprzez przegl\u0105dark\u0119 internetow\u0105 z otwartym monitorem sieci (Ctrl + Shift + E w Firefox). Po zalogowaniu si\u0119 do API mog\u0142em podejrze\u0107 nag\u0142\u00f3wek zapytania.<\/p>\n<p><a href=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Artykul_02_02.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-262 size-full\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Artykul_02_02.jpg\" alt=\"\" width=\"701\" height=\"214\" srcset=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Artykul_02_02.jpg 701w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Artykul_02_02-300x92.jpg 300w\" sizes=\"auto, (max-width: 701px) 100vw, 701px\" \/><\/a><\/p>\n<p>Po otrzymaniu danych, w monitorze sieci zobaczy\u0142em to czego si\u0119 spodziewa\u0142em, czyli jedno zapytanie typu GET:<\/p>\n<p><a href=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Artykul_02_03.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-263 size-full\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Artykul_02_03.jpg\" alt=\"\" width=\"1105\" height=\"53\" srcset=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Artykul_02_03.jpg 1105w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Artykul_02_03-300x14.jpg 300w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Artykul_02_03-768x37.jpg 768w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Artykul_02_03-1024x49.jpg 1024w\" sizes=\"auto, (max-width: 1105px) 100vw, 1105px\" \/><\/a><\/p>\n<p>Podw\u00f3jne kliknieci\u0119 pozwoli\u0142o na zobaczenie wszystkich nag\u0142\u00f3wk\u00f3w, po\u015br\u00f3d kt\u00f3rych by\u0142 i nag\u0142\u00f3wek Authorization:<\/p>\n<p><a href=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Artykul_02_04-1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-265 size-full\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Artykul_02_04-1.jpg\" alt=\"\" width=\"694\" height=\"255\" srcset=\"https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Artykul_02_04-1.jpg 694w, https:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/Artykul_02_04-1-300x110.jpg 300w\" sizes=\"auto, (max-width: 694px) 100vw, 694px\" \/><\/a><\/p>\n<p>Skopiowa\u0142em zawarto\u015b\u0107 i wklei\u0142em do Edytora:<\/p>\n<pre class=\"lang:default decode:true \" title=\"Passing headers in Web.Contents\"> \r\n.\r\nlet\r\n\r\nHttp_query = Json.Document(Web.Contents(\"&lt;Your URL&gt;\", \r\n          [Headers=\r\n                  [Authorization=\"Basic &lt;Auth String&gt;\"]\r\n           ]\r\n           )),\r\nData = Http_query{0}\r\n\r\nin \r\n\r\n   Data<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>To pozwoli\u0142o mi na po\u0142\u0105czenie si\u0119 ze \u017ar\u00f3d\u0142em przy ustawieniach anonimowego logowania. Tym sposobem mog\u0119 \u0142\u0105czy\u0107 si\u0119 wykorzystuj\u0105c tyle login\u00f3w ile tylko chce. Mog\u0119 to robi\u0107 w jednym zapytaniu lub we wielu. Mam nadzieje, \u017ce moje rozwi\u0105zanie pokaza\u0142o, \u017ce technologia wykorzystywana pod mask\u0105 w wielu narz\u0119dziach jest taka sama i dodatkowo dobrze udokumentowana.<\/p>\n<p>Ponownie wa\u017cna informacja: To rozwi\u0105zanie daje ka\u017cdemu, kto ma dost\u0119p do pliku, mo\u017cliwo\u015b\u0107 uwierzytelnienia si\u0119 z API. Do ostro\u017cnego u\u017cytku. <strong>Je\u015bli znasz inne rozwi\u0105zanie, daj mi zna\u0107!<\/strong><\/p>\n<p>Dzi\u0119ki<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zadanie z poprzedniego tygodnia wymaga\u0142o jeszcze jednej rzeczy! Jak wspomnia\u0142em, klient pobiera\u0142 dane z API. Dodatkowo klient chcia\u0142 pobiera\u0107 dane dla dw\u00f3ch r\u00f3\u017cnych podmiot\u00f3w tj. musia\u0142 \u0142\u0105czy\u0107 si\u0119 z baz\u0105 za pomoc\u0105 dw\u00f3ch r\u00f3\u017cnych zestaw\u00f3w hase\u0142 i login\u00f3w. Poniewa\u017c wszystko mia\u0142o by\u0107 raportowane z Power BI, musia\u0142em znale\u017a\u0107 rozwi\u0105zanie. Zn\u00f3w postanowi\u0142em popisa\u0107 w M!<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-296\" src=\"http:\/\/cwiok.pl\/wp-content\/uploads\/2018\/05\/artykul_05_meditation.png\" alt=\"\" width=\"1200\" height=\"628\" \/><\/p>\n<div class=\"tech_read_more\"><a href=\"https:\/\/cwiok.pl\/index.php\/pl\/2018\/05\/30\/uwierzytelnianie-przy-uzyciu-wielu-loginow-i-hasel-do-jednego-zrodla-danych\/\">Read More<\/a><\/div>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[32],"tags":[],"class_list":["post-273","post","type-post","status-publish","format-standard","hentry","category-powerbi-pl"],"_links":{"self":[{"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/posts\/273","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/comments?post=273"}],"version-history":[{"count":0,"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/posts\/273\/revisions"}],"wp:attachment":[{"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/media?parent=273"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/categories?post=273"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cwiok.pl\/index.php\/wp-json\/wp\/v2\/tags?post=273"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}