\r\n```\r\n\r\nsrc/backend/controllers/login.ts \r\n```ここに言語名を入力\r\nimport express, { Router } from 'express'\r\nimport qs from 'querystring';\r\nimport axios from 'axios';\r\n\r\nvar router: Router = express.Router();\r\n\r\nconst client_id = process.env.GOOGLE_OAUTH_CLIENT_ID || '{Google からコピーしたクライアントID}'\r\nconst client_secret = process.env.GOOGLE_OAUTH_CLIENT_SECRET || '{Google からコピーしたクライアントシークレット}'\r\nconst redirect_uri_postfix = '/oauthRedirect/google'\r\nconst response_type = 'code'\r\nconst scope = 'email'\r\n\r\nconst GOOGLE_URL_AUTH = 'https://accounts.google.com/o/oauth2/v2/auth'\r\nconst GOOGLE_URL_TOKEN = 'https://www.googleapis.com/oauth2/v4/token'\r\nconst GOOGLE_URL_USERINFO = 'https://www.googleapis.com/oauth2/v3/userinfo'\r\n\r\nrouter.get('/google/loginPath', function (req, res) {\r\n var redirect_uri = req.protocol + \"://\" + req.get(\"Host\") + redirect_uri_postfix;\r\n const params = qs.stringify({\r\n client_id,\r\n redirect_uri,\r\n response_type,\r\n scope,\r\n })\r\n res.send({ url: `${GOOGLE_URL_AUTH}?${params}` })\r\n});\r\n\r\nrouter.post('/google/loginPath', async function (req, res) {\r\n try {\r\n var params = new URLSearchParams();\r\n params.append('client_id', client_id);\r\n params.append('client_secret', client_secret);\r\n params.append('code', req.body.code);\r\n params.append('grant_type', 'authorization_code');\r\n params.append('redirect_uri', req.body.redirect_uri);\r\n\r\n const response = await axios.post(GOOGLE_URL_TOKEN, params)\r\n const access_token = response.data.access_token;\r\n\r\n const userInfoResponse = await axios.get(GOOGLE_URL_USERINFO, {\r\n headers: {\r\n 'Authorization': `Bearer ${access_token}`,\r\n }\r\n });\r\n const userInfo = userInfoResponse.data;\r\n res.send({\r\n access_token,\r\n userInfo\r\n });\r\n } catch(e) {\r\n res.status(400).send();\r\n }\r\n});\r\n\r\nexport default router;\r\n```\r\n\r\nsrc/backend/index.ts\r\n```ここに言語名を入力\r\nimport express from 'express'\r\nimport messageController from './controllers/message'\r\nimport enqueteController from './controllers/enquete'\r\nimport loginController from './controllers/login'\r\nimport {createConnection} from 'typeorm'\r\n\r\nimport Enquete from './models/Enquete'\r\n\r\nconst app: express.Express = express()\r\n\r\n// 追加 サーバの強化追加\r\napp.use(express.json())\r\napp.use(express.urlencoded({ extended: true }))\r\n// 追加終了\r\n\r\n// 追加 処理の外だし\r\napp.use(\"/messages\", messageController)\r\napp.use(\"/api/enquetes\", enqueteController)\r\napp.use(\"/api/login\", loginController)\r\napp.use(\"/\", express.static(__dirname + \"/public\"))\r\napp.use(\"*\", (req, res) => {\r\n res.status(200).sendFile(__dirname + \"/public/index.html\");\r\n});\r\n// 追加終了\r\n\r\n!async function initialize(){\r\n await createConnection({\r\n type: \"postgres\",\r\n url: process.env.DATABASE_URL || \"postgres://postgres:postgres@localhost:5432/postgres\",\r\n synchronize: true,\r\n entities: [\r\n Enquete,\r\n ],\r\n extra: {\r\n ssl: (!!process.env.DATABASE_SSL) ? {\r\n rejectUnauthorized: false,\r\n } : false,\r\n }\r\n });\r\n\r\n\r\n// 3000番ポートでAPIサーバ起動\r\nconst port = process.env.PORT || 3000;\r\napp.listen(port, () => {\r\n console.log(\"ポート\" + port + \"番で起動したよ〜!\")\r\n})\r\n}()\r\n```\r\n\r\nsrc/front/components/RedirectedFromGoogle.vue\r\n```ここに言語名を入力\r\n\r\n\r\n```\r\n\r\nsrc/front/components/App.vue\r\n```ここに言語名を入力\r\n\r\n\r\n```\r\n\r\nsrc/backend/controllers/enquete.ts\r\n```ここに言語名を入力\r\nimport express, { Router } from 'express'\r\nimport { getRepository } from 'typeorm'\r\nimport Enquete from '../models/Enquete'\r\nimport axios from 'axios'\r\nconst GOOGLE_URL_USERINFO = 'https://www.googleapis.com/oauth2/v3/userinfo'\r\nconst ADMIN_MAIL = \"Google Accountのメールアドレス\"\r\n\r\nvar router: Router = express.Router();\r\n\r\nrouter.post('/', async function(req, res) {\r\n const enquete = req.body;\r\n const EnqueteRepository = getRepository(Enquete);\r\n await EnqueteRepository.save(enquete);\r\n res.send(enquete);\r\n});\r\nrouter.get('/', async function (req, res) {\r\n const userInfoResponse = await axios.get(GOOGLE_URL_USERINFO, {\r\n headers: {\r\n 'Authorization': `Bearer ${req.header(\"Authorization\")}`,\r\n }\r\n });\r\n if (ADMIN_MAIL != userInfoResponse.data.email) {\r\n res.status(401).send()\r\n return;\r\n }\r\n const EnqueteRepository = getRepository(Enquete);\r\n const enquetes = await EnqueteRepository.find();\r\n res.send(enquetes);\r\n});\r\nexport default router;\r\n```\r\n\r\n### 試したこと\r\n\r\nsrc/backend/controllers/enquete.ts\r\nconst ADMIN_MAIL = \"Google Accountのメールアドレス\"\r\n\r\nsrc/backend/controllers/login.ts \r\nconst client_id = process.env.GOOGLE_OAUTH_CLIENT_ID || '{Google からコピーしたクライアントID}'\r\nconst client_secret = process.env.GOOGLE_OAUTH_CLIENT_SECRET || '{Google からコピーしたクライアントシークレット}'\r\n\r\nに自身のメールアドレス、クライアントID,クライアントシークレットを変更しました。\r\n\r\nよろしくお願い致します。","answerCount":1,"upvoteCount":0,"datePublished":"2020-10-15T10:24:46.434Z","dateModified":"2020-10-15T13:22:17.602Z","acceptedAnswer":{"@type":"Answer","text":"src/backend/controllers/login.ts \r\n\r\n```ここに言語を入力\r\nimport express, { Router } from 'express'\r\nimport qs from 'querystring';\r\nimport axios from 'axios';\r\n\r\nvar router: Router = express.Router();\r\n\r\nconst client_id = process.env.GOOGLE_OAUTH_CLIENT_ID || '{Google からコピーしたクライアントID}'\r\nconst client_secret = process.env.GOOGLE_OAUTH_CLIENT_SECRET || '{Google からコピーしたクライアントシークレット}'\r\nconst redirect_uri_postfix = '/oauthRedirect/google'\r\nconst response_type = 'code'\r\nconst scope = 'email'\r\n\r\nconst GOOGLE_URL_AUTH = 'https://accounts.google.com/o/oauth2/v2/auth'\r\nconst GOOGLE_URL_TOKEN = 'https://www.googleapis.com/oauth2/v4/token'\r\nconst GOOGLE_URL_USERINFO = 'https://www.googleapis.com/oauth2/v3/userinfo'\r\n\r\nrouter.get('/google/loginPath', function (req, res) {\r\n var redirect_uri = req.protocol + \"://\" + req.get(\"Host\") + redirect_uri_postfix;\r\n const params = qs.stringify({\r\n client_id,\r\n redirect_uri,\r\n response_type,\r\n scope,\r\n })\r\n res.send({ url: `${GOOGLE_URL_AUTH}?${params}` })\r\n});\r\n\r\nrouter.post('/google/loginPath', async function (req, res) {\r\n try {\r\n var params = new URLSearchParams();\r\n params.append('client_id', client_id);\r\n params.append('client_secret', client_secret);\r\n params.append('code', req.body.code);\r\n params.append('grant_type', 'authorization_code');\r\n params.append('redirect_uri', req.body.redirect_uri);\r\n\r\n const response = await axios.post(GOOGLE_URL_TOKEN, params)\r\n const access_token = response.data.access_token;\r\n\r\n const userInfoResponse = await axios.get(GOOGLE_URL_USERINFO, {\r\n headers: {\r\n 'Authorization': `Bearer ${access_token}`,\r\n }\r\n });\r\n const userInfo = userInfoResponse.data;\r\n res.send({\r\n access_token,\r\n userInfo\r\n });\r\n } catch(e) {\r\n res.status(400).send();\r\n }\r\n});\r\n\r\nexport default router;\r\n```\r\n\r\nにて、\r\n\r\n```ここに言語を入力\r\nconst client_id = process.env.GOOGLE_OAUTH_CLIENT_ID || '{Google からコピーしたクライアントID}'\r\nconst client_secret = process.env.GOOGLE_OAUTH_CLIENT_SECRET || '{Google からコピーしたクライアントシークレット}'\r\n```\r\n\r\n部分の、{}を削除したらエラー解消できました!","dateModified":"2020-10-16T04:46:48.395Z","datePublished":"2020-10-16T04:46:48.395Z","upvoteCount":0,"url":"https://teratail.com/questions/298241#reply-420977"},"suggestedAnswer":[],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"トップ","url":"https://teratail.com"},{"@type":"ListItem","position":2,"name":"Vue.jsに関する質問","url":"https://teratail.com/tags/Vue.js"},{"@type":"ListItem","position":3,"name":"Vue.js","url":"https://teratail.com/tags/Vue.js"}]}}}
質問するログイン新規登録
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

OAuth

OAuth(Open Authorization)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

11514閲覧

GoogleAPIログイン認証機能を実装したい。承認エラー(エラー 401: invalid_client The OAuth client was not found.)が発生しました。

退会済みユーザー

退会済みユーザー

総合スコア0

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

OAuth

OAuth(Open Authorization)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2020/10/15 10:24

編集2020/10/15 13:22

0

0

前提・実現したいこと

自由自在さんのサイトを参考にしながら、Webアプリケーションを作成しています。
ログイン画面を表示させたいと思っています。

発生している問題・エラーメッセージ

『Vueでログイン管理(OAuth2)』(https://pragmatic.ukiuni.com/vue_oauth/)を見ながら、
ログイン画面を作成しているのですが、下記の画像のエラーが発生してしまいました。

![イメージ説明

2周ほど、記事のコードと照らし合わせて確認しましたが、誤りはないように思います。

該当のソースコード

src/front/components/Login.vue

<template> <div> <a href="" @click="moveToGoogleOAuth()" >Google でログイン</a> </div> </template> <script lang="ts"> import Vue from "vue" import axios from "axios" export default Vue.extend({ methods: { async moveToGoogleOAuth(){ const response = await axios.get("/api/login/google/loginPath"); window.location.href = response.data.url } } }); </script>

src/backend/controllers/login.ts

import express, { Router } from 'express' import qs from 'querystring'; import axios from 'axios'; var router: Router = express.Router(); const client_id = process.env.GOOGLE_OAUTH_CLIENT_ID || '{Google からコピーしたクライアントID}' const client_secret = process.env.GOOGLE_OAUTH_CLIENT_SECRET || '{Google からコピーしたクライアントシークレット}' const redirect_uri_postfix = '/oauthRedirect/google' const response_type = 'code' const scope = 'email' const GOOGLE_URL_AUTH = 'https://accounts.google.com/o/oauth2/v2/auth' const GOOGLE_URL_TOKEN = 'https://www.googleapis.com/oauth2/v4/token' const GOOGLE_URL_USERINFO = 'https://www.googleapis.com/oauth2/v3/userinfo' router.get('/google/loginPath', function (req, res) { var redirect_uri = req.protocol + "://" + req.get("Host") + redirect_uri_postfix; const params = qs.stringify({ client_id, redirect_uri, response_type, scope, }) res.send({ url: `${GOOGLE_URL_AUTH}?${params}` }) }); router.post('/google/loginPath', async function (req, res) { try { var params = new URLSearchParams(); params.append('client_id', client_id); params.append('client_secret', client_secret); params.append('code', req.body.code); params.append('grant_type', 'authorization_code'); params.append('redirect_uri', req.body.redirect_uri); const response = await axios.post(GOOGLE_URL_TOKEN, params) const access_token = response.data.access_token; const userInfoResponse = await axios.get(GOOGLE_URL_USERINFO, { headers: { 'Authorization': `Bearer ${access_token}`, } }); const userInfo = userInfoResponse.data; res.send({ access_token, userInfo }); } catch(e) { res.status(400).send(); } }); export default router;

src/backend/index.ts

import express from 'express' import messageController from './controllers/message' import enqueteController from './controllers/enquete' import loginController from './controllers/login' import {createConnection} from 'typeorm' import Enquete from './models/Enquete' const app: express.Express = express() // 追加 サーバの強化追加 app.use(express.json()) app.use(express.urlencoded({ extended: true })) // 追加終了 // 追加 処理の外だし app.use("/messages", messageController) app.use("/api/enquetes", enqueteController) app.use("/api/login", loginController) app.use("/", express.static(__dirname + "/public")) app.use("*", (req, res) => { res.status(200).sendFile(__dirname + "/public/index.html"); }); // 追加終了 !async function initialize(){ await createConnection({ type: "postgres", url: process.env.DATABASE_URL || "postgres://postgres:postgres@localhost:5432/postgres", synchronize: true, entities: [ Enquete, ], extra: { ssl: (!!process.env.DATABASE_SSL) ? { rejectUnauthorized: false, } : false, } }); // 3000番ポートでAPIサーバ起動 const port = process.env.PORT || 3000; app.listen(port, () => { console.log("ポート" + port + "番で起動したよ〜!") }) }()

src/front/components/RedirectedFromGoogle.vue

<template> <div>{{message}}</div> </template> <script lang="ts"> import Vue from "vue" import axios from "axios" export default Vue.extend({ data() { return { message: "" } }, async created() { const code = this.$route.query.code; const redirect_uri = window.location.href.split("?")[0]; try { const response = await axios.post("/api/login/google/loginPath", { code, redirect_uri }); const authInfo = response.data; if(authInfo.access_token){ Vue.prototype.$loginInfo = { oAhtuProvider: "google", accessToken: authInfo.access_token } this.$router.push("/enquete/list") return; } } catch(throughtToNext) { } this.message = "Googleでのログイン検証に失敗しました!再度やり直してください。" setTimeout(()=>{ this.$router.push("/login") }, 5000); } }); </script>

src/front/components/App.vue

<template> <div> <router-view /> </div> </template> <script lang="ts"> import Vue from "vue"; import VueRouter from "vue-router"; import Enquete from "./PostEnquete.vue"; // Postを追加 import EnqueteResultList from "./EnqueteResultList.vue"; import Login from "./Login.vue"; import RedirectedFromGoogle from "./RedirectedFromGoogle.vue"; const router = new VueRouter({ mode: 'history', base: __dirname, routes: [ { path: '/', component: Enquete }, { path: '/enquete/list', component: EnqueteResultList }, { path: '/login', component:Login }, { path: '/oauthRedirect/google', component: RedirectedFromGoogle } ] }) Vue.use(VueRouter); export default Vue.extend({ router }); </script>

src/backend/controllers/enquete.ts

import express, { Router } from 'express' import { getRepository } from 'typeorm' import Enquete from '../models/Enquete' import axios from 'axios' const GOOGLE_URL_USERINFO = 'https://www.googleapis.com/oauth2/v3/userinfo' const ADMIN_MAIL = "Google Accountのメールアドレス" var router: Router = express.Router(); router.post('/', async function(req, res) { const enquete = req.body; const EnqueteRepository = getRepository(Enquete); await EnqueteRepository.save(enquete); res.send(enquete); }); router.get('/', async function (req, res) { const userInfoResponse = await axios.get(GOOGLE_URL_USERINFO, { headers: { 'Authorization': `Bearer ${req.header("Authorization")}`, } }); if (ADMIN_MAIL != userInfoResponse.data.email) { res.status(401).send() return; } const EnqueteRepository = getRepository(Enquete); const enquetes = await EnqueteRepository.find(); res.send(enquetes); }); export default router;

試したこと

src/backend/controllers/enquete.ts
const ADMIN_MAIL = "Google Accountのメールアドレス"

src/backend/controllers/login.ts
const client_id = process.env.GOOGLE_OAUTH_CLIENT_ID || '{Google からコピーしたクライアントID}'
const client_secret = process.env.GOOGLE_OAUTH_CLIENT_SECRET || '{Google からコピーしたクライアントシークレット}'

に自身のメールアドレス、クライアントID,クライアントシークレットを変更しました。

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

src/backend/controllers/login.ts

import express, { Router } from 'express' import qs from 'querystring'; import axios from 'axios'; var router: Router = express.Router(); const client_id = process.env.GOOGLE_OAUTH_CLIENT_ID || '{Google からコピーしたクライアントID}' const client_secret = process.env.GOOGLE_OAUTH_CLIENT_SECRET || '{Google からコピーしたクライアントシークレット}' const redirect_uri_postfix = '/oauthRedirect/google' const response_type = 'code' const scope = 'email' const GOOGLE_URL_AUTH = 'https://accounts.google.com/o/oauth2/v2/auth' const GOOGLE_URL_TOKEN = 'https://www.googleapis.com/oauth2/v4/token' const GOOGLE_URL_USERINFO = 'https://www.googleapis.com/oauth2/v3/userinfo' router.get('/google/loginPath', function (req, res) { var redirect_uri = req.protocol + "://" + req.get("Host") + redirect_uri_postfix; const params = qs.stringify({ client_id, redirect_uri, response_type, scope, }) res.send({ url: `${GOOGLE_URL_AUTH}?${params}` }) }); router.post('/google/loginPath', async function (req, res) { try { var params = new URLSearchParams(); params.append('client_id', client_id); params.append('client_secret', client_secret); params.append('code', req.body.code); params.append('grant_type', 'authorization_code'); params.append('redirect_uri', req.body.redirect_uri); const response = await axios.post(GOOGLE_URL_TOKEN, params) const access_token = response.data.access_token; const userInfoResponse = await axios.get(GOOGLE_URL_USERINFO, { headers: { 'Authorization': `Bearer ${access_token}`, } }); const userInfo = userInfoResponse.data; res.send({ access_token, userInfo }); } catch(e) { res.status(400).send(); } }); export default router;

にて、

const client_id = process.env.GOOGLE_OAUTH_CLIENT_ID || '{Google からコピーしたクライアントID}' const client_secret = process.env.GOOGLE_OAUTH_CLIENT_SECRET || '{Google からコピーしたクライアントシークレット}'

部分の、{}を削除したらエラー解消できました!

投稿2020/10/16 04:46

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問