Skip to content

Commit c0e6d4c

Browse files
authored
Merge pull request #88 from Nekoya3/feature/85-from-cookie-to-localstorage
CookieからPWAのstorageに変更
2 parents f2aad9c + 963c33d commit c0e6d4c

File tree

13 files changed

+1436
-1233
lines changed

13 files changed

+1436
-1233
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ dist
8383
# Service worker
8484
sw.*
8585
*/static/*sw.*
86+
*/static/swenv.*
8687

8788
# macOS
8889
.DS_Store

nuxt.config.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,15 @@ export default {
135135
APPID: process.env.APPID,
136136
MEASUREMENTID: process.env.MEASUREMENTID
137137
},
138+
workbox: {
139+
importScripts: [
140+
'https://www.gstatic.com/firebasejs/7.14.6/firebase-app.js',
141+
'https://www.gstatic.com/firebasejs/7.14.6/firebase-auth.js',
142+
'swenv.js',
143+
'sw-firebase-auth.js'
144+
],
145+
dev: process.env.MODE !== 'production'
146+
},
138147
/*
139148
** Build configuration
140149
*/

package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
"private": true,
77
"scripts": {
88
"dev": "cross-env NODE_ENV=development nuxt-ts",
9-
"build": "nuxt-ts build",
9+
"build": "yarn prebuild && nuxt-ts build",
10+
"prebuild": "cross-env NODE_ENV=development node pre_build_script/swEnvBuild.js",
1011
"test:unit": "jest --config jest.config.js",
1112
"start": "cross-env NODE_ENV=production nuxt-ts",
1213
"generate": "nuxt-ts generate",
@@ -36,14 +37,15 @@
3637
"@nuxtjs/dotenv": "^1.4.1",
3738
"@nuxtjs/pwa": "^3.0.0-0",
3839
"@types/js-cookie": "^2.2.6",
40+
"@types/jwt-decode": "^2.2.1",
3941
"@types/node": "^14.0.5",
4042
"cookieparser": "^0.1.0",
4143
"core-js": "3.6.5",
4244
"cross-env": "^7.0.2",
4345
"date-fns": "^2.14.0",
4446
"dayjs": "^1.8.26",
4547
"express": "^4.17.1",
46-
"firebase": "^7.14.3",
48+
"firebase": "7.14.6",
4749
"firebase-admin": "^8.12.0",
4850
"js-cookie": "^2.2.1",
4951
"jwt-decode": "^2.2.0",

pre_build_script/swEnvBuild.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
const fs = require('fs')
2+
const environment = process.env.NODE_ENV || 'development'
3+
require('dotenv').config({ path: `./src/.env.${environment}` })
4+
5+
fs.writeFileSync(
6+
'./src/static/swenv.js',
7+
`
8+
const swEnv = {
9+
apiKey: '${process.env.APIKEY}',
10+
authDomain: '${process.env.AUTHDOMAIN}',
11+
databaseURL: '${process.env.DATABASEURL}',
12+
projectId: '${process.env.PROJECTID}',
13+
storageBucket: '${process.env.STORAGEBUCKET}',
14+
messagingSenderId: '${process.env.MESSAGINGSENDERID}',
15+
appId: '${process.env.APPID}',
16+
measurementId: '${process.env.MEASUREMENTID}'
17+
}
18+
`
19+
)

src/helpers/index.js

Lines changed: 0 additions & 18 deletions
This file was deleted.

src/middleware/authenticated.ts

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,9 @@
11
import { Middleware } from '@nuxt/types'
2+
import { vxm } from '@/store'
23

3-
const authenticated: Middleware = async ({ req, redirect }) => {
4-
if (process.server) {
5-
// @todo dynamic import で実装する
6-
const admin = require('firebase-admin')
7-
const cookieparser = require('cookieparser')
8-
if (req.headers.cookie) {
9-
const token = cookieparser.parse(req.headers.cookie).__session
10-
admin
11-
.auth()
12-
.verifyIdToken(token)
13-
.then(() => {})
14-
.catch(() => {
15-
redirect('/account/login')
16-
})
17-
} else {
18-
redirect('/account/login')
19-
}
4+
const authenticated: Middleware = async ({ redirect }) => {
5+
if (!vxm.user.isAuthenticated) {
6+
redirect('/account/login')
207
}
218
}
229

src/pages/account/login.vue

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,8 @@ export default Vue.extend({
7373
firebase
7474
.auth()
7575
.signInWithEmailAndPassword(this.email, this.password)
76-
.then(_userInfo => {
77-
vxm.user.login(/* _userInfo */)
78-
})
7976
.then(() => {
77+
vxm.user.login()
8078
this.$router.push('/edit')
8179
})
8280
.catch(error => {

src/pages/edit/index.vue

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,24 @@
11
<template>
2-
<h1>Editor</h1>
2+
<div>
3+
<h1>{{ user.uid }}</h1>
4+
<h1>{{ user.email }}</h1>
5+
<h1>{{ user.emailVerified }}</h1>
6+
<h1>{{ user.displayName }}</h1>
7+
<h1>{{ user.allowAccess }}</h1>
8+
</div>
39
</template>
410

511
<script lang="ts">
612
import Vue from 'vue'
13+
import { vxm } from '@/store'
714
815
export default Vue.extend({
916
layout: 'protected',
10-
name: 'EditorIndex'
17+
name: 'EditorIndex',
18+
data() {
19+
return {
20+
user: vxm.user
21+
}
22+
}
1123
})
1224
</script>

src/plugins/firebase-admin.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
// eslint-disable-next-line import/no-mutable-exports
2-
let admin = null
2+
let admin
33
if (process.server) {
44
admin = require('firebase-admin')
55
if (!admin.apps.length) {
66
admin.initializeApp({
77
credential: admin.credential.applicationDefault(),
8-
databaseURL: 'https://studyathome.firebaseio.com'
8+
databaseURL: 'https://studyathome-dev.firebaseio.com'
99
})
1010
}
1111
}
1212

13-
// eslint-disable-next-line no-undef
1413
export default admin

src/static/sw-firebase-auth.js

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
firebase.initializeApp(swEnv)
2+
3+
const getIdToken = () => {
4+
return new Promise((resolve) => {
5+
const unsubscribe = firebase.auth().onAuthStateChanged(user => {
6+
unsubscribe();
7+
if (user) {
8+
user.getIdToken().then(
9+
idToken => resolve(idToken),
10+
error => resolve(null)
11+
);
12+
} else {
13+
resolve(null);
14+
}
15+
});
16+
});
17+
};
18+
19+
const getOriginFromUrl = url => {
20+
const pathArray = url.split("/");
21+
const protocol = pathArray[0];
22+
const host = pathArray[2];
23+
return protocol + "//" + host;
24+
};
25+
26+
self.addEventListener("fetch", event => {
27+
const requestProcessor = idToken => {
28+
let req = event.request;
29+
if (self.location.origin === getOriginFromUrl(event.request.url) &&
30+
(self.location.protocol === "https:" || self.location.hostname === "localhost") &&
31+
idToken
32+
) {
33+
const headers = new Headers();
34+
for (let entry of req.headers.entries()) {
35+
headers.append(entry[0], entry[1]);
36+
}
37+
headers.append("Authorization", "Bearer " + idToken);
38+
try {
39+
req = new Request(req.url, {
40+
method: req.method,
41+
headers: headers,
42+
mode: "same-origin",
43+
credentials: req.credentials,
44+
cache: req.cache,
45+
redirect: req.redirect,
46+
referrer: req.referrer,
47+
body: req.body,
48+
bodyUsed: req.bodyUsed,
49+
context: req.context
50+
});
51+
} catch (e) {
52+
console.error(e);
53+
}
54+
}
55+
return fetch(req);
56+
};
57+
event.respondWith(getIdToken().then(requestProcessor, requestProcessor));
58+
});
59+
60+
self.addEventListener("activate", event => {
61+
event.waitUntil(clients.claim());
62+
});

0 commit comments

Comments
 (0)