{"id":1112,"date":"2014-12-05T17:09:46","date_gmt":"2014-12-05T09:09:46","guid":{"rendered":"http:\/\/blog.turn.tw\/?p=1112"},"modified":"2014-12-05T17:09:46","modified_gmt":"2014-12-05T09:09:46","slug":"laravel%ef%bc%9a20%e5%88%86%e9%90%98%e5%ae%8c%e6%88%90facebook%e7%99%bb%e5%85%a5%e5%8a%9f%e8%83%bd","status":"publish","type":"post","link":"https:\/\/blog.turn.tw\/?p=1112","title":{"rendered":"Laravel\uff1a20\u5206\u9418\u5b8c\u6210Facebook\u767b\u5165\u529f\u80fd"},"content":{"rendered":"<p>\u8981\u5be6\u4f5cFacebook\u7684OAuth 2.0\u767b\u5165\u6d41\u7a0b\uff0c\u6700\u57fa\u672c\u7684\u65b9\u6cd5\u662f\u5148\u77ad\u89e3OAuth 2.0\u5354\u5b9a\u5167\u5bb9\uff0c\u63a5\u8457\u5230Facebook\u5b98\u7db2\u4e0b\u8f09\u7a0b\u5f0f\u8a9e\u8a00\u7684SDK\u3001\u8a3b\u518a\u61c9\u7528\u7a0b\u5f0f\uff0c\u7136\u5f8c\u7167\u8457\u5b98\u65b9\u6587\u4ef6\u5be6\u4f5c\u3002<\/p>\n<p>\u4f46\u5982\u679c\u4f7f\u7528Laravel\u7684\u8a71\uff0c\u76f4\u63a5\u4f7f\u7528\u793e\u7fa4\u63d0\u4f9b\u7684package\u5c31\u53ef\u4ee5\u56c9\u3002\u672c\u6587\u4ecb\u7d39<a href=\"https:\/\/github.com\/artdarek\/oauth-4-laravel\" title=\"artdarek\/oauth-4-laravel\">artdarek\/oauth-4-laravel<\/a>\u7684\u4f7f\u7528\u3002<\/p>\n<p>\u9996\u5148\u8981\u4e0b\u8f09\u9019\u500b\u5957\u4ef6\u3002\u5728\u6307\u4ee4\u5217\u8f38\u5165\uff1a<\/p>\n<pre>\r\ncomposer require 'artdarek\/oauth-4-laravel:dev-master'\r\n<\/pre>\n<p>\u81ea\u52d5\u4e0b\u8f09\u5b8c\u7562\u4e4b\u5f8c\uff0c\u5728&#8217;app\/config\/app.php&#8217;\u5167\u52a0\u5165\u5169\u500bvalue\uff1a<\/p>\n<pre>\r\n'providers' => array(\r\n    \/\/ ...\r\n\r\n    'Artdarek\\OAuth\\OAuthServiceProvider'\r\n)\r\n\r\n'aliases' => array(\r\n    \/\/ ...\r\n\r\n    'OAuth' => 'Artdarek\\OAuth\\Facade\\OAuth',\r\n)\r\n<\/pre>\n<p>Laravel\u5c31\u77e5\u9053\u53bb\u54ea\u627e\u9019\u500b\u5957\u4ef6\u4e86\u3002<\/p>\n<p>\u7136\u5f8c\u5728&#8217;app\/config\/&#8217;\u5e95\u4e0b\u5efa\u7acb&#8217;oauth-4-laravel.php&#8217;\u8a2d\u5b9a\u6a94\uff1a<\/p>\n<pre>\r\n<?php\r\nreturn array( \r\n\r\n    \/*\r\n    |--------------------------------------------------------------------------\r\n    | oAuth Config\r\n    |--------------------------------------------------------------------------\r\n    *\/\r\n\r\n    \/**\r\n     * Storage\r\n     *\/\r\n    'storage' => 'Session', \r\n\r\n    \/**\r\n     * Consumers\r\n     *\/\r\n    'consumers' => array(\r\n\r\n        \/**\r\n         * Facebook\r\n         *\/\r\n        'Facebook' => array(\r\n            'client_id'     => '',\r\n            'client_secret' => '',\r\n            'scope'         => array(),\r\n        ),      \r\n\r\n    )\r\n\r\n);\r\n<\/pre>\n<p>\u5176\u4e2d\u7684client_id\u8ddfclient_secret\u9700\u8981\u8ddfFacebook\u53d6\u5f97\uff0c\u8acb\u5230<a href=\"https:\/\/developers.facebook.com\/\" title=\"Facebook Developers\">Facebook Developers<\/a>\u8a3b\u518a\u4e00\u500bapp\uff1a<br \/>\n\u4e0a\u9762\u7684Apps => Add a New App => Website => \u8f38\u5165app\u540d\u7a31 => Create New Facebook App ID => \u641e\u5b9a\u3002<br \/>\n\u628aid \u8ddf secret\u8907\u88fd\u8cbc\u4e0a\u5230\u9019\u908a\u3002<br \/>\nscopte\u7559\u7a7a\u9663\u5217\uff0c\u53ea\u6703\u8ddf\u81c9\u66f8\u62ff\u5230\u57fa\u672c\u516c\u958b\u8cc7\u6599\u3002\u5982\u679c\u60f3\u8981email\u7684\u8a71\uff0c\u5c31\u5728\u9663\u5217\u5167\u52a0\u5165&#8217;email&#8217;\u3002<br \/>\n\u95dc\u65bc\u6b0a\u9650\u8acb\u53c3\u8003\u5b98\u7db2\uff1a<a href=\"https:\/\/developers.facebook.com\/docs\/facebook-login\/permissions\/v2.2?locale=zh_TW\" title=\"Permissions with Facebook Login\">Permissions with Facebook Login<\/p>\n<p><\/a><\/p>\n<p>\u7136\u5f8c\u5728&#8217;app\/routes.php&#8217;\u52a0\u5165\u4f60\u5e0c\u671b\u7684route\uff1a<br \/>\n(\u5047\u8a2d\u4f60\u6709\u500b\u8ca0\u8cac\u6703\u54e1\u8cc7\u6599\u7684controller\u7a31\u70baMemberController)<\/p>\n<pre>\r\nRoute::get('\/auth\/facebook', 'MemberController@loginWithFacebook');\r\n<\/pre>\n<p>\u5728\u4f60\u5e0c\u671b\u63d0\u4f9bfacebook\u767b\u5165\u7684\u9801\u9762\u52a0\u5165\uff1a<\/p>\n<pre>\r\n    <a href='\/auth\/facebook'>Login with Facebook<\/a>\r\n<\/pre>\n<p>\u7136\u5f8c\u5230\u4f60\u7684MemberController\u52a0\u5165\u9019\u6bb5\u7a0b\u5f0f\u78bc\uff1a<\/p>\n<pre>\r\npublic function loginWithFacebook() {\r\n\r\n    \/\/ get data from input\r\n    $code = Input::get( 'code' );\r\n\r\n    \/\/ get fb service\r\n    $fb = OAuth::consumer( 'Facebook' );\r\n\r\n    \/\/ check if code is valid\r\n\r\n    \/\/ if code is provided get user data and sign in\r\n    if ( !empty( $code ) ) {\r\n\r\n        \/\/ This was a callback request from facebook, get the token\r\n        $token = $fb->requestAccessToken( $code );\r\n\r\n        \/\/ Send a request with it\r\n        $result = json_decode( $fb->request( '\/me' ), true );\r\n\r\n        $message = 'Your unique facebook user id is: ' . $result['id'] . ' and your name is ' . $result['name'];\r\n        echo $message. \"<br\/>\";\r\n\r\n        \/\/Var_dump\r\n        \/\/display whole array().\r\n        dd($result);\r\n\r\n    }\r\n    \/\/ if not ask for permission first\r\n    else {\r\n        \/\/ get fb authorization\r\n        $url = $fb->getAuthorizationUri();\r\n\r\n        \/\/ return to facebook login url\r\n         return Redirect::to( (string)$url );\r\n    }\r\n\r\n}\r\n<\/pre>\n<p>\u5927\u529f\u544a\u6210\uff01\u6309\u4e0b\u4f60\u525b\u8a2d\u5b9a\u7684&#8217;Login with Facebook&#8217;\u6309\u9215\uff0c\u4f60\u6703\u770b\u5230Faecbok\u8981\u6c42\u6388\u6b0a\u3001\u4e4b\u5f8c\u6703\u5728\u4f60\u7684\u7db2\u7ad9\u4e0a\u986f\u793a\u5f9eFacebook\u6488\u5230\u7684\u500b\u8cc7\u3002\u5982\u4f55\u4f7f\u7528\u9019\u4e9b\u500b\u8cc7\u5c31\u770b\u60a8\u6253\u7b97\u5982\u4f55\u61c9\u7528\u56c9\u3002<\/p>\n<h3>Q&#038;A<\/h3>\n<p><em>Q: \u96d6\u7136\u5f88\u795e\u5947\uff0c\u4f46\u9019\u5f9e\u982d\u5230\u5c3e\u9ed1\u7bb1\u4f5c\u696d\u3002\u80cc\u5f8c\u5230\u5e95\u767c\u751f\u4ec0\u9ebc\u4e8b\u6211\u90fd\u4e0d\u77e5\u9053\uff0c\u8981\u6211\u5982\u4f55\u6562\u7167\u505a\uff1f<\/em><\/p>\n<p>\u554f\u5f97\u597d\u3002\u5176\u5be6\uff0c\u6703\u9019\u9ebc\u795e\u5947\u662f\u56e0\u70ba&#8230;<\/p>\n<p>\u5957\u4ef6\u7ba1\u7406\u4f7f\u7528\u4e86Composer\uff0c\u6240\u4ee5\u53ea\u8981\u8f38\u5165composer require\u5c31\u6703\u81ea\u52d5\u4e0b\u8f09\u5b8c\u7562\u3002\u4e0d\u653e\u5fc3\u7684\u8a71\u8acb\u5230<a href=\"https:\/\/getcomposer.org\/\" title=\"Composer\u5b98\u7db2\">Composer\u5b98\u7db2<\/a>\u901b\u901b\uff0c\u6216\u662f\u95b1\u8b80\u6211\u4e4b\u524d\u5beb\u7684<a href=\"https:\/\/blog.turn.tw\/?p=1039\" title=\"Composer\u8a2d\u8a08\u539f\u7406\u8207\u57fa\u672c\u7528\u6cd5\">Composer\u8a2d\u8a08\u539f\u7406\u8207\u57fa\u672c\u7528\u6cd5<\/a>\u3002<\/p>\n<p>\u9664\u6b64\u4e4b\u5916\uff0c\u4e00\u822c\u4f86\u8aaa\u8f09\u597d\u7b2c3\u65b9\u5957\u4ef6\u4e4b\u5f8c\uff0c\u901a\u5e38\u4f60\u81f3\u5c11\u9700\u8981\u521d\u59cb\u5316\u9019\u500b\u7b2c3\u65b9\u985e\u5225\u3001\u63a5\u8457\u8a2d\u5b9a\u5e7e\u500b\u503c\u4e4b\u985e\u7684\uff1a<\/p>\n<pre>\r\n$coolLibrary = new ThirdPartyLibrary();\r\n$coolLibrary->setParameter($paramater)\r\n<\/pre>\n<p>\u4f46\u662fLaravel\u63d0\u4f9bService Provider\u529f\u80fd\uff0c\u8b93package\u7684\u521d\u59cb\u5316\u5728Service Provider\u5167\u5b8c\u6210\uff0c\u7136\u5f8cLaravel\u53c8\u63d0\u4f9bFacades\u529f\u80fd\uff0c\u8b93\u4f60\u53ef\u4ee5\u4f7f\u7528\u985e\u5225\u975c\u614b\u51fd\u5f0f\u53bb\u64cd\u4f5c\u67d0\u500b\u5be6\u9ad4\u3002<br \/>\n\u7d50\u679c\u5c31\u662f\u4f60\u53ea\u9700\u8981\u5beb\u9019\u884c\uff1a<\/p>\n<pre>\r\n $fb = OAuth::consumer( 'Facebook' );\r\n<\/pre>\n<p>\u4f60\u5c31\u53ef\u4ee5\u7528\u9019$fb\u8b8a\u6578\u53bb\u9032\u884c\u5404\u7a2e\u64cd\u4f5c&#8230;\u9a57\u8b49\u3001\u767c\u9001API request\u3001\u7b49\u7b49\u3002<br \/>\n\u7576\u7136\u9019\u7a2e\u975c\u614b\u51fd\u5f0f\u5305\u88dd\u67d0\u500b\u5be6\u9ad4\u7684\u4f5c\u6cd5\uff0c\u6709\u4e9b\u4eba\u4e0d\u559c\u6b61\u3001\u8a8d\u70ba\u9019\u53cdOOP\u3002\u53c3\u898b\uff1a<a href=\"https:\/\/blog.turn.tw\/?page_id=875\" title=\"\u8b93\u4f60\u5c11\u6253\u5f88\u591a\u5b57\uff1aFacades\u3002\">\u8b93\u4f60\u5c11\u6253\u5f88\u591a\u5b57\uff1aFacades\u3002<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u8981\u5be6\u4f5cFacebook\u7684OAuth 2.0\u767b\u5165\u6d41\u7a0b\uff0c\u6700\u57fa\u672c\u7684\u65b9\u6cd5\u662f\u5148\u77ad\u89e3OAuth 2.0\u5354\u5b9a\u5167\u5bb9\uff0c\u63a5\u8457\u5230Fa &hellip; <a href=\"https:\/\/blog.turn.tw\/?p=1112\" class=\"more-link\">\u7e7c\u7e8c\u95b1\u8b80 <span class=\"screen-reader-text\">Laravel\uff1a20\u5206\u9418\u5b8c\u6210Facebook\u767b\u5165\u529f\u80fd<\/span> <span class=\"meta-nav\">&rarr;<\/span> <\/a><\/p>\n","protected":false},"author":1,"featured_media":855,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false},"categories":[2],"tags":[18,14,26],"_links":{"self":[{"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/posts\/1112"}],"collection":[{"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1112"}],"version-history":[{"count":9,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/posts\/1112\/revisions"}],"predecessor-version":[{"id":1121,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/posts\/1112\/revisions\/1121"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/media\/855"}],"wp:attachment":[{"href":"https:\/\/blog.turn.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1112"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1112"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1112"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}