{"id":661,"date":"2020-11-07T16:41:36","date_gmt":"2020-11-07T07:41:36","guid":{"rendered":"http:\/\/snow-cat.net\/?p=661"},"modified":"2021-09-13T12:50:30","modified_gmt":"2021-09-13T03:50:30","slug":"add-facebook-oauth-with-facebook-sdk-in-laravel","status":"publish","type":"post","link":"https:\/\/snow-cat.net\/?p=661","title":{"rendered":"Add facebook Oauth with facebook-sdk in laravel"},"content":{"rendered":"<p>When I write code to authorize with facebook-sdk, I was confused so I write how to solve this problem.<\/p>\n<h2>Firstly<\/h2>\n<p>User move to laravel redirect controller when user click button.<\/p>\n<pre class=\"lang:default decode:true\" title=\"redirect-facebook\">use Illuminate\\Support\\Str;\r\n\r\nclass OauthController\r\n{\r\n    public function redirectToFacebook()\r\n    {\r\n        $state = Str::random(32);\r\n        session()-&gt;put('state', $state);\r\n        $sendData = [\r\n            \"client_id\" =&gt; 'client_id-xxxxx-xxxx',\r\n            \"redirect_url\" =&gt; 'https:\/\/hogehoge.com\/facebook\/callback',\r\n            \"state\" =&gt; $state,\r\n            \"response_type\" =&gt; 'code',\r\n        ];\r\n        $url = 'https:\/\/www.facebook.com\/v8.0\/dialog\/oauth?'.http_build_query($sendData);\r\n        return redirect($url);\r\n    }\r\n}<\/pre>\n<p>You need to set session &#8216;state&#8217;\u00a0 for XSRF.<\/p>\n<p>Then, you redirect to facebook authorize page.<\/p>\n<p>Yser come back to callback url you set in sendData After user authorize.<\/p>\n<h2>Secondly<\/h2>\n<p>You set function for callback from facebook.<\/p>\n<pre class=\"lang:default decode:true\">use Facebook\\Facebook;\r\nuse Facebook\\PersistentData\\PersistentDataInterface;\r\n\r\nclass OauthController\r\n{\r\n...\r\n    public function callbackFromFacebook(string $accessToken = null)\r\n    {\r\n        $facebook = new Facebook([\r\n            'app_id' =&gt; FACEBOOK_APPLICATION_ID,\r\n            'app_secret' =&gt; FACEBOOK_SECRET_ID,\r\n            'default_graph_version' =&gt; 'v2.9',\r\n            'persistent_data_handler' =&gt; new MyLaravelPersistentDataHandler(),\r\n        ]);\r\n        $helper = $facebook-&gt;getRedirectLoginHelper();\r\n        if ($accessToken) {\r\n            $accessToken = $helper-&gt;getAccessToken();\r\n        }\r\n        $response = $facebook-&gt;get('\/me?fields=id', $accessToken);\r\n        $user = $response-&gt;getGraphUser();\r\n        $userId =$user-&gt;getId();\r\n...\r\n    }\r\n}\r\n\r\nclass MyLaravelPersistentDataHandler implements PersistentDataInterface\r\n{\r\n    public function get($key) {\r\n        return session()-&gt;get($key);\r\n    }\r\n    public function set($key, $value) {\r\n        session()-&gt;put($key, $value);\r\n    }\r\n}<\/pre>\n<p>First, you make instance of Facebook.<\/p>\n<p>If you want to use\u00a0 FacebookDataHandler, you make FacebookDataHandler class and set persistent_data_handler key and value.<\/p>\n<p>getRedirectLoginHelper method is used to generate a &#8220;Login with Facebook&#8221; link and obtain an access token from a redirect.<\/p>\n<p>This method check session of state for csrf measures.<\/p>\n<p>Second, try to get user data with accessToken.<\/p>\n<p>There you can set field like id,email,first_name,family_name which you want to get at field.<\/p>\n<p>After this. you make user-data object by using\u00a0getGraphUser.<\/p>\n<p>This object can get user data by method.<\/p>\n<p>FInally, you write function you want.<\/p>\n<p>&nbsp;<\/p>\n<p>I refer to this page.<\/p>\n<p><a href=\"https:\/\/developers.facebook.com\/docs\/php\/Facebook\/5.0.0\">https:\/\/developers.facebook.com\/docs\/php\/Facebook\/5.0.0<\/a><\/p>\n<p><a href=\"https:\/\/developers.facebook.com\/docs\/php\/PersistentDataInterface\/5.0.0\">https:\/\/developers.facebook.com\/docs\/php\/PersistentDataInterface\/5.0.0<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>When I write code to authorize with facebook-sdk,  [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[20],"tags":[],"class_list":["post-661","post","type-post","status-publish","format-standard","hentry","category-php"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pattVc-aF","jetpack-related-posts":[{"id":684,"url":"https:\/\/snow-cat.net\/?p=684","url_meta":{"origin":661,"position":0},"title":"Laravel\u3067facebook-sdk\u3092\u4f7f\u7528\u3057\u3066Oauth\u3092\u5b9f\u88c5\u3059\u308b\u65b9\u6cd5","author":"hiro","date":"2020\u5e7411\u670814\u65e5","format":false,"excerpt":"\u524d\u56de\u3001\u82f1\u8a9e\u3067\u8a18\u4e8b\u3092\u66f8\u3044\u3066\u307f\u305f\u306e\u3067\u3001\u305d\u306e\u8a18\u4e8b\u306e\u65e5\u672c\u8a9e\u30d0\u30fc\u30b8\u30e7\u30f3\u3067\u3059\u3002 RedirectControll\u2026","rel":"","context":"PHP","block_context":{"text":"PHP","link":"https:\/\/snow-cat.net\/?cat=20"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":947,"url":"https:\/\/snow-cat.net\/?p=947","url_meta":{"origin":661,"position":1},"title":"October\u3092Mac\u306b\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b","author":"hiro","date":"2021\u5e743\u670828\u65e5","format":false,"excerpt":"\u3053\u3093\u306b\u3061\u306f\u3001\u3086\u304d\u306d\u3053\u3067\u3059\u3002 \u7686\u3055\u3093\u306f\u666e\u6bb5CMS\u3092\u4f7f\u3063\u3066\u3044\u307e\u3059\u304b\uff1f \u4ee5\u524dwagtail\u3092\u89e6\u3063\u3066\u3044\u305f\u306e\u3067\u2026","rel":"","context":"PHP","block_context":{"text":"PHP","link":"https:\/\/snow-cat.net\/?cat=20"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/snow-cat.net\/wp-content\/uploads\/2021\/03\/qa-207x300.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":613,"url":"https:\/\/snow-cat.net\/?p=613","url_meta":{"origin":661,"position":2},"title":"Laravel\u3067model\u3092\u5909\u66f4\u3057\u3066migrate\u3057\u3066\u3082\u53cd\u6620\u3055\u308c\u306a\u3044\u5834\u5408\u306e\u5bfe\u5fdc","author":"hiro","date":"2020\u5e748\u67088\u65e5","format":false,"excerpt":"\u524d\u56de\u3001sqlite\u306b\u5909\u66f4\u3057\u305f\u3042\u3068\u3001model\u5909\u66f4\u3057\u3066migrate\u3057\u3066\u3082\u5b9f\u884c\u3055\u308c\u306a\u304f\u3066\u60c5\u5831\u304c\u306a\u304b\u306a\u304b\u2026","rel":"","context":"PHP","block_context":{"text":"PHP","link":"https:\/\/snow-cat.net\/?cat=20"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/snow-cat.net\/wp-content\/uploads\/2020\/08\/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2020-08-08-20.44.42-300x23.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":1000,"url":"https:\/\/snow-cat.net\/?p=1000","url_meta":{"origin":661,"position":3},"title":"Assertion failed: (thread_id key != 0x7777), function find thread_id key, file ..\/src\/coroutine.cc\u30a8\u30e9\u30fc\u306e\u89e3\u6c7a\u7b56","author":"hiro","date":"2021\u5e745\u67084\u65e5","format":false,"excerpt":"Laravel\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067Vue.js\u5074\u958b\u767a\u3057\u3066\u305f\u3089\u4ee5\u4e0b\u306e\u30a8\u30e9\u30fc\u304c\u51fa\u3066\u7d50\u69cb\u56f0\u3063\u305f\u306e\u3067\u305d\u306e\u6642\u306e\u89e3\u6c7a\u2026","rel":"","context":"JavaScript","block_context":{"text":"JavaScript","link":"https:\/\/snow-cat.net\/?cat=11"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":959,"url":"https:\/\/snow-cat.net\/?p=959","url_meta":{"origin":661,"position":4},"title":"heroku\u306bdocker-compose\u3092\u4f7f\u3063\u3066Laravel\u88fd\u500b\u4eba\u30a2\u30d7\u30ea\u3092\u4f5c\u6210\u3059\u308b\u65b9\u6cd5","author":"hiro","date":"2021\u5e745\u67082\u65e5","format":false,"excerpt":"\u6700\u8fd1\u500b\u4eba\u30a2\u30d7\u30ea\u3092\u958b\u767a\u3057\u3066\u3044\u308b\u306e\u3067\u3059\u304c\u3001\u30a4\u30f3\u30d5\u30e9\u3069\u3046\u3057\u3088\u3046\u304b\u306a\u3068\u601d\u3063\u3066\u3068\u308a\u3042\u3048\u305aheroku\u3067\u884c\u3053\u3046\u3068\u2026","rel":"","context":"heroku","block_context":{"text":"heroku","link":"https:\/\/snow-cat.net\/?cat=21"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/snow-cat.net\/wp-content\/uploads\/2021\/04\/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2021-04-30-12.40.46.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/snow-cat.net\/wp-content\/uploads\/2021\/04\/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2021-04-30-12.40.46.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/snow-cat.net\/wp-content\/uploads\/2021\/04\/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2021-04-30-12.40.46.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/snow-cat.net\/wp-content\/uploads\/2021\/04\/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2021-04-30-12.40.46.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/snow-cat.net\/wp-content\/uploads\/2021\/04\/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2021-04-30-12.40.46.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/snow-cat.net\/wp-content\/uploads\/2021\/04\/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2021-04-30-12.40.46.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":1327,"url":"https:\/\/snow-cat.net\/?p=1327","url_meta":{"origin":661,"position":5},"title":"\u81ea\u52d5\u30c6\u30b9\u30c8\u3092Laravel\u3067\u66f8\u304f\u3068\u304d\u306e\u30b3\u30c4","author":"hiro","date":"2022\u5e742\u67082\u65e5","format":false,"excerpt":"\u81ea\u52d5\u30c6\u30b9\u30c8\u3092\u65e9\u304f\u3067\u66f8\u3051\u308b\u3088\u3046\u306b\u306a\u3063\u3066\u304d\u305f\u306e\u3067\u3001\u30b3\u30c4\u3067\u3082\u7d39\u4ecb\u3057\u3088\u3046\u304b\u3068\u601d\u3044\u307e\u3059\u3002 \u4eca\u56de\u306f\u30b3\u30de\u30f3\u30c9\u306e\u30c6\u30b9\u2026","rel":"","context":"\u305d\u306e\u4ed6\u3082\u308d\u3082\u308d","block_context":{"text":"\u305d\u306e\u4ed6\u3082\u308d\u3082\u308d","link":"https:\/\/snow-cat.net\/?cat=1"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/snow-cat.net\/index.php?rest_route=\/wp\/v2\/posts\/661","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/snow-cat.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/snow-cat.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/snow-cat.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/snow-cat.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=661"}],"version-history":[{"count":6,"href":"https:\/\/snow-cat.net\/index.php?rest_route=\/wp\/v2\/posts\/661\/revisions"}],"predecessor-version":[{"id":682,"href":"https:\/\/snow-cat.net\/index.php?rest_route=\/wp\/v2\/posts\/661\/revisions\/682"}],"wp:attachment":[{"href":"https:\/\/snow-cat.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=661"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/snow-cat.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=661"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/snow-cat.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=661"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}