From 8bba2ff1ba9c2c7e18fa68ae37ca925eec31d127 Mon Sep 17 00:00:00 2001 From: muerwre Date: Thu, 29 Nov 2018 18:38:46 +0700 Subject: [PATCH] backend: initial log in dialog --- backend/app.js | 5 +++ backend/models/User.js | 5 +++ backend/routes/auth.js | 2 + backend/routes/auth/check.js | 4 +- backend/routes/auth/guest.js | 5 ++- backend/routes/auth/social/vk.js | 58 +++++++++++++++++++++++++++++ src/components/panels/UserPanel.jsx | 5 ++- src/constants/api.js | 6 ++- 8 files changed, 83 insertions(+), 7 deletions(-) create mode 100644 backend/routes/auth/social/vk.js diff --git a/backend/app.js b/backend/app.js index 9ca454a..61da9c3 100644 --- a/backend/app.js +++ b/backend/app.js @@ -25,6 +25,11 @@ app.use(express.urlencoded({ extended: false })); app.use(cookieParser()); app.use(lessMiddleware(path.join(__dirname, 'public'))); app.use(express.static(path.join(__dirname, 'public'))); +app.use((req, res, next) => { + res.header('Access-Control-Allow-Origin', '*'); + res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); + next(); +}); // app.use('/', indexRouter); // app.use('/users', usersRouter); diff --git a/backend/models/User.js b/backend/models/User.js index 7a148fe..a64552e 100644 --- a/backend/models/User.js +++ b/backend/models/User.js @@ -10,6 +10,11 @@ const UserSchema = new Schema({ enum: ['admin', 'guest', 'user', 'vk'], }, token: { type: String, required: true }, + created_at: { type: Date, required: true, default: Date.now }, + + first_name: { type: String }, + last_name: { type: String }, + photo: { type: String }, }); const User = mongoose.model('User', UserSchema); diff --git a/backend/routes/auth.js b/backend/routes/auth.js index 5048037..b102f0f 100644 --- a/backend/routes/auth.js +++ b/backend/routes/auth.js @@ -2,11 +2,13 @@ const express = require('express'); const guest = require('./auth/guest'); const list = require('./auth/list'); const check = require('./auth/check'); +const vk = require('./auth/social/vk'); const router = express.Router(); router.get('/', check); router.get('/list', list); router.get('/guest', guest); +router.get('/social/vk', vk); module.exports = router; diff --git a/backend/routes/auth/check.js b/backend/routes/auth/check.js index 83936c8..f40d4ba 100644 --- a/backend/routes/auth/check.js +++ b/backend/routes/auth/check.js @@ -11,6 +11,8 @@ module.exports = async (req, res) => { } const guest = await generateGuest(); - return res.send({ success: false, ...guest, random_url }); + return res.send({ + success: false, error: 'user not found', error_code: 1231, ...guest, random_url + }); }; diff --git a/backend/routes/auth/guest.js b/backend/routes/auth/guest.js index ba8c54a..01ad72f 100644 --- a/backend/routes/auth/guest.js +++ b/backend/routes/auth/guest.js @@ -11,9 +11,8 @@ const generateGuestToken = () => { }); }; -const generateUser = id => { +const generateUser = (id, role = 'guest') => { const token = `seq:${genRandomSequence(32)}`; - const role = 'guest'; return { id, token, role }; }; @@ -47,5 +46,7 @@ module.exports = async (req, res) => { res.send({ success: true, ...user }); }; +module.exports.generateUser = generateUser; module.exports.generateGuest = generateGuest; +module.exports.generateGuestToken = generateGuestToken; module.exports.generateRandomUrl = generateRandomUrl; diff --git a/backend/routes/auth/social/vk.js b/backend/routes/auth/social/vk.js new file mode 100644 index 0000000..e448a90 --- /dev/null +++ b/backend/routes/auth/social/vk.js @@ -0,0 +1,58 @@ +const { User } = require('../../../models/User'); +const axios = require('axios'); +const { generateGuest, generateRandomUrl, generateUser } = require('../guest'); +// +// const generateTokenUrl = (host, code) => ( +// `https://oauth.vk.com/access_token?client_id=5987644&redirect_uri=http://${host}/` + +// `auth/social/vk&client_secret=Z71DsxoMF7PS9kayLuks&code=${code}` +// ); + +const fetchUserData = async (req) => { + const { query: { code } } = req; + const host = req.get('host'); + + const { data: { access_token, user_id } } = await axios.get( + 'https://oauth.vk.com/access_token', + { + params: { + client_id: 5987644, + client_secret: 'Z71DsxoMF7PS9kayLuks', + code, + redirect_uri: `http://${host}/auth/social/vk`, + } + } + ).catch(() => ({ data: { } })); + + const { data } = await axios.get( + 'https://api.vk.com/method/users.get', + { + params: { + user_id, + fields: 'photo', + v: '5.67', + access_token, + } + } + ).catch(() => ({ data: { response: [] } })); + + return data; +}; + +module.exports = async (req, res) => { + const { response } = await fetchUserData(req); + + const { + first_name = '', last_name = '', photo = '', id = '' + } = response[0]; + + const newUser = await generateUser(`vk:${id}`, 'vk'); + const user = { + ...newUser, first_name, last_name, photo + }; + + // todo: error handling + // console.log('USE', user); + + res.send(user); +}; + diff --git a/src/components/panels/UserPanel.jsx b/src/components/panels/UserPanel.jsx index 71e97ce..4c54e87 100644 --- a/src/components/panels/UserPanel.jsx +++ b/src/components/panels/UserPanel.jsx @@ -1,7 +1,7 @@ import React from 'react'; import { GuestButton } from '$components/user/GuestButton'; -import { SERVER } from '$constants/api'; +import { SERVER, TEST } from '$constants/api'; import { DEFAULT_USER, ROLES } from '$constants/auth'; import { UserButton } from '$components/user/UserButton'; import { UserMenu } from '$components/user/UserMenu'; @@ -60,7 +60,8 @@ export class Component extends React.PureComponent { const left = (width - 700) / 2; window.open( - `https://oauth.vk.com/authorize?client_id=5987644&scope=&redirect_uri=${SERVER}/engine/oauthOrchid.php&response_type=code`, + // `https://oauth.vk.com/authorize?client_id=5987644&scope=&redirect_uri=${SERVER}/engine/oauthOrchid.php&response_type=code`, + `https://oauth.vk.com/authorize?client_id=5987644&scope=&redirect_uri=${TEST}/auth/social/vk`, 'socialPopupWindow', `location=no,width=700,height=370,scrollbars=no,top=${top},left=${left},resizable=no` ); diff --git a/src/constants/api.js b/src/constants/api.js index e7e9e22..0114536 100644 --- a/src/constants/api.js +++ b/src/constants/api.js @@ -1,8 +1,10 @@ export const SERVER = 'http://alpha-map.vault48.org'; +export const TEST = 'http://localhost:3000'; + export const API = { COMPOSE: `${SERVER}/engine/composerOrchid.php`, - GET_GUEST: `${SERVER}/engine/authOrchid.php`, - CHECK_TOKEN: `${SERVER}/engine/authOrchid.php`, + GET_GUEST: `${TEST}/auth/guest`, + CHECK_TOKEN: `${TEST}/auth`, GET_MAP: `${SERVER}/engine/authOrchid.php`, POST_MAP: `${SERVER}/engine/authOrchid.php?action=store`, };