node-socialite
Version:
Socialite is an OAuth2 authentication tool for Node.js
220 lines (219 loc) • 8.46 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.WeWork = 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/91335)
*/
class WeWork extends BaseProvider_1.BaseProvider {
constructor(config) {
super(config);
this._detailed = false;
this._asQrcode = false;
this._agentId = null;
this._apiAccessToken = '';
this._baseUrl = 'https://qyapi.weixin.qq.com';
if (this._config.has('base_url')) {
this._baseUrl = this._config.get('base_url');
}
if (this._config.has('agent_id')) {
this._agentId = this._config.get('agent_id');
}
}
getBaseUrl() {
return this._baseUrl;
}
setAgentId(agentId) {
this._agentId = agentId;
return this;
}
withAgentId(agentId) {
return this.setAgentId(agentId);
}
/**
* 开启获取用户敏感信息(仅在 scope 为 snsapi_privateinfo 时有效)
*/
detailed() {
this._detailed = true;
return this;
}
asQrcode() {
this._asQrcode = true;
return this;
}
withApiAccessToken(apiAccessToken) {
this._apiAccessToken = apiAccessToken;
return this;
}
userFromCode(code) {
return __awaiter(this, void 0, void 0, function* () {
var _a;
let token = yield this.getApiAccessToken();
let user = yield this.getUser(token, code);
if (this._detailed) {
let userTicket = (_a = user['user_ticket']) !== null && _a !== void 0 ? _a : '';
if (user['userid']) {
user = yield this.getUserById(token, user['userid']);
}
if (userTicket) {
// 补充敏感信息,头像、性别、手机、邮箱、企业邮箱、员工个人二维码、地址
user = (0, Utils_1.merge)(user, yield this.getUserDetail(token, userTicket));
}
}
return this.mapUserToObject(user)
.setProvider(WeWork.NAME)
.setRaw(user);
});
}
getApiAccessToken() {
return __awaiter(this, void 0, void 0, function* () {
if (!this._apiAccessToken) {
this._apiAccessToken = yield this.createApiAccessToken();
}
return this._apiAccessToken;
});
}
createApiAccessToken() {
return __awaiter(this, void 0, void 0, function* () {
let response = yield this.doRequest({
url: this._baseUrl + '/cgi-bin/gettoken',
method: 'get',
params: {
corpid: this._config.get('corp_id') || this._config.get('corpid') || this.getClientId(),
corpsecret: this._config.get('corp_secret') || this._config.get('corpsecret') || this.getClientSecret(),
}
});
if (!response || !response.data) {
throw new Error(`Failed to createApiAccessToken with error response: ${JSON.stringify(response)}`);
}
let data = response.data;
if (data['errcode']) {
throw new Error(`Failed to createApiAccessToken: ${data['errmsg'] || 'Unknown'}`);
}
return data['access_token'];
});
}
getUser(token, code) {
return __awaiter(this, void 0, void 0, function* () {
let response = yield this.doRequest({
url: this._baseUrl + '/cgi-bin/auth/getuserinfo',
method: 'get',
params: {
access_token: token,
code,
}
});
if (!response || !response.data) {
throw new Error(`Failed to getUser with error response: ${response.data || response}`);
}
let data = response.data;
if (data['errcode'] || (!data['userid'] && !data['openid'])) {
throw new Error(`Failed to getUser: ${data['errmsg'] || 'Unknown'}`);
}
else if (!data['user_ticket']) {
this._detailed = false;
}
return data;
});
}
getUserById(token, userId) {
return __awaiter(this, void 0, void 0, function* () {
let response = yield this.doRequest({
url: this._baseUrl + '/cgi-bin/user/get',
method: 'get',
params: {
access_token: token,
userid: userId,
}
});
if (!response || !response.data) {
throw new Error(`Failed to getUserById with error response: ${response.data || response}`);
}
let data = response.data;
if (data['errcode'] || !data['userid']) {
throw new Error(`Failed to getUserById: ${data['errmsg'] || 'Unknown'}`);
}
return data;
});
}
getUserDetail(token, userTicket) {
return __awaiter(this, void 0, void 0, function* () {
let response = yield this.doRequest({
url: this._baseUrl + '/cgi-bin/auth/getuserdetail',
method: 'post',
params: {
access_token: token,
},
data: {
user_ticket: userTicket,
},
});
if (!response || !response.data) {
throw new Error(`Failed to getUserDetail with error response: ${response}`);
}
let data = response.data;
if (data['errcode'] || !data['userid']) {
throw new Error(`Failed to get getUserDetail: ${data['errmsg'] || 'Unknown'}`);
}
return data;
});
}
getAuthUrl() {
let query = {
appid: this.getClientId(),
redirect_uri: this._redirectUrl,
response_type: 'code',
scope: this.formatScopes(this._scopes, this._scopeSeparator),
};
if (this._agentId) {
query['agentid'] = this._agentId;
}
if (this._state) {
query['state'] = this._state;
}
if (!this._agentId && (query.scope.indexOf('snsapi_privateinfo') > -1 || this._asQrcode)) {
throw new Error(`'agent_id' is require when qrcode mode or scopes is 'snsapi_privateinfo'`);
}
if (this._asQrcode) {
delete query.scope;
delete query.response_type;
query.login_type = 'CorpApp';
return `https://login.work.weixin.qq.com/wwlogin/sso/login?` + (0, Utils_1.buildQueryString)(query);
}
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(`WeWork doesn't support access_token mode.`);
});
}
mapUserToObject(user) {
if (this._detailed) {
return new User_1.User({
id: user['userid'] || null,
name: user['name'] || null,
email: user['email'] || null,
avatar: user['avatar'] || null,
});
}
return new User_1.User({
id: user['userid'] || user['openid'] || null,
});
}
}
exports.WeWork = WeWork;
WeWork.NAME = 'wework';