const { UniCloudError } = require('../../../../common/error') const { resolveUrl } = require('../../../../common/utils') const { callQQOpenApi } = require('../normalize') module.exports = class Auth { constructor (options) { this.options = Object.assign({ baseUrl: 'https://graph.qq.com', timeout: 5000 }, options) } async _requestQQOpenapi ({ name, url, data, options }) { const defaultOptions = { method: 'GET', dataType: 'json', dataAsQueryString: true, timeout: this.options.timeout } const result = await callQQOpenApi({ name: `auth.${name}`, url: resolveUrl(this.options.baseUrl, url), data, options, defaultOptions }) return result } async getUserInfo ({ accessToken, openid } = {}) { const url = '/user/get_user_info' const result = await this._requestQQOpenapi({ name: 'getUserInfo', url, data: { oauthConsumerKey: this.options.appId, accessToken, openid } }) return { nickname: result.nickname, avatar: result.figureurl_qq_1 } } async getOpenidByToken ({ accessToken } = {}) { const url = '/oauth2.0/me' const result = await this._requestQQOpenapi({ name: 'getOpenidByToken', url, data: { accessToken, unionid: 1, fmt: 'json' } }) if (result.clientId !== this.options.appId) { throw new UniCloudError({ code: 'APPID_NOT_MATCH', message: 'appid not match' }) } return { openid: result.openid, unionid: result.unionid } } async code2Session ({ code } = {}) { const url = 'https://api.q.qq.com/sns/jscode2session' const result = await this._requestQQOpenapi({ name: 'getOpenidByToken', url, data: { grant_type: 'authorization_code', appid: this.options.appId, secret: this.options.secret, js_code: code } }) return result } }