抖音开放平台Logo
开发者文档
“/”唤起搜索
控制台

用户授权
收藏
我的收藏

抖音小程序用户授权是保障用户隐私与功能正常运行的核心机制,开发者需在用户明确同意后才能调用涉及敏感信息的 API 或组件。

授权机制

小程序对用户信息采取严格的分级保护策略,仅在以下场景触发授权流程:
    1.首次调用:当调用需授权的 API / 组件(如tt.chooseLocation)时,首次调用一定会弹出用户授权弹窗。
    用户允许:正常执行接口功能。
    用户拒绝:本次调用失败,直接进入接口fail回调。
    2.再次调用:
    在用户未手动授权前,再次调用同 API 时不再弹窗,直接触发fail回调。
    用户可通过小程序授权设置页(右上角「更多 - 设置」)手动修改授权状态,后续调用结果随设置实时更新。
    3.授权状态存储:
    授权设置仅存储在当前设备当前账号下,与服务器及其他设备无关联。
    更换设备或切换账号需重新触发首次授权流程。

使用场景

基础功能与敏感功能区分

    无授权场景:浏览信息、查看非个性化内容等基础操作无需授权。
    需授权场景:涉及用户隐私或设备功能的操作(如定位、摄像头、相册、麦克风、地址等),需用户主动授权后才能使用。

典型业务场景示例

    生活服务类:通过scope.userLocation获取地理位置,推荐附近商家或导航服务。
    社交分享类:使用scope.hostId为用户生成带有抖音号水印的分享内容。
    电商购物类:通过scope.address获取收货地址,简化订单填写流程。
    多媒体工具类:调用scope.camera/album/record实现拍照上传、相册选图或语音输入功能。

目标

    1.掌握授权全流程开发。
    理解首次授权弹窗触发、重复调用逻辑及授权设置页管理机制。
    熟练使用tt.getSetting(检查状态)、tt.openSetting(引导授权)等核心 API。
    2.实现合规的权限交互。
    确保仅在用户使用敏感功能时请求授权,明确告知权限用途(如 “需要摄像头权限以使用扫码功能”)。
    处理用户拒绝授权后的引导逻辑(如跳转设置页手动开启权限)。
    3.完成授权体系搭建。
    从 “首次触发授权→状态检测→用户引导→功能调用” 形成闭环,适配不同设备 / 账号的授权重置场景。
    解决常见问题(如权限设置页不显示、状态不同步等),保障功能稳定性。

准备工作

开发抖音小程序的视图容器前,你需要完成以下前置准备,详情请参见开发准备
    注册账号并完成认证
    创建小程序
    添加协作者/管理员
    安装抖音开发者工具 IDE

开发步骤

说明
本教程以用户的地理位置权限为例,介绍如何在小程序中实现。

步骤一:全局配置

配置小程序的基本信息(如页面路径、导航栏标题)。
    app.json 中声明地理位置权限 scope.userLocation,这是使用相关 API 的前提,否则会导致权限申请失败。
    app.ttss 中设置小程序的全局样式,为整个小程序定义统一的样式规则,确保所有页面的视觉风格一致。
app.json
app.ttss
{ "pages": ["pages/index/index"], "window": { "navigationBarTitleText": "位置授权示例" }, "requiredPrivateInfos": ["scope.userLocation"] }

步骤二:获取授权状态

通过 tt.getSetting 获取用户当前的授权状态(已授权 / 未授权 / 未检查),返回包含所有已授权权限的对象。
    若已授权,直接获取授权信息及状态,如地理位置权限信息;
    若未授权,判断是否为首次请求,决定后续流程(首次触发授权弹窗,非首次引导至设置页)。
index.js
index.ttml
Page({ data: { authStatus: null, // 授权状态:null=未检查,true=已授权,false=未授权 checkResult: '' // 检查结果文本 }, // 检查授权状态 checkAuthStatus() { tt.getSetting({ success: (res) => { const authStatus = res.authSetting['scope.userLocation']; this.setData({ authStatus: authStatus, checkResult: authStatus ? '✅ 已授权地理位置' : '❌ 未授权地理位置' }); console.log('授权状态:', authStatus); }, fail: (err) => { console.error('获取授权状态失败', err); this.setData({ checkResult: '⚠️ 检查权限失败,请重试' }); } }); } });
本教程中,此时还未实现地理位置授权,用户无法选择,所以授权状态为 ❌ 未授权地理位置。

步骤三:地理位置授权

首次调用时,通过 tt.chooseLocation 触发系统授权弹窗,询问用户是否同意授权。
    用户同意后,直接获取位置信息。
    用户拒绝后,则记录状态,后续引导至设置页。
index.js
index.ttml
// 获取用户位置 getUserLocation() { tt.chooseLocation({ success: (res) => { console.log('位置信息:', res); this.setData({ checkResult: `✅ 位置信息:${res.name}, ${res.address}` }); }, fail: (err) => { console.error('获取位置失败', err); this.setData({ checkResult: '⚠️ 获取位置失败,请重试' }); } }); }
操作结果
示例
用户同意授权,并选择地理位置后,界面中显示位置信息。
用户同意授权,但未选择地理位置,界面中显示“⚠️ 获取位置失败,请重试”。
用户拒绝后,界面中显示“⚠️ 获取位置失败,请重试”。

步骤四:打开授权设置页面

当用户拒绝过授权手动关闭权限后,无法通过系统弹窗再次请求授权,需要通过 tt.openSetting 引导用户到小程序设置页面手动开启权限。
index.js
index.ttml
// 打开授权设置页(直接打开,无提示框) openAuthSetting() { tt.openSetting({ success: (res) => { console.log('用户返回设置页', res.authSetting); // 立即检查授权状态是否更新 this.checkAuthStatus(); }, fail: (err) => { console.error('打开设置页失败', err); this.setData({ checkResult: '⚠️ 无法打开设置页,请重试' }); } }); },

步骤五:再次获取授权状态

在用户从设置页返回后,或完成授权操作后,再次调用 tt.getSetting 检查最新的授权状态,确保界面显示与实际权限一致。
本教程中,无需新增代码,复用步骤 1 的 checkAuthStatus 方法,用户从设置页返回后点击「检查授权状态」按钮即可。
index.ttml
<button type="primary" bindtap="checkAuthStatus"> 再次检查授权状态 </button>
用户在设置页手动开启权限后,刷新界面显示 “✅ 已授权地理位置”。

最佳实践

    提前告知用途:在触发授权前,通过弹窗或页面提示明确告知用户权限用途,例如:"需要获取您的地理位置以推荐附近的餐厅"。
    分场景授权:避免在小程序启动时请求所有权限,应在用户实际使用功能时触发授权。例如:
    首次使用地图功能时请求地理位置授权
    首次上传图片时请求相册授权
    友好的拒绝提示:当用户拒绝授权时,提供清晰的提示和重新授权的入口,例如:"摄像头权限被拒绝,点击此处重新授权"。
    权限状态持久化:将用户授权状态存储在本地(如tt.setStorage),避免重复检查授权状态。
    兼容不同设备:由于授权状态不会同步到其他设备,需在用户切换设备时重新检查授权。

常见问题

问题
原因
解决方案
授权设置页不显示权限
该权限未被首次调用触发过授权弹窗
    1.确保调用了对应的 API / 组件触发首次授权弹窗
    2.调用tt.getSetting检查权限是否已被记录
授权状态不同步
授权设置仅存储在当前设备当前账号下
    1.在用户切换账号或设备时,重新检查授权状态
    2.避免依赖服务器同步授权状态
授权弹窗未显示
    1.未正确调用需授权的 API
    2.用户已授权过该权限
    1.检查代码是否正确调用了需授权的 API
    2.使用tt.getSetting检查用户是否已授权
用户拒绝授权后无法再次弹窗
首次拒绝后,重复调用 API 不会再次弹窗
    1.引导用户至设置页手动开启权限
    2.在设置页中提供清晰的授权说明