node-socialite
Version:
Socialite is an OAuth2 authentication tool for Node.js
205 lines (204 loc) • 7.6 kB
JavaScript
;
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.OpenWeWork = void 0;
const BaseProvider_1 = require("../Core/BaseProvider");
const User_1 = require("../Core/User");
const Utils_1 = require("../Core/Utils");
/**
* @see [网页授权登录](https://developer.work.weixin.qq.com/document/path/91119)
*/
class OpenWeWork extends BaseProvider_1.BaseProvider {
constructor(config) {
super(config);
this._detailed = false;
this._asQrcode = false;
this._userType = 'member';
this._lang = 'zh';
this._suiteTicket = '';
this._agentId = null;
this._suiteAccessToken = '';
this._baseUrl = 'https://qyapi.weixin.qq.com';
if (!this._config.has('base_url')) {
this._baseUrl = this._config.get('base_url');
}
}
getBaseUrl() {
return this._baseUrl;
}
setAgentId(agentId) {
this._agentId = agentId;
return this;
}
withAgentId(agentId) {
return this.setAgentId(agentId);
}
detailed() {
this._detailed = true;
return this;
}
asQrcode() {
this._asQrcode = true;
return this;
}
withUserType(userType) {
this._userType = userType;
return this;
}
withLang(lang) {
this._lang = lang;
return this;
}
withSuiteTicket(suiteTicket) {
this._suiteTicket = suiteTicket;
return this;
}
withSuiteAccessToken(suiteAccessToken) {
this._suiteAccessToken = suiteAccessToken;
return this;
}
userFromCode(code) {
return __awaiter(this, void 0, void 0, function* () {
let token = yield this.getSuiteAccessToken();
let user = yield this.getUser(token, code);
if (this._detailed) {
user = (0, Utils_1.merge)((0, Utils_1.merge)({}, user), yield this.getUserByTicket(user['user_ticket']));
}
return this.mapUserToObject(user)
.setProvider(OpenWeWork.NAME)
.setRaw(user);
});
}
getSuiteAccessToken() {
return __awaiter(this, void 0, void 0, function* () {
if (!this._suiteAccessToken) {
this._suiteAccessToken = yield this.createSuiteAccessToken();
}
return this._suiteAccessToken;
});
}
createSuiteAccessToken() {
return __awaiter(this, void 0, void 0, function* () {
if (!this._suiteTicket) {
throw new Error('Please set `suiteTicket` first.');
}
let response = yield this.doRequest({
url: this._baseUrl + '/cgi-bin/service/get_suite_token',
method: 'post',
data: {
suite_id: this._config.get('suite_id') || this._config.get('client_id'),
suite_secret: this._config.get('suite_secret') || this._config.get('client_secret'),
suite_ticket: this._suiteTicket,
}
});
let data = response.data;
if (!data || data['errcode']) {
throw new Error(`Failed to get api access_token: ${data['errmsg'] || 'Unknown'}`);
}
return data['suite_access_token'];
});
}
getUser(token, code) {
return __awaiter(this, void 0, void 0, function* () {
let response = yield this.doRequest({
url: this._baseUrl + '/cgi-bin/service/getuserinfo3rd',
method: 'get',
params: {
suite_access_token: token,
code,
}
});
let data = response.data;
if (!data || data['errcode'] || (!data['UserId'] && !data['openid'])) {
throw new Error(`Failed to get user openid: ${data['errmsg'] || 'Unknown'}`);
}
else if (!data['user_ticket']) {
this._detailed = false;
}
return data;
});
}
getUserByTicket(userTicket) {
return __awaiter(this, void 0, void 0, function* () {
let response = yield this.doRequest({
url: this._baseUrl + '/cgi-bin/service/getuserdetail3rd',
method: 'post',
params: {
suite_access_token: yield this.getSuiteAccessToken(),
},
data: {
user_ticket: userTicket,
}
});
let data = response.data;
if (!data || data['errcode'] || !data['userid']) {
throw new Error(`Failed to get user: ${data['errmsg'] || 'Unknown'}`);
}
return data;
});
}
getAuthUrl() {
if (this._asQrcode) {
let query = {
appid: this.getClientId(),
redirect_uri: this._redirectUrl,
usertype: this._userType,
lang: this._lang,
};
if (this._state) {
query['state'] = this._state;
}
return `https://open.work.weixin.qq.com/wwopen/sso/3rd_qrConnect?` + (0, Utils_1.buildQueryString)(query);
}
let query = {
appid: this.getClientId(),
redirect_uri: this._redirectUrl,
response_type: 'code',
scope: this.formatScopes(this._scopes, this._scopeSeparator),
};
if (this._state) {
query['state'] = this._state;
}
let agentId = this._agentId || this._config.get('agentid');
if (agentId) {
query['agentid'] = agentId;
}
return 'https://open.weixin.qq.com/connect/oauth2/authorize?' + (0, Utils_1.buildQueryString)(query) + '#wechat_redirect';
}
getTokenUrl() {
return '';
}
getUserByToken(token) {
return __awaiter(this, void 0, void 0, function* () {
throw new Error(`Open WeWork doesn't support access_token mode.`);
});
}
mapUserToObject(user) {
if (this._detailed) {
return new User_1.User({
id: user['userid'] || user['UserId'] || null,
name: user['name'] || null,
avatar: user['avatar'] || null,
gender: user['gender'] || null,
corpid: user['corpid'] || user['CorpId'] || null,
open_userid: user['open_userid'] || null,
qr_code: user['qr_code'] || null,
});
}
return new User_1.User({
id: user['UserId'] || user['UserId'] || user['OpenId'] || user['openid'] || null,
corpid: user['corpid'] || user['CorpId'] || null,
open_userid: user['open_userid'] || null,
});
}
}
exports.OpenWeWork = OpenWeWork;
OpenWeWork.NAME = 'open-wework';