Authored by yyq

passport

@@ -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);
  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;
  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 + '&timestamp=' + 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;
  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",