Showing
5 changed files
with
198 additions
and
0 deletions
@@ -78,6 +78,7 @@ exports.createApp = async(app) => { | @@ -78,6 +78,7 @@ exports.createApp = async(app) => { | ||
78 | try { | 78 | try { |
79 | const userMiddleware = require('./doraemon/middleware/user'); | 79 | const userMiddleware = require('./doraemon/middleware/user'); |
80 | const setYohoDataMiddleware = require('./doraemon/middleware/set-yoho-data'); | 80 | const setYohoDataMiddleware = require('./doraemon/middleware/set-yoho-data'); |
81 | + const serverMiddleware = require('./doraemon/middleware/server-handler'); | ||
81 | const errorMiddleware = require('./doraemon/middleware/error-handler'); | 82 | const errorMiddleware = require('./doraemon/middleware/error-handler'); |
82 | const ssrApiMiddleware = require('./doraemon/middleware/ssr-api'); | 83 | const ssrApiMiddleware = require('./doraemon/middleware/ssr-api'); |
83 | const ssrRouteMiddleware = require('./doraemon/middleware/ssr'); | 84 | const ssrRouteMiddleware = require('./doraemon/middleware/ssr'); |
@@ -85,6 +86,8 @@ exports.createApp = async(app) => { | @@ -85,6 +86,8 @@ exports.createApp = async(app) => { | ||
85 | // YOHO 前置中间件 | 86 | // YOHO 前置中间件 |
86 | app.use(setYohoDataMiddleware); | 87 | app.use(setYohoDataMiddleware); |
87 | app.use(userMiddleware); | 88 | app.use(userMiddleware); |
89 | + app.use(serverMiddleware); | ||
90 | + | ||
88 | app.use('/xianyu', ssrApiMiddleware); | 91 | app.use('/xianyu', ssrApiMiddleware); |
89 | 92 | ||
90 | app.use(ssrRouteMiddleware.routers); | 93 | app.use(ssrRouteMiddleware.routers); |
doraemon/middleware/server-handler.js
0 → 100644
1 | +const express = require('express'); | ||
2 | + | ||
3 | +const passport = require('../models/passport'); | ||
4 | + | ||
5 | +const app = express(); | ||
6 | +const router = express.Router(); // eslint-disable-line | ||
7 | + | ||
8 | +router.get('/xianyu/passport/login/taobao', passport.login.taobaoLogin) | ||
9 | +router.get('/xianyu/passport/callback/taobao', passport.login.taobaoCallback) | ||
10 | + | ||
11 | +app.use(router); | ||
12 | + | ||
13 | +module.exports = app; |
doraemon/models/passport-taobao.js
0 → 100644
1 | +/** | ||
2 | + * Module dependencies. | ||
3 | + */ | ||
4 | +const util = require('util'); | ||
5 | +const md5 = require('yoho-md5'); | ||
6 | +const TopClient = require('topsdk'); | ||
7 | +const { OAuth2Strategy, InternalOAuthError } = require('passport-oauth'); | ||
8 | + | ||
9 | +let client; | ||
10 | + | ||
11 | +/** | ||
12 | + * @param {Object} params | ||
13 | + * @api public | ||
14 | + */ | ||
15 | +function signMD5(params, clientSecret) { | ||
16 | + let _signStr = ''; | ||
17 | + | ||
18 | + params.sign_method = 'md5'; | ||
19 | + | ||
20 | + for (const k of Object.keys(params).sort()) { | ||
21 | + _signStr += `${k}${params[k]}`; | ||
22 | + } | ||
23 | + | ||
24 | + let signd = md5(clientSecret + _signStr + clientSecret); | ||
25 | + | ||
26 | + params.sign = new Buffer(signd, 'base64').toString('hex'); | ||
27 | + | ||
28 | + return params; | ||
29 | +} | ||
30 | + | ||
31 | +/** | ||
32 | + * @param {Object} options | ||
33 | + * @param {Function} verify | ||
34 | + * @api public | ||
35 | + */ | ||
36 | +function Strategy(options, verify) { | ||
37 | + options = options || {}; | ||
38 | + options.authorizationURL = options.authorizationURL || 'https://oauth.taobao.com/authorize'; | ||
39 | + options.tokenURL = options.tokenURL || 'https://oauth.taobao.com/token'; | ||
40 | + options.scopeSeparator = options.scopeSeparator || ','; | ||
41 | + options.customHeaders = options.customHeaders || {}; | ||
42 | + | ||
43 | + client = new TopClient(options.clientID, options.clientSecret, { | ||
44 | + endpoint: 'https://eco.taobao.com/router/rest', | ||
45 | + useValidators: true, | ||
46 | + rawResponse: false | ||
47 | + }); | ||
48 | + | ||
49 | + if (!options.customHeaders['User-Agent']) { | ||
50 | + options.customHeaders['User-Agent'] = options.userAgent || 'passport-taobao'; | ||
51 | + } | ||
52 | + | ||
53 | + OAuth2Strategy.call(this, options, verify); | ||
54 | + this.name = 'taobao'; | ||
55 | + this._userProfileURL = options.userProfileURL || 'https://eco.taobao.com/router/rest'; | ||
56 | +} | ||
57 | + | ||
58 | +/** | ||
59 | + * Inherit from `OAuth2Strategy`. | ||
60 | + */ | ||
61 | +util.inherits(Strategy, OAuth2Strategy); | ||
62 | + | ||
63 | + | ||
64 | +/** | ||
65 | + * @param {String} accessToken | ||
66 | + * @param {Function} done | ||
67 | + * @api protected | ||
68 | + */ | ||
69 | +Strategy.prototype.userProfile = function (accessToken, done) { | ||
70 | + console.log(client) | ||
71 | + client.execute('taobao.user.buyer.get', { | ||
72 | + session: accessToken, | ||
73 | + fields: 'nick,sex' | ||
74 | + }).then(res => { | ||
75 | + console.log(res); | ||
76 | + }); | ||
77 | +return; | ||
78 | + | ||
79 | + | ||
80 | + console.log(arguments) | ||
81 | + let oauth2 = this._oauth2; | ||
82 | + let url = 'https://eco.taobao.com/router/rest'; | ||
83 | + let params = { | ||
84 | + method: 'taobao.user.buyer.get', | ||
85 | + app_key: oauth2._clientId, | ||
86 | + session: accessToken, | ||
87 | + format: 'json', | ||
88 | + v: '2.0', | ||
89 | + fields: 'uid,nick,avatar' | ||
90 | + }; | ||
91 | + | ||
92 | + | ||
93 | + // _clientSecret | ||
94 | + // ?format=json&v=2.0&fields=uid,nick,avatar&method=taobao.user.buyer.get'; | ||
95 | + // url = url + '&app_key=' + oauth2._clientId; | ||
96 | + // url = url + '×tamp=' + Date.parse(new Date()); | ||
97 | + // url = url + '&access_token=' + accessToken; | ||
98 | + if (!accessToken) { | ||
99 | + return done(new Error('accessToken is empty')); | ||
100 | + } | ||
101 | + | ||
102 | + Object.keys(signMD5(params, oauth2._clientSecret)).forEach((k, i) => { | ||
103 | + url += `${i ? '&' : '?'}${k}=${params[k]}`; | ||
104 | + }); | ||
105 | + console.log(url) | ||
106 | + oauth2.get(url, accessToken, function (err, result, res) { | ||
107 | + if (err) { | ||
108 | + return done(new InternalOAuthError('failed to fetch user profile', err)); | ||
109 | + } | ||
110 | + try { | ||
111 | + if (result) { | ||
112 | + console.log(result) | ||
113 | + let json = JSON.parse(result); | ||
114 | + if (json.error_response) | ||
115 | + return done(new InternalOAuthError(json.error_response.code + '-' + json.error_response.msg, new Error(json.error_response.msg))); | ||
116 | + else { | ||
117 | + let json = JSON.parse(result); | ||
118 | + let profile = { provider: 'taobao' }; | ||
119 | + profile.id = json.uid; | ||
120 | + profile.nickname = json.nick; | ||
121 | + profile.avatar = json.avatar; | ||
122 | + profile._raw = result; | ||
123 | + profile._json = json; | ||
124 | + done(null, profile); | ||
125 | + } | ||
126 | + } | ||
127 | + } catch (e) { | ||
128 | + done('ERROR:' + e + result); | ||
129 | + } | ||
130 | + }); | ||
131 | +} | ||
132 | + | ||
133 | +module.exports = Strategy; |
doraemon/models/passport.js
0 → 100644
1 | + | ||
2 | +const passport = require('passport'); | ||
3 | +const TaobaoStrategy = require('./passport-taobao'); | ||
4 | + | ||
5 | +const uuid = require('uuid'); | ||
6 | + | ||
7 | +const config = global.yoho.config; | ||
8 | + | ||
9 | +// taobao 登录 | ||
10 | +passport.use('taobao', new TaobaoStrategy({ | ||
11 | + clientID: '27930297', | ||
12 | + clientSecret: '29b30287153a02f531c160df17da8078', | ||
13 | + callbackURL: `http://127.0.0.1:6001/xianyu/passport/callback/taobao`, | ||
14 | + requireState: false | ||
15 | +}, (accessToken, refreshToken, profile, done) => { | ||
16 | + done(null, profile); | ||
17 | +})); | ||
18 | + | ||
19 | +const login = { | ||
20 | + taobaoLogin: (req, res, next) => { | ||
21 | + req.session.authState = uuid.v4(); | ||
22 | + | ||
23 | + return passport.authenticate('taobao', { | ||
24 | + state: req.session.authState, | ||
25 | + failWithError: true | ||
26 | + })(req, res, next); | ||
27 | + }, | ||
28 | + taobaoCallback: (req, res, next) => { | ||
29 | + console.log(req.session) | ||
30 | + // return res.send(req.query); | ||
31 | + passport.authenticate('taobao', (err, user) => { | ||
32 | + console.log('21312312') | ||
33 | + console.log(user) | ||
34 | + console.log(err) | ||
35 | + })(req, res, next); | ||
36 | + // if (req.session.authState === req.query.state) { | ||
37 | + // } else { | ||
38 | + // res.send('error'); | ||
39 | + // } | ||
40 | + } | ||
41 | +} | ||
42 | + | ||
43 | +module.exports = { | ||
44 | + login | ||
45 | +}; |
@@ -53,11 +53,15 @@ | @@ -53,11 +53,15 @@ | ||
53 | "lottie-web": "^5.4.2", | 53 | "lottie-web": "^5.4.2", |
54 | "mysql": "^2.16.0", | 54 | "mysql": "^2.16.0", |
55 | "nodemon": "^1.19.1", | 55 | "nodemon": "^1.19.1", |
56 | + "passport": "^0.4.0", | ||
57 | + "passport-oauth": "^1.0.0", | ||
56 | "qiniu": "^7.2.1", | 58 | "qiniu": "^7.2.1", |
57 | "request": "^2.88.0", | 59 | "request": "^2.88.0", |
58 | "request-promise": "^4.2.2", | 60 | "request-promise": "^4.2.2", |
59 | "serve-favicon": "^2.5.0", | 61 | "serve-favicon": "^2.5.0", |
60 | "source-map": "^0.7.3", | 62 | "source-map": "^0.7.3", |
63 | + "topsdk": "=1.0.13", | ||
64 | + "util": "^0.12.1", | ||
61 | "uuid": "^3.3.2", | 65 | "uuid": "^3.3.2", |
62 | "vue": "^2.5.20", | 66 | "vue": "^2.5.20", |
63 | "vue-awesome-swiper": "^3.1.3", | 67 | "vue-awesome-swiper": "^3.1.3", |
-
Please register or login to post a comment