{"id":29311,"date":"2021-06-12T12:55:00","date_gmt":"2021-06-12T09:55:00","guid":{"rendered":"https:\/\/themewp.inform.click\/?p=29311"},"modified":"2021-10-18T03:33:13","modified_gmt":"2021-10-18T00:33:13","slug":"zaloguj-sie-na-linkedin-w-laravel-za-pomoca-laravel-socialite","status":"publish","type":"post","link":"https:\/\/themewp.inform.click\/pl\/zaloguj-sie-na-linkedin-w-laravel-za-pomoca-laravel-socialite\/","title":{"rendered":"Zaloguj si\u0119 na LinkedIn w Laravel za pomoc\u0105 Laravel Socialite"},"content":{"rendered":"<p>Dodanie systemu logowania spo\u0142eczno\u015bciowego na stronie jest obecnie trendem. Dzi\u0119ki integracji logowania spo\u0142eczno\u015bciowego pominie proces weryfikacji u\u017cytkownika. Serwisy spo\u0142eczno\u015bciowe ju\u017c zweryfikowa\u0142y u\u017cytkownik\u00f3w, wi\u0119c nasza aplikacja nie musi przechodzi\u0107 tego samego procesu z u\u017cytkownikiem. Mo\u017cemy polega\u0107 na serwisach spo\u0142eczno\u015bciowych i umo\u017cliwi\u0107 u\u017cytkownikowi korzystanie z naszego systemu, je\u015bli zaloguje si\u0119 on za po\u015brednictwem serwisu spo\u0142eczno\u015bciowego na naszej stronie internetowej. Facebook, Twitter, Google, LinkedIn to popularne serwisy spo\u0142eczno\u015bciowe, kt\u00f3re zwykle s\u0105 zintegrowane jako logowanie spo\u0142eczno\u015bciowe do witryny. W tym artykule om\u00f3wimy logowanie za pomoc\u0105 LinkedIn w Laravel.<\/p>\n<p>W naszym samouczku zintegruj\u0119 login LinkedIn ze \u015bwie\u017c\u0105 instalacj\u0105 Laravela. Mam zamiar zainstalowa\u0107 Laravela, stworzy\u0107 tabel\u0119 \u201eusers&quot; i zainstalowa\u0107 pakiety wymagane do integracji systemu logowania spo\u0142eczno\u015bciowego.<\/p>\n<p>Uruchom poni\u017csze polecenie, aby zainstalowa\u0107 Laravel. Tutaj tworz\u0119 projekt jako 'linkedinlogin&#8217;.<\/p>\n<pre><code>composer create-project --prefer-dist laravel\/laravel linkedinlogin<\/code><\/pre>\n<p>Po instalacji utw\u00f3rz baz\u0119 danych i ustaw po\u015bwiadczenia w <code>.env<\/code>pliku. Budujemy system logowania, wi\u0119c powinni\u015bmy przechowywa\u0107 dane u\u017cytkownika w bazie danych.<\/p>\n<p>Ten samouczek opiera si\u0119 na logowaniu do LinkedIn, wi\u0119c po pomy\u015blnym uwierzytelnieniu otrzymamy identyfikator profilu LinkedIn u\u017cytkownika. Aby przechowywa\u0107 ten identyfikator spo\u0142eczno\u015bciowy, dodajemy kolumny provider i provider_id. Tutaj kolumna dostawcy b\u0119dzie przechowywa\u0107 warto\u015b\u0107 \u201elinkedin&#8221;, a provider_id b\u0119dzie przechowywa\u0107 identyfikator spo\u0142eczno\u015bciowy u\u017cytkownika.<\/p>\n<p>Kiedy u\u017cywamy logowania spo\u0142eczno\u015bciowego, nie musimy przechowywa\u0107 hase\u0142, wi\u0119c warto\u015b\u0107 kolumny has\u0142a powinna domy\u015blnie akceptowa\u0107 \u201eNULL&#8221;. Nie ma gwarancji, \u017ce otrzymamy e-mail u\u017cytkownika po zalogowaniu si\u0119 w mediach spo\u0142eczno\u015bciowych, wi\u0119c dla ciekawo\u015bci musimy ustawi\u0107 kolumn\u0119 e-mail tak, aby akceptowa\u0142a \u201eNULL&#8221;.<\/p>\n<p>Otw\u00f3rz plik migracji tabeli u\u017cytkownik\u00f3w i dodaj poni\u017cszy kod.<\/p>\n<pre><code>\/**\n\u00a0* Run the migrations.\n\u00a0*\n\u00a0* @return void\n\u00a0*\/\npublic function up()\n{\n\u00a0\u00a0\u00a0\u00a0Schema::create('users', function (Blueprint $table) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$table-&gt;increments('id');\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$table-&gt;string('name');\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$table-&gt;string('email')-&gt;nullable();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$table-&gt;timestamp('email_verified_at')-&gt;nullable();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$table-&gt;string('password')-&gt;nullable();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$table-&gt;string('provider');\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$table-&gt;string('provider_id');\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$table-&gt;rememberToken();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$table-&gt;timestamps();\n\u00a0\u00a0\u00a0\u00a0});\n}<\/code><\/pre>\n<p>Uruchom poni\u017csze polecenie, kt\u00f3re utworzy tabele w naszej bazie danych.<\/p>\n<pre><code>php artisan migrate<\/code><\/pre>\n<p>Musimy r\u00f3wnie\u017c doda\u0107 te dwie kolumny w naszym modelu u\u017cytkownika.<\/p>\n<p><strong>aplikacja\/U\u017cytkownik.php<\/strong><\/p>\n<pre><code>\/**\n\u00a0* The attributes that are mass assignable.\n\u00a0*\n\u00a0* @var array\n\u00a0*\/\nprotected $fillable = [\n\u00a0\u00a0\u00a0\u00a0'name', 'email', 'password', 'provider', 'provider_id'\n];<\/code><\/pre>\n<h3>Utw\u00f3rz aplikacj\u0119 LinkedIn<\/h3>\n<p>Aby zintegrowa\u0107 login LinkedIn, nale\u017cy utworzy\u0107 aplikacj\u0119 na swoim koncie LinkedIn. Potrzebujemy identyfikatora klienta, tajemnicy klienta aplikacji LinkedIn. W aplikacji musimy r\u00f3wnie\u017c ustawi\u0107 autoryzowany adres URL przekierowania.<\/p>\n<ul>\n<li>Przejd\u017a do <a href=\"https:\/\/www.linkedin.com\/secure\/developer\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sieci programist\u00f3w LinkedIn<\/a>.<\/li>\n<li>Kliknij przycisk \u201eUtw\u00f3rz aplikacj\u0119&#8221;.<\/li>\n<li>Uzupe\u0142nij informacje w formularzu.<\/li>\n<li>Dodaj <code>http:\/\/localhost:8000\/linkedin\/callback<\/code>w polu Autoryzowane adresy URL przekierowania.<\/li>\n<li>Skopiuj klucze Client ID i Client Secret.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20253-6081d37e35c27.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20253-6081d37e35c27.png\" alt=\"Zaloguj si\u0119 na LinkedIn w Laravel za pomoc\u0105 Laravel Socialite\" ><\/a><\/p>\n<p>Po wykonaniu powy\u017cszych krok\u00f3w musisz doda\u0107 produkt \u201eZaloguj si\u0119 przez LinkedIn&#8221; do swojej aplikacji LinkedIn. Kliknij zak\u0142adk\u0119 \u201eprodukty&#8221; i wybierz \u201eZaloguj si\u0119 przez LinkedIn&#8221;. Po wybraniu tego produktu przejdzie on do przegl\u0105du, a nast\u0119pnie zostanie dodany jako produkt dodany. Sprawdzenie mo\u017ce zaj\u0105\u0107 troch\u0119 czasu. W moim przypadku zaj\u0119\u0142o to oko\u0142o 10 minut.<\/p>\n<p><a href=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20253-6081d37e35c27.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/themewp.inform.click\/wp-content\/uploads\/2021\/04\/post-20253-6081d37e35c27.png\" alt=\"Zaloguj si\u0119 na LinkedIn w Laravel za pomoc\u0105 Laravel Socialite\" ><\/a><\/p>\n<h3>Tw\u00f3rz trasy i kontroler<\/h3>\n<p>Mo\u017cemy teraz zacz\u0105\u0107 dodawa\u0107 kod w Laravelu. Utw\u00f3rz kontroler <code>LoginController<\/code>za pomoc\u0105 polecenia:<\/p>\n<pre><code>php artisan make:controller LoginController<\/code><\/pre>\n<p>Nast\u0119pnie utw\u00f3rz plik kasetowy <code>login.blade.php<\/code>i dodaj do niego nast\u0119puj\u0105cy kod HTML.<\/p>\n<pre><code>&lt;a href=\"{{ url('\/login\/linkedin') }}\"&gt;\n\u00a0\u00a0\u00a0\u00a0{{ __('Login with LinkedIn') }}\n&lt;\/a&gt;<\/code><\/pre>\n<p>Nazwij ten widok z <code>index<\/code>metody w <code>LoginController<\/code>nast\u0119puj\u0105cy spos\u00f3b.<\/p>\n<pre><code>public function index()\n{\n\u00a0\u00a0\u00a0\u00a0return view('login');\n}<\/code><\/pre>\n<p>Zdefiniujmy dla niego trasy. Dodaj\u0119 te\u017c kilka innych tras, kt\u00f3re b\u0119d\u0105 wymagane w dalszej cz\u0119\u015bci samouczka.<\/p>\n<pre><code>Route::get('login', 'LoginController@index');\nRoute::get('login\/{provider}', 'LoginController@redirectToProvider');\nRoute::get('{provider}\/callback', 'LoginController@handleProviderCallback');\nRoute::get('\/home', function() {\n\u00a0\u00a0\u00a0\u00a0return 'User is logged in';\n});<\/code><\/pre>\n<p>Gdy u\u017cytkownik zaloguje si\u0119 na LinkedIn, przekieruj\u0119 go na <code>home<\/code>tras\u0119. To tylko do cel\u00f3w demonstracyjnych. Powiniene\u015b zmieni\u0107 t\u0119 tras\u0119 na co\u015b innego.<\/p>\n<h3>Zaloguj si\u0119 na LinkedIn Laravel<\/h3>\n<p>Laravel ma oficjalny pakiet Socialite. Ten pakiet pomaga nam \u0142atwo zintegrowa\u0107 system logowania spo\u0142eczno\u015bciowego w Laravel. Zainstaluj ten pakiet za pomoc\u0105 polecenia:<\/p>\n<pre><code>composer require laravel\/socialite<\/code><\/pre>\n<p>Po zainstalowaniu biblioteki otw\u00f3rz <code>config\/services.php<\/code>i dodaj konfiguracj\u0119 LinkedIn w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<pre><code>'linkedin' =&gt; [\n\u00a0\u00a0\u00a0\u00a0'client_id' =&gt; env('LINKEDIN_CLIENT_ID'),\n\u00a0\u00a0\u00a0\u00a0'client_secret' =&gt; env('LINKEDIN_CLIENT_SECRET'),\n\u00a0\u00a0\u00a0\u00a0'redirect' =&gt; env('LINKEDIN_CALLBACK_URL'),\n],<\/code><\/pre>\n<p>Teraz musimy doda\u0107 nasze sta\u0142e warto\u015bci do <code>.env<\/code>pliku.<\/p>\n<pre><code>LINKEDIN_CLIENT_ID=YOUR_CLIENT_ID\nLINKEDIN_CLIENT_SECRET=YOUR_CLIENT_SECRET\nLINKEDIN_CALLBACK_URL=http:\/\/localhost:8000\/linkedin\/callback<\/code><\/pre>\n<p>Pami\u0119taj, aby zast\u0105pi\u0107 symbole zast\u0119pcze ich rzeczywistymi warto\u015bciami. Ostateczne poprawki powinny znale\u017a\u0107 si\u0119 w <code>LoginController.php<\/code>pliku. W tym pliku piszemy funkcj\u0119, kt\u00f3ra przekierowuje u\u017cytkownika na stron\u0119 logowania LinkedIn, a po udanej autoryzacji zaloguje u\u017cytkownika.<\/p>\n<p><strong>LoginController.php<\/strong><\/p>\n<pre><code>&lt;?php\n\u00a0\nnamespace AppHttpControllers;\n\u00a0\nuse IlluminateHttpRequest;\nuse Socialite;\nuse AppModelsUser;\nuse Auth;\n\u00a0\nclass LoginController extends Controller\n{\n\u00a0\u00a0\u00a0\u00a0\/**\n\u00a0\u00a0\u00a0\u00a0\u00a0* Where to redirect users after login.\n\u00a0\u00a0\u00a0\u00a0\u00a0*\n\u00a0\u00a0\u00a0\u00a0\u00a0* @var string\n\u00a0\u00a0\u00a0\u00a0\u00a0*\/\n\u00a0\u00a0\u00a0\u00a0protected $redirectTo = '\/home';\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\/**\n\u00a0\u00a0\u00a0\u00a0\u00a0* Call the view\n\u00a0\u00a0\u00a0\u00a0\u00a0*\/\n\u00a0\u00a0\u00a0\u00a0public function index()\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return view('login');\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\/**\n\u00a0\u00a0\u00a0\u00a0\u00a0* Redirect the user to the Linkedin authentication page.\n\u00a0\u00a0\u00a0\u00a0\u00a0*\n\u00a0\u00a0\u00a0\u00a0\u00a0* @return Response\n\u00a0\u00a0\u00a0\u00a0\u00a0*\/\n\u00a0\u00a0\u00a0\u00a0public function redirectToProvider($provider)\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return Socialite::driver($provider)-&gt;scopes(['r_liteprofile', 'r_emailaddress'])-&gt;redirect();\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\/**\n\u00a0\u00a0\u00a0\u00a0\u00a0* Obtain the user information from Linkedin.\n\u00a0\u00a0\u00a0\u00a0\u00a0*\n\u00a0\u00a0\u00a0\u00a0\u00a0* @return Response\n\u00a0\u00a0\u00a0\u00a0\u00a0*\/\n\u00a0\u00a0\u00a0\u00a0public function handleProviderCallback($provider)\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$user = Socialite::driver($provider)-&gt;user();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$authUser = $this-&gt;findOrCreateUser($user, $provider);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Auth::login($authUser, true);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return redirect($this-&gt;redirectTo);\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\/**\n\u00a0\u00a0\u00a0\u00a0\u00a0* If a user has registered before using social auth, return the user\n\u00a0\u00a0\u00a0\u00a0\u00a0* else, create a new user object.\n\u00a0\u00a0\u00a0\u00a0\u00a0* @param\u00a0 $user Socialite user object\n\u00a0\u00a0\u00a0\u00a0\u00a0* @param $provider Social auth provider\n\u00a0\u00a0\u00a0\u00a0\u00a0* @return\u00a0 User\n\u00a0\u00a0\u00a0\u00a0\u00a0*\/\n\u00a0\u00a0\u00a0\u00a0public function findOrCreateUser($user, $provider)\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$authUser = User::where('provider_id', $user-&gt;id)-&gt;first();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if ($authUser) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return $authUser;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return User::create([\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'name'\u00a0\u00a0\u00a0\u00a0 =&gt; $user-&gt;name,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'email'\u00a0\u00a0\u00a0 =&gt; $user-&gt;email,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'provider' =&gt; $provider,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0'provider_id' =&gt; $user-&gt;id\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]);\n\u00a0\u00a0\u00a0\u00a0}\n}<\/code><\/pre>\n<p>W naszym <code>LoginController<\/code>ustalamy zakresy <code>['r_liteprofile',\u00a0'r_emailaddress']<\/code>wymagane do pobrania podstawowych informacji o u\u017cytkowniku LinkedIn. W metodzie callback sprawdzamy, czy u\u017cytkownik istnieje, a je\u015bli nie, to dodajemy go do bazy danych.<\/p>\n<p>Mam nadziej\u0119, \u017ce rozumiesz, jak zalogowa\u0107 si\u0119 na LinkedIn w Laravel. Chcia\u0142bym us\u0142ysze\u0107 wasze przemy\u015blenia i sugestie w sekcji komentarzy poni\u017cej.<\/p>\n<h4>Powi\u0105zane artyku\u0142y<\/h4>\n<ul>\n<li><a href=\"https:\/\/themewp.inform.click\/pl\/zaloguj-sie-przez-google-w-laravel-za-pomoca-laravel-socialite\/\" title=\"Zaloguj si\u0119 przez Google w Laravel za pomoc\u0105 Laravel Socialite\">Zaloguj si\u0119 przez Google w Laravel za pomoc\u0105 Laravel Socialite<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/pl\/jak-dodac-logowanie-google-oauth-do-witryny-za-pomoca-php\/\" title=\"Jak doda\u0107 logowanie Google OAuth do witryny za pomoc\u0105 PHP\">Jak doda\u0107 logowanie Google OAuth do witryny za pomoc\u0105 PHP<\/a><\/li>\n<li><a href=\"https:\/\/themewp.inform.click\/pl\/tworz-wielojezyczna-strone-internetowa-w-php-za-pomoca-laravel-framework\/\" title=\"Stw\u00f3rz wieloj\u0119zyczn\u0105 stron\u0119 internetow\u0105 w PHP za pomoc\u0105 Laravel Framework\">Stw\u00f3rz wieloj\u0119zyczn\u0105 stron\u0119 internetow\u0105 w PHP za pomoc\u0105 Laravel Framework<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/artisansweb.net\" class=\"external external_icon\">artisansweb.net<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>W tym artykule poka\u017c\u0119, jak doda\u0107 login z LinkedIn za pomoc\u0105 Laravel Socialite w swojej aplikacji Laravel. Korzystanie z logowania spo\u0142eczno\u015bciowego Twoich u\u017cytkownik\u00f3w<\/p>\n","protected":false},"author":1,"featured_media":20254,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[501],"tags":[847],"class_list":["post-29311","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-laravel","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/posts\/29311","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/comments?post=29311"}],"version-history":[{"count":0,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/posts\/29311\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/media\/20254"}],"wp:attachment":[{"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/media?parent=29311"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/categories?post=29311"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/themewp.inform.click\/pl\/wp-json\/wp\/v2\/tags?post=29311"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}