passport-taobao.js 3.74 KB
/**
 * Module dependencies.
 */
const util = require('util');
const md5 = require('yoho-md5');
const TopClient = require('topsdk');
const { OAuth2Strategy, InternalOAuthError } = require('passport-oauth');

let client;

/**
 * @param {Object} params
 * @api public
 */
function signMD5(params, clientSecret) {
    let _signStr = '';

    params.sign_method = 'md5';

    for (const k of Object.keys(params).sort()) {
        _signStr += `${k}${params[k]}`;
    }

    let signd = md5(clientSecret + _signStr + clientSecret);

    params.sign = new Buffer(signd, 'base64').toString('hex');

    return params;
}

/**
 * @param {Object} options
 * @param {Function} verify
 * @api public
 */
function Strategy(options, verify) {
    options = options || {};
    options.authorizationURL = options.authorizationURL || 'https://oauth.taobao.com/authorize';
    options.tokenURL = options.tokenURL || 'https://oauth.taobao.com/token';
    options.scopeSeparator = options.scopeSeparator || ',';
    options.customHeaders = options.customHeaders || {};

    client = new TopClient(options.clientID, options.clientSecret, {
        endpoint: 'https://eco.taobao.com/router/rest',
        useValidators: true,
        rawResponse: false
    });

    if (!options.customHeaders['User-Agent']) {
        options.customHeaders['User-Agent'] = options.userAgent || 'passport-taobao';
    }

    OAuth2Strategy.call(this, options, verify);
    this.name = 'taobao';
    this._userProfileURL = options.userProfileURL || 'https://eco.taobao.com/router/rest';
}

/**
 * Inherit from `OAuth2Strategy`.
 */
util.inherits(Strategy, OAuth2Strategy);


/**
 * @param {String} accessToken
 * @param {Function} done
 * @api protected
 */
Strategy.prototype.userProfile = function (accessToken, done) {
    console.log(client)
    client.execute('taobao.user.buyer.get', {
        session: accessToken,
        fields: 'nick,sex'
    }).then(res => {
        console.log(res);
    });
return;


    console.log(arguments)
    let oauth2 = this._oauth2;
    let url = 'https://eco.taobao.com/router/rest';
    let params = {
        method: 'taobao.user.buyer.get',
        app_key: oauth2._clientId,
        session: accessToken,
        format: 'json',
        v: '2.0',
        fields: 'uid,nick,avatar'
    };


    // _clientSecret
    // ?format=json&v=2.0&fields=uid,nick,avatar&method=taobao.user.buyer.get';
    // url = url + '&app_key=' + oauth2._clientId;
    // url = url + '&timestamp=' + Date.parse(new Date());
    // url = url + '&access_token=' + accessToken;
    if (!accessToken) {
        return done(new Error('accessToken is empty'));
    }

    Object.keys(signMD5(params, oauth2._clientSecret)).forEach((k, i) => {
        url += `${i ? '&' : '?'}${k}=${params[k]}`;
    });
    console.log(url)
    oauth2.get(url, accessToken, function (err, result, res) {
        if (err) {
            return done(new InternalOAuthError('failed to fetch user profile', err));
        }
        try {
            if (result) {
                console.log(result)
                let json = JSON.parse(result);
                if (json.error_response)
                    return done(new InternalOAuthError(json.error_response.code + '-' + json.error_response.msg, new Error(json.error_response.msg)));
                else {
                    let json = JSON.parse(result);
                    let profile = { provider: 'taobao' };
                    profile.id = json.uid;
                    profile.nickname = json.nick;
                    profile.avatar = json.avatar;
                    profile._raw = result;
                    profile._json = json;
                    done(null, profile);
                }
            }
        } catch (e) {
            done('ERROR:' + e + result);
        }
    });
}

module.exports = Strategy;