第四章:抖音登录与用户授权

登录授权这块,说实话是很多开发者容易踩坑的地方。我刚开始做抖音小程序时,也在这上面折腾了好几天。今天咱们就把抖音登录的整个流程掰开揉碎讲清楚。

4.1 抖音登录流程

抖音小程序的登录,说白了就是让抖音帮你确认「这个用户是谁」。整个流程其实不复杂,但有几个关键节点必须搞清楚。

我习惯把登录流程分成三步:

  1. 获取临时凭证 code —— 小程序端调用 tt.login()
  2. 换取 session_key 和 openid —— 后端拿着 code 去抖音服务器换
  3. 建立自己的登录态 —— 后端生成 token 返回给前端

嗯,这里要注意:code 只能用一次,有效期只有 5 分钟。我在项目中遇到过有人把 code 存到本地缓存里反复用,结果一直报错。

核心要点:抖音登录的 code 是一次性的,用完就失效。别想着复用。

4.2 静默登录与主动授权

你想想看,用户打开小程序,如果一上来就弹授权框,是不是很烦?所以抖音提供了两种登录方式。

静默登录

静默登录就是用户无感知的情况下完成登录。调用 tt.login() 就能拿到 code,整个过程用户完全不知道。

// 静默登录示例
tt.login({
  success(res) {
    console.log('登录成功,code:', res.code)
    // 把 code 传给后端
    wx.request({
      url: 'https://your-api.com/login',
      data: { code: res.code }
    })
  },
  fail(err) {
    console.error('登录失败:', err)
  }
})

我个人习惯在 app.js 的 onLaunch 里就调用静默登录。这样用户一打开小程序,后台就已经在准备登录了。

主动授权

主动授权需要用户点击按钮触发。说白了,就是你要告诉用户「我需要你的信息」,让用户自己决定给不给。

<button open-type="getUserInfo" bindgetuserinfo="onGetUserInfo">
  授权登录
</button>

我的建议:先静默登录拿到 openid,等用户需要用到头像昵称时,再弹授权框。这样用户体验会好很多。

4.3 获取用户信息(头像、昵称)

拿到授权后,就可以获取用户信息了。这里有个坑,我必须要说——抖音的 getUserInfo 接口返回的是加密数据,需要后端解密才能拿到真实信息。

// 前端获取用户信息
tt.getUserInfo({
  success(res) {
    // res.encryptedData 是加密的
    // res.iv 是偏移量
    // 这两个要传给后端解密
    console.log('加密数据:', res.encryptedData)
    console.log('偏移量:', res.iv)
  }
})

为什么会这样?因为抖音要保护用户隐私。加密后的数据只有你的后端能解密,中间就算被截获也没用。

后端解密代码示例(Node.js):

const crypto = require('crypto')

function decryptUserInfo(sessionKey, encryptedData, iv) {
  const decipher = crypto.createDecipheriv(
    'aes-128-cbc',
    Buffer.from(sessionKey, 'base64'),
    Buffer.from(iv, 'base64')
  )
  
  let decrypted = decipher.update(encryptedData, 'base64', 'utf8')
  decrypted += decipher.final('utf8')
  
  return JSON.parse(decrypted)
  // 返回结果包含: nickName, avatarUrl, gender 等
}

注意:解密用的 session_key 是从登录接口获取的,而且 session_key 会变化。我曾经遇到过 session_key 过期导致解密失败的情况,所以建议每次需要解密时都重新登录一次。

4.4 unionid 与 openid

这两个概念很多人搞混,我简单解释一下:

标识 说明 使用场景
openid 用户在小程序内的唯一标识 单个小程序内识别用户
unionid 用户在抖音开放平台下的唯一标识 跨小程序、跨应用识别同一用户

说白了,openid 是「小区门牌号」,unionid 是「身份证号」。如果你只有一个小程序,用 openid 就够了。但如果你有多个小程序或 App,想打通用户数据,那就需要 unionid。

获取 unionid 需要满足两个条件:

  1. 你的小程序绑定了抖音开放平台账号
  2. 用户授权了你的小程序

经验之谈:我做过一个电商项目,同时有抖音小程序和抖音小游戏。通过 unionid 把两个平台的用户数据打通,用户在小程序加购物车,在小游戏里也能看到。这个体验就很顺畅。

4.5 完整登录流程示例

最后,我给大家整理一个完整的登录流程代码。这是我项目里实际用过的模板:

// app.js
App({
  onLaunch() {
    // 第一步:静默登录
    this.silentLogin()
  },
  
  silentLogin() {
    tt.login({
      success: (res) => {
        // 第二步:后端换取 session_key 和 openid
        this.getSessionKey(res.code)
      }
    })
  },
  
  getSessionKey(code) {
    tt.request({
      url: 'https://your-api.com/getSessionKey',
      data: { code },
      success: (res) => {
        // 保存 session_key 和 openid
        wx.setStorageSync('sessionKey', res.data.session_key)
        wx.setStorageSync('openid', res.data.openid)
        
        // 如果有 unionid 也保存
        if (res.data.unionid) {
          wx.setStorageSync('unionid', res.data.unionid)
        }
      }
    })
  },
  
  // 需要用户信息时调用
  getUserInfo() {
    return new Promise((resolve, reject) => {
      tt.getUserInfo({
        success: (res) => {
          // 解密用户信息
          this.decryptUserInfo(res.encryptedData, res.iv)
            .then(userInfo => resolve(userInfo))
        },
        fail: reject
      })
    })
  }
})

小技巧:登录成功后,后端返回的 token 建议设置 7 天有效期。用户 7 天内再次打开小程序,直接用 token 登录,不用重新授权。我一般会在 token 过期前 1 天提醒用户重新登录。

好了,抖音登录与用户授权这块就讲完了。说白了就是三步走:登录拿 code → 换 session_key → 解密用户信息。记住 code 只能用一次,session_key 会过期,unionid 需要绑定开放平台。把这些坑都避开了,登录流程基本就稳了。