快速迁移指南.md 7.46 KB

静默授权功能快速迁移指南

概述

本指南提供了将老来赛项目的静默授权功能迁移到其他项目的最低成本方案。通过简单的配置和少量代码修改,你可以在新项目中快速复用这套成熟的授权机制。

最低成本方案:直接复制 + 配置化

第一步:复制核心文件

将以下文件复制到新项目中:

  1. 复制 universal-auth-manager.js 到新项目的 utils 目录
  2. 创建项目特定的配置文件

第二步:创建项目配置

在新项目中创建 auth-config.js

// auth-config.js
import { UniversalAuthManager, TaroAdapters } from './utils/universal-auth-manager.js'
import request from './utils/request' // 你的HTTP请求工具

// 项目特定配置
const authConfig = {
    // 必需配置:页面路径
    authPage: '/pages/login/index',        // 你的登录页面路径
    defaultPage: '/pages/home/index',      // 你的首页路径

    // 必需配置:适配器
    ...TaroAdapters.getAdapters(request),

    // 可选配置:测试环境openid(如果需要)
    testOpenIds: ['test-user-001'],

    // 可选配置:用户状态检查(如果有特殊业务逻辑)
    async checkUserStatus() {
        // 示例:检查用户是否完成了必要的设置
        try {
            const userInfo = await getUserInfo() // 替换为你的用户信息接口
            return userInfo && userInfo.status === 'active'
        } catch (error) {
            return false
        }
    },

    // 可选配置:自定义重定向逻辑
    async getRedirectPath(savedPath, defaultPath) {
        // 示例:根据用户状态决定跳转页面
        const isUserActive = await this.checkUserStatus()
        if (!isUserActive) {
            return '/pages/setup/index' // 跳转到设置页面
        }
        return savedPath || defaultPath
    }
}

// 导出授权管理器实例
export const authManager = new UniversalAuthManager(authConfig)

// 导出常用方法(保持与原项目API一致)
export const silentAuth = (onSuccess, onError) => authManager.silentAuth(onSuccess, onError)
export const needAuth = () => authManager.needAuth()
export const navigateToAuth = (returnPath) => authManager.navigateToAuth(returnPath)
export const returnToOriginalPage = (defaultPath) => authManager.returnToOriginalPage(defaultPath)
export const handleSharePageAuth = (options, callback) => authManager.handleSharePageAuth(options, callback)

第三步:更新现有代码

将原来的导入语句:

// 原来
import { silentAuth, needAuth, navigateToAuth } from '@/utils/authRedirect'

替换为:

// 现在
import { silentAuth, needAuth, navigateToAuth } from './auth-config'

其他代码无需修改!

极简方案:5分钟快速配置

如果你的项目非常简单,只需要基础的静默授权功能,可以使用这个极简配置:

// simple-auth.js
import { UniversalAuthManager, TaroAdapters } from './utils/universal-auth-manager.js'
import request from './utils/request'

// 极简配置
const authManager = new UniversalAuthManager({
    authPage: '/pages/login/index',     // 改为你的登录页
    defaultPage: '/pages/home/index',   // 改为你的首页
    ...TaroAdapters.getAdapters(request)
})

// 导出方法
export const silentAuth = (onSuccess, onError) => authManager.silentAuth(onSuccess, onError)
export const needAuth = () => authManager.needAuth()
export const navigateToAuth = () => authManager.navigateToAuth()
export const returnToOriginalPage = () => authManager.returnToOriginalPage()

常见使用场景

1. 页面加载时检查授权

// 在页面的 onLoad 方法中
async onLoad() {
    try {
        await silentAuth()
        // 授权成功,加载页面数据
        this.loadData()
    } catch (error) {
        // 授权失败,跳转登录
        navigateToAuth()
    }
}

2. 处理分享页面

// 处理从分享链接进入的页面
async onLoad(options) {
    const isAuthorized = await handleSharePageAuth(options, () => {
        // 授权成功后的回调
        this.loadData()
    })

    if (isAuthorized) {
        // 已经授权,直接加载数据
        this.loadData()
    }
    // 如果未授权,会自动跳转到登录页
}

3. 登录页面完成授权后跳转

// 在登录页面授权成功后
async handleAuthSuccess() {
    // 跳转回原来的页面
    await returnToOriginalPage()
}

不同项目类型的配置示例

电商类小程序

const ecommerceConfig = {
    authPage: '/pages/login/index',
    defaultPage: '/pages/mall/index',
    ...TaroAdapters.getAdapters(request),

    // 检查用户是否绑定了手机号
    async checkUserStatus() {
        const userInfo = await getUserInfo()
        return userInfo && userInfo.mobile
    },

    // 未绑定手机号跳转到绑定页面
    async getRedirectPath(savedPath, defaultPath) {
        const hasMobile = await this.checkUserStatus()
        return hasMobile ? (savedPath || defaultPath) : '/pages/bind-mobile/index'
    }
}

内容类小程序

const contentConfig = {
    authPage: '/pages/auth/index',
    defaultPage: '/pages/feed/index',
    ...TaroAdapters.getAdapters(request),

    // 检查用户是否选择了兴趣标签
    async checkUserStatus() {
        const profile = await getUserProfile()
        return profile && profile.interests && profile.interests.length > 0
    },

    // 未选择兴趣跳转到兴趣选择页面
    async getRedirectPath(savedPath, defaultPath) {
        const hasInterests = await this.checkUserStatus()
        return hasInterests ? (savedPath || defaultPath) : '/pages/select-interests/index'
    }
}

工具类小程序(最简单)

const toolConfig = {
    authPage: '/pages/login/index',
    defaultPage: '/pages/tools/index',
    ...TaroAdapters.getAdapters(request)
    // 无需额外的业务逻辑
}

迁移检查清单

  • 复制 universal-auth-manager.js 文件
  • 创建项目配置文件
  • 更新导入语句
  • 配置正确的页面路径
  • 配置HTTP请求适配器
  • 测试静默授权功能
  • 测试页面跳转逻辑
  • 测试分享页面授权

常见问题

Q: 我的项目使用的不是Taro,可以用吗?

A: 可以,但需要实现对应框架的适配器。参考 TaroAdapters 的实现方式。

Q: 我的授权接口地址不同怎么办?

A: 在配置中修改 authUrl 参数即可。

Q: 我不需要复杂的业务逻辑,只要基础授权可以吗?

A: 可以,使用极简配置方案,只配置必需的页面路径即可。

Q: 如何调试授权问题?

A: 在配置中添加回调函数来监听授权状态:

const config = {
    // ... 其他配置
    onAuthSuccess: (result) => console.log('授权成功:', result),
    onAuthError: (error) => console.error('授权失败:', error)
}

总结

通过这种方式,你可以用最低的成本(约10分钟配置时间)将成熟的静默授权功能迁移到新项目中。核心优势:

  1. 零学习成本 - API保持不变
  2. 最小改动 - 只需修改导入语句
  3. 高度可配置 - 支持各种业务场景
  4. 向后兼容 - 不影响现有功能
  5. 易于维护 - 统一的授权逻辑管理

建议先使用极简配置快速验证功能,然后根据实际需求逐步添加业务逻辑。