{
    "componentChunkName": "component---src-templates-post-js",
    "path": "/laravel5-8-vue-js-huan-jing-nigoogle-recaptcha-v2woshi-zhuang-suru/",
    "result": {"data":{"ghostPost":{"id":"Ghost__Post__60fa77ac3986b000013a3971","title":"Laravel5.8 Vue.js 環境にGoogle reCAPTCHA v2を実装する","slug":"laravel5-8-vue-js-huan-jing-nigoogle-recaptcha-v2woshi-zhuang-suru","featured":false,"feature_image":"https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/1_qH5wPVMTKyBw7tA0A-2urg.png","excerpt":"Laravel5.8 Vue.js 環境にGoogle reCAPTCHA v2を実装する\n下準備\nreCAPTCHAreCAPTCHA is a security service that protects your websites from fraud\nand abuse.reCAPTCHA [https://www.google.com/recaptcha/about/]\n\nから登録をする。（ローカル環境で実行したければ、ローカルで動かす用のドメインを登録する）\n\nhostsに\n\n127.0.0.1 koooohe.development\n\nと書いてkooooohe.developmentを登録するなど。\n\n.env\n.envに取得した、SITE_KEYとSECRET_KEYを書いていく。\n\nMIX_RECAPTCHA_KEY=XXXXXX\nRECAPTCHA_SECRET=XXXXXX\n\n\nMIXというprefixをつけておくと、Vue.jsからも読み込めるようになる。\n\nCompiling Assets (Mix) - Laravel - The PHP Framework","custom_excerpt":null,"visibility":"public","created_at_pretty":"23 July, 2021","published_at_pretty":"09 July, 2019","updated_at_pretty":"21 April, 2022","created_at":"2021-07-23T17:02:52.000+09:00","published_at":"2019-07-10T00:00:00.000+09:00","updated_at":"2022-04-21T17:06:17.000+09:00","meta_title":null,"meta_description":null,"og_description":null,"og_image":null,"og_title":null,"twitter_description":null,"twitter_image":null,"twitter_title":null,"authors":[{"name":"Kohei Kondo","slug":"kooooohe","bio":null,"profile_image":"https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/MVIMG_20180910_102813.png","twitter":"@kooooohe_","facebook":null,"website":null}],"primary_author":{"name":"Kohei Kondo","slug":"kooooohe","bio":null,"profile_image":"https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/MVIMG_20180910_102813.png","twitter":"@kooooohe_","facebook":null,"website":null},"primary_tag":{"name":"PHP","slug":"php","description":null,"feature_image":null,"meta_description":null,"meta_title":null,"visibility":"public"},"tags":[{"name":"PHP","slug":"php","description":null,"feature_image":null,"meta_description":null,"meta_title":null,"visibility":"public"},{"name":"Laravel","slug":"laravel","description":null,"feature_image":null,"meta_description":null,"meta_title":null,"visibility":"public"},{"name":"reCAPCHA","slug":"recapcha","description":null,"feature_image":null,"meta_description":null,"meta_title":null,"visibility":"public"}],"plaintext":"Laravel5.8 Vue.js 環境にGoogle reCAPTCHA v2を実装する\n下準備\nreCAPTCHAreCAPTCHA is a security service that protects your websites from fraud\nand abuse.reCAPTCHA [https://www.google.com/recaptcha/about/]\n\nから登録をする。（ローカル環境で実行したければ、ローカルで動かす用のドメインを登録する）\n\nhostsに\n\n127.0.0.1 koooohe.development\n\nと書いてkooooohe.developmentを登録するなど。\n\n.env\n.envに取得した、SITE_KEYとSECRET_KEYを書いていく。\n\nMIX_RECAPTCHA_KEY=XXXXXX\nRECAPTCHA_SECRET=XXXXXX\n\n\nMIXというprefixをつけておくと、Vue.jsからも読み込めるようになる。\n\nCompiling Assets (Mix) - Laravel - The PHP Framework For Web ArtisansLaravel\n[https://laravel.com/docs/5.7/mix#environment-variables]\n\nVue.js\nreCAPTCHAの情報を取得する\nrecaptcha_site_key() {\n  return process.env.MIX_RECAPTCHA_KEY;\n}\n\n\n\nといった感じで、.envの内容を取得する。\n\nそして、recaptchaをVue.jsで使うためのpluginをinstall\n\nyarn add vue-recaptcha\n\ncreated methodで最初に、reCAPRCHA必要な情報を読み込むscriptタグを作成\n\ncomponents: { VueRecaptcha },\ncreated() {        \n  let recaptchaScript = document.createElement('script');  \n  recaptchaScript.setAttribute('src','https://www.google.com/recaptcha/api.js?onload=vueRecaptchaApiLoaded&render=explicit');\n  document.head.appendChild(recaptchaScript); \n},\n\n\nそして、HTMLを記述\n\n<template>    \n  <vue-recaptcha class=\"g-recaptcha\"\n                 ref=\"recaptcha\"     \n                 :sitekey=\"recaptcha_site_key\"\n                 @verify=\"onVerify\"\n                 @expired=\"onExpired\"/>\n</template>\n\n\nそして、ライブラリで用意されているmethodを準備する。\n\nこのrecaptcha_tokenをサーバに投げるのである。\n\ndata() {\n  return {    recaptcha_token: '',  }\n  },\n  methods: {\n  onVerify(response) {\n  this.recaptcha_token = response;\n  },\n  onExpired() {\n    this.recaptcha_token = ''; //レスポンスのトークンを空に戻す\n  },\n  resetRecaptcha() {\n  this.$refs.recaptcha.reset();\n  }}\n\n\nPOSTはこんな感じで適当に各自の実装に合わせてください。\n\nこのtokenとは別に本来ならpasswordとemailなども送ると思います。\n\naxios\n.post('/api/login', {token:this.recaptcha_token})\n.then(response => {})axios\n.post('/api/login', {token:this.recaptcha_token})\n.then(response => {})\n\n\n\nLaravel\nGuzzleをinstall\ncomposer require guzzlehttp/guzzle\n\n\n\napp/Validation/ReCaptcha.phpを作成\nこれで、validtionをしていく。\n\n<?phpnamespace App\\Validators;use GuzzleHttp\\Client;\n  class ReCaptcha{\n    public function validate($attribute, $value, $parameters, $validator)\n    {\n        $client = new Client;\n        $response = $client->post(\n            'https://www.google.com/recaptcha/api/siteverify',\n            [\n                'form_params' =>\n                [\n                    'secret' => env('RECAPTCHA_SECRET'),\n                    'response' => $value\n                ]\n            ]\n        );\n        $body = json_decode((string) $response->getBody());\n        return $body->success;\n    }\n}\n\n\napp/Providers/AppServiceProvider.phpに追加\n<?phpnamespace App\\Providers;use Illuminate\\Support\\ServiceProvider;\nuseApp\\Validation\\CustomValidator;\nclass AppServiceProvider\nextends ServiceProvider{\n  /**\n  * Bootstrap any application services.\n  *\n  * @return void\n  */\n  public function boot()\n  {\n    Validator::extendImplicit('recaptcha','App\\\\Validators\\\\ReCaptcha@validate');\n  }_/**\n  * Register any application services.\n  *\n  * @return void\n  */\n  public function register()\n  {\n    //\n  }}\n\n\nextendではなく、extedImplictを使うことによって、暗黙のrequiredになる。(valueが空でもこの関数が呼ばれる）\n\nRuleを追加\n/**\n*\nGet the validation rules that apply to the request.\n*\n* @return array\n*/\npublic function rules()\n{\n  return [\n    'token' => [\n      'recaptcha'\n    ]\n  ];\n}\n\n\nもしうまく動かなければ\n\ncompser dumpautoload\n\nを実行する。\n\n参考\n\n> https://laravel.com/docs/5.7/mix#environment-variables\nhttps://medium.com/@patrickcurl/using-laravel-env-variables-inside-vue-js-components-29faa9a344c5\nhttps://codeday.me/jp/qa/20190301/341325.html\nhttps://blog.capilano-fw.com/?p=3545\nhttps://medium.com/@dennissmink/laravel-google-recaptcha-a0e2d8b2d03b","html":"<h3 id=\"laravel58-vuejs-%E7%92%B0%E5%A2%83%E3%81%ABgoogle-recaptcha-v2%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B\">Laravel5.8 Vue.js 環境にGoogle reCAPTCHA v2を実装する</h3><figure class=\"kg-card kg-image-card\"><img src=\"https://cdn-images-1.medium.com/max/800/1*qH5wPVMTKyBw7tA0A-2urg.png\" class=\"kg-image\" alt loading=\"lazy\"></figure><h3 id=\"%E4%B8%8B%E6%BA%96%E5%82%99\">下準備</h3><figure class=\"kg-card kg-bookmark-card\"><a class=\"kg-bookmark-container\" href=\"https://www.google.com/recaptcha/about/\"><div class=\"kg-bookmark-content\"><div class=\"kg-bookmark-title\">reCAPTCHA</div><div class=\"kg-bookmark-description\">reCAPTCHA is a security service that protects your websites from fraud and abuse.</div><div class=\"kg-bookmark-metadata\"><img class=\"kg-bookmark-icon\" src=\"https://www.google.com/recaptcha/about/images/favicon.png\"><span class=\"kg-bookmark-author\">reCAPTCHA</span></div></div><div class=\"kg-bookmark-thumbnail\"><img src=\"https://www.google.com/recaptcha/about/images/reCAPTCHA-enterprise.png\"></div></a></figure><p></p><p>から登録をする。（ローカル環境で実行したければ、ローカルで動かす用のドメインを登録する）</p><p>hostsに</p><p>127.0.0.1 koooohe.development</p><p>と書いてkooooohe.developmentを登録するなど。</p><h3 id=\"env\">.env</h3><p>.envに取得した、SITE_KEYとSECRET_KEYを書いていく。</p><!--kg-card-begin: markdown--><pre><code>MIX_RECAPTCHA_KEY=XXXXXX\nRECAPTCHA_SECRET=XXXXXX\n</code></pre>\n<!--kg-card-end: markdown--><p>MIXというprefixをつけておくと、Vue.jsからも読み込めるようになる。</p><figure class=\"kg-card kg-bookmark-card\"><a class=\"kg-bookmark-container\" href=\"https://laravel.com/docs/5.7/mix#environment-variables\"><div class=\"kg-bookmark-content\"><div class=\"kg-bookmark-title\">Compiling Assets (Mix) - Laravel - The PHP Framework For Web Artisans</div><div class=\"kg-bookmark-description\"></div><div class=\"kg-bookmark-metadata\"><img class=\"kg-bookmark-icon\" src=\"https://laravel.com/img/favicon/apple-touch-icon.png\"><span class=\"kg-bookmark-author\">Laravel</span></div></div><div class=\"kg-bookmark-thumbnail\"><img src=\"https://laravel.com/img/logomark.min.svg\"></div></a></figure><p></p><h3 id=\"vuejs\">Vue.js</h3><h4 id=\"recaptcha%E3%81%AE%E6%83%85%E5%A0%B1%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B\">reCAPTCHAの情報を取得する</h4><!--kg-card-begin: markdown--><pre><code class=\"language-php\">recaptcha_site_key() {\n  return process.env.MIX_RECAPTCHA_KEY;\n}\n\n</code></pre>\n<!--kg-card-end: markdown--><p>といった感じで、.envの内容を取得する。</p><p>そして、recaptchaをVue.jsで使うためのpluginをinstall</p><!--kg-card-begin: markdown--><p><code>yarn add vue-recaptcha</code></p>\n<!--kg-card-end: markdown--><p>created methodで最初に、reCAPRCHA必要な情報を読み込むscriptタグを作成</p><!--kg-card-begin: markdown--><pre><code class=\"language-javascript\">components: { VueRecaptcha },\ncreated() {        \n  let recaptchaScript = document.createElement('script');  \n  recaptchaScript.setAttribute('src','https://www.google.com/recaptcha/api.js?onload=vueRecaptchaApiLoaded&amp;render=explicit');\n  document.head.appendChild(recaptchaScript); \n},\n</code></pre>\n<!--kg-card-end: markdown--><p>そして、HTMLを記述</p><!--kg-card-begin: markdown--><pre><code class=\"language-html\">&lt;template&gt;    \n  &lt;vue-recaptcha class=&quot;g-recaptcha&quot;\n                 ref=&quot;recaptcha&quot;     \n                 :sitekey=&quot;recaptcha_site_key&quot;\n                 @verify=&quot;onVerify&quot;\n                 @expired=&quot;onExpired&quot;/&gt;\n&lt;/template&gt;\n</code></pre>\n<!--kg-card-end: markdown--><p>そして、ライブラリで用意されているmethodを準備する。</p><p>このrecaptcha_tokenをサーバに投げるのである。</p><!--kg-card-begin: markdown--><pre><code class=\"language-javascript\">data() {\n  return {    recaptcha_token: '',  }\n  },\n  methods: {\n  onVerify(response) {\n  this.recaptcha_token = response;\n  },\n  onExpired() {\n    this.recaptcha_token = ''; //レスポンスのトークンを空に戻す\n  },\n  resetRecaptcha() {\n  this.$refs.recaptcha.reset();\n  }}\n</code></pre>\n<!--kg-card-end: markdown--><p>POSTはこんな感じで適当に各自の実装に合わせてください。</p><p>このtokenとは別に本来ならpasswordとemailなども送ると思います。</p><!--kg-card-begin: markdown--><pre><code class=\"language-javascript\">axios\n.post('/api/login', {token:this.recaptcha_token})\n.then(response =&gt; {})axios\n.post('/api/login', {token:this.recaptcha_token})\n.then(response =&gt; {})\n\n</code></pre>\n<!--kg-card-end: markdown--><h3 id=\"laravel\">Laravel</h3><h4 id=\"guzzle%E3%82%92install\">Guzzleをinstall</h4><!--kg-card-begin: markdown--><p><code>composer require guzzlehttp/guzzle</code></p>\n<!--kg-card-end: markdown--><p></p><h3 id=\"appvalidationrecaptchaphp%E3%82%92%E4%BD%9C%E6%88%90\">app/Validation/ReCaptcha.phpを作成</h3><p>これで、validtionをしていく。</p><!--kg-card-begin: markdown--><pre><code class=\"language-php\">&lt;?phpnamespace App\\Validators;use GuzzleHttp\\Client;\n  class ReCaptcha{\n    public function validate($attribute, $value, $parameters, $validator)\n    {\n        $client = new Client;\n        $response = $client-&gt;post(\n            'https://www.google.com/recaptcha/api/siteverify',\n            [\n                'form_params' =&gt;\n                [\n                    'secret' =&gt; env('RECAPTCHA_SECRET'),\n                    'response' =&gt; $value\n                ]\n            ]\n        );\n        $body = json_decode((string) $response-&gt;getBody());\n        return $body-&gt;success;\n    }\n}\n</code></pre>\n<!--kg-card-end: markdown--><h4 id=\"appprovidersappserviceproviderphp%E3%81%AB%E8%BF%BD%E5%8A%A0\">app/Providers/AppServiceProvider.phpに追加</h4><!--kg-card-begin: markdown--><pre><code>&lt;?phpnamespace App\\Providers;use Illuminate\\Support\\ServiceProvider;\nuseApp\\Validation\\CustomValidator;\nclass AppServiceProvider\nextends ServiceProvider{\n  /**\n  * Bootstrap any application services.\n  *\n  * @return void\n  */\n  public function boot()\n  {\n    Validator::extendImplicit('recaptcha','App\\\\Validators\\\\ReCaptcha@validate');\n  }_/**\n  * Register any application services.\n  *\n  * @return void\n  */\n  public function register()\n  {\n    //\n  }}\n</code></pre>\n<!--kg-card-end: markdown--><p>extendではなく、extedImplictを使うことによって、暗黙のrequiredになる。(valueが空でもこの関数が呼ばれる）</p><h4 id=\"rule%E3%82%92%E8%BF%BD%E5%8A%A0\">Ruleを追加</h4><!--kg-card-begin: markdown--><pre><code class=\"language-php\">/**\n*\nGet the validation rules that apply to the request.\n*\n* @return array\n*/\npublic function rules()\n{\n  return [\n    'token' =&gt; [\n      'recaptcha'\n    ]\n  ];\n}\n</code></pre>\n<!--kg-card-end: markdown--><p>もしうまく動かなければ</p><!--kg-card-begin: markdown--><p><code>compser dumpautoload</code></p>\n<!--kg-card-end: markdown--><p>を実行する。</p><p>参考</p><blockquote><a href=\"https://laravel.com/docs/5.7/mix#environment-variables\" rel=\"nofollow noopener noopener noopener\"><em>https://laravel.com/docs/5.7/mix#environment-variables</em></a><br><a href=\"https://medium.com/@patrickcurl/using-laravel-env-variables-inside-vue-js-components-29faa9a344c5\" rel=\"nofollow noopener\"><em>https://medium.com/@patrickcurl/using-laravel-env-variables-inside-vue-js-components-29faa9a344c5</em></a><br><a href=\"https://codeday.me/jp/qa/20190301/341325.html\" rel=\"nofollow noopener noopener noopener\"><em>https://codeday.me/jp/qa/20190301/341325.html</em></a><br><a href=\"https://blog.capilano-fw.com/?p=3545\" rel=\"nofollow noopener noopener noopener\"><em>https://blog.capilano-fw.com/?p=3545</em></a><br><a href=\"https://medium.com/@dennissmink/laravel-google-recaptcha-a0e2d8b2d03b\" rel=\"nofollow noopener\"><em>https://medium.com/@dennissmink/laravel-google-recaptcha-a0e2d8b2d03b</em></a></blockquote>","url":"https://ghost.tech.anti-pattern.co.jp/laravel5-8-vue-js-huan-jing-nigoogle-recaptcha-v2woshi-zhuang-suru/","canonical_url":null,"uuid":"317d8a91-98bb-4c22-b2a6-10450ef0bf82","page":null,"codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"60fa77ac3986b000013a3971","reading_time":3}},"pageContext":{"slug":"laravel5-8-vue-js-huan-jing-nigoogle-recaptcha-v2woshi-zhuang-suru"}},
    "staticQueryHashes": ["176528973","2358152166","2561578252","2731221146","4145280475"]}