UNPKG

node-socialite

Version:

Socialite is an OAuth2 authentication tool for Node.js

119 lines (118 loc) 4.45 kB
'use strict'; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Taobao = void 0; const BaseProvider_1 = require("../Core/BaseProvider"); const User_1 = require("../Core/User"); const Utils_1 = require("../Core/Utils"); /** * @see [Taobao - 用户授权介绍](https://open.taobao.com/doc.htm?docId=102635&docType=1&source=search) */ class Taobao extends BaseProvider_1.BaseProvider { constructor() { super(...arguments); this._baseUrl = 'https://oauth.taobao.com'; this._gatewayUrl = 'https://eco.taobao.com/router/rest'; this._scopes = ['user_info']; this._view = 'web'; } withView(view) { this._view = view; return this; } getAuthUrl() { return this.buildAuthUrlFromBase(`${this._baseUrl}/authorize`); } getCodeFields() { return { client_id: this.getClientId(), redirect_uri: this._redirectUrl, view: this._view, response_type: 'code', }; } getTokenUrl() { return `${this._baseUrl}/token`; } getTokenFields(code) { let fields = super.getTokenFields(code); fields['grant_type'] = 'authorization_code'; fields['view'] = this._view; return fields; } tokenFromCode(code) { return __awaiter(this, void 0, void 0, function* () { let params = this.getTokenFields(code); let response = yield this.doRequest({ url: this.getTokenUrl(), method: 'post', params: params, responseType: 'json', }); return this.normalizeAccessTokenResponse(response); }); } generateSign(params) { let keys = Object.keys(params); keys.sort(); let str = this.getClientSecret(); for (let key of keys) { if (typeof params[key] === 'object' || (params[key] + '').startsWith('@')) continue; str += `${key}${params[key]}`; } str += this.getClientSecret(); return (0, Utils_1.generateHash)(str, 'md5').toUpperCase(); } getPublicFields(token, apiFields = {}) { let fields = { app_key: this.getClientId(), sign_method: 'md5', session: token, timestamp: (0, Utils_1.formatTime)('YYYY-MM-dd HH:mm:ss'), v: '2.0', format: 'json', }; fields = (0, Utils_1.merge)(fields, apiFields); fields['sign'] = this.generateSign(fields); return fields; } getUserInfoUrl(url, token) { let apiFields = { method: 'taobao.miniapp.userInfo.get', }; let query = (0, Utils_1.buildQueryString)(this.getPublicFields(token, apiFields)); return `${url}?${query}`; } getUserByToken(token) { return __awaiter(this, void 0, void 0, function* () { let resp = yield this.doRequest({ url: this.getUserInfoUrl(this._gatewayUrl, token), method: 'post', }); if (!resp || resp.status != 200 || !resp.data['miniapp_userInfo_get_response'] || !resp.data['miniapp_userInfo_get_response']['result']) { throw new Error('Fail to fetch openid.'); } return resp.data['miniapp_userInfo_get_response']['result']['model']; }); } mapUserToObject(user) { return new User_1.User({ id: user['open_id'] || null, nickname: user['nick'] || null, name: user['nick'] || null, email: user['email'] || null, avatar: user['avatar'] || null, }); } } exports.Taobao = Taobao; Taobao.NAME = 'taobao';