Source: sdk-file/src/alipay/auth.js

const utils = require('core-module/utils')
const constants = require('core-module/constants')
const createAuthFn = require('./createAuthFn')

let loginPromise = {
  silent: null,
  force: null,
}

const hasUserLogined = function (BaaS) {
  return Promise.all([
    BaaS.storageAsync.get(constants.STORAGE_KEY.UID),
    BaaS.storageAsync.get(constants.STORAGE_KEY.AUTH_TOKEN),
    utils.isSessionExpired(),
  ]).then(res => {
    const [uid, token, isExpired] = res
    return !!uid && !!token && !isExpired
  })
}

const createLoginFn = BaaS => (opts = {}) => {
  const forceLogin = !!opts && !!opts.forceLogin
  const auth = createAuthFn(BaaS)
  return hasUserLogined(BaaS).then(logined => {
    if (logined) {
      return Promise.resolve()
    }
    const loginType = forceLogin ? 'force' : 'silent'
    if (loginPromise[loginType]) {
      return loginPromise[loginType]
    }
    loginPromise[loginType] = auth(opts)
      .then(res => {
        loginPromise[loginType] = null
        return res
      })
      .catch(err => {
        loginPromise[loginType] = null
        throw err
      })
    return loginPromise[loginType]
  })
}

module.exports = function (BaaS) {
  const login = createLoginFn(BaaS)
  BaaS.auth.silentLogin = login.bind(null, {forceLogin: false})

  /**
   * 支付宝登录
   * @function
   * @memberof BaaS.auth
   * @param {BaaS.LoginWithAlipayParams} [options] 登录参数
   * @return {Promise<BaaS.CurrentUser>}
   */
  BaaS.auth.loginWithAlipay = opts => login(opts).then(res => {
    if (!res) return BaaS.auth.getCurrentUser()
    return BaaS.auth._initCurrentUser(res.data.user_info, res.data.expired_at)
  })
}