HarmonyOS鸿蒙Next中用华为云 OBS 存储用户上传的图片,如何在App中安全获取临时访问链接?

HarmonyOS鸿蒙Next中用华为云 OBS 存储用户上传的图片,如何在App中安全获取临时访问链接? 应用允许用户传头像到 OBS,但不想暴露永久 AK/SK。鸿蒙端怎么安全生成临时 URL?

4 回复

业界通用做法的通过自己的服务器中转一下!

就是把AK/SK 等密钥存储在自己的服务器上,然后APP通过接口将图片上传给自己的服务器,服务器再去签名等上传到OSS就行了!

开发手册上都写了,密钥放在APP上不安全!

更多关于HarmonyOS鸿蒙Next中用华为云 OBS 存储用户上传的图片,如何在App中安全获取临时访问链接?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


没用过obs,用的oss

在HarmonyOS Next中,可通过华为云OBS SDK的createSignedUrl方法生成预签名URL。需在AppGallery Connect配置云存储服务,集成agconnect-storageobs-sdk。调用时指定对象键、HTTP方法(如GET)、过期时间,SDK将使用临时安全凭证自动签名。生成的临时链接可直接用于安全访问OBS中的图片资源。

在HarmonyOS Next应用中安全获取华为云OBS的临时访问链接,推荐使用**临时访问凭证(STS)**方案,避免AK/SK硬编码或直接暴露在客户端。以下是具体实现步骤:

1. 整体流程

鸿蒙App → 业务服务器(需自建) → 华为云IAM/STS服务 → 返回临时凭证 → 鸿蒙App用凭证生成临时URL

关键点:敏感操作(申请临时凭证)必须由业务服务器完成,客户端仅使用临时凭证生成链接。

2. 步骤详解

(1)业务服务器端部署

  • 在业务服务器(如华为云ECS)部署服务端接口,该接口需集成华为云IAM的STS能力。
  • 服务端通过固定AK/SK调用华为云STS API,申请临时安全凭证(包含临时AK/SK、SecurityToken、过期时间)。
  • 设置合理的临时凭证有效期(如30分钟~1小时),并严格限制权限策略(Policy),仅允许对指定OBS路径的读/写操作。
  • 将临时凭证返回给鸿蒙客户端。

(2)鸿蒙客户端实现(示例代码)

  • 使用@ohos/request@ohos/net.http模块请求业务服务器接口,获取临时凭证。
  • 使用@ohos/security.huks等模块妥善保护收到的临时凭证。
  • 利用华为云OBS SDK(需确认HarmonyOS Next兼容性)或自行拼接URL,生成带临时签名的访问链接。

示例:拼接临时下载URL(若OBS SDK暂不兼容)

// 假设已从业务服务器获取到临时凭证: tempAk, tempSk, securityToken, expireTime
// 以及对象在OBS中的地址: obsEndpoint, bucketName, objectKey

import crypto from '@ohos.crypto';

// 1. 构造请求时间(必须与凭证有效期匹配)
const requestDate = new Date().toUTCString();

// 2. 生成签名(具体算法参考华为云OBS签名文档)
const canonicalString = `GET\n\n\n${requestDate}\n${securityToken}\n/${bucketName}/${objectKey}`;
const signature = crypto.createHash('sha256').update(canonicalString).digest('hex'); // 需按OBS要求编码

// 3. 生成临时访问URL
const tempUrl = `https://${bucketName}.${obsEndpoint}/${objectKey}?`
  + `AccessKeyId=${tempAk}`
  + `&Expires=${expireTime}`
  + `&SecurityToken=${securityToken}`
  + `&Signature=${signature}`;

// 4. 使用该URL进行图片上传/下载(注意:PUT上传需调整签名方法)

3. 安全建议

  • 业务服务器需对客户端请求做身份鉴权(如用户登录态验证),防止凭证被滥用。
  • 临时凭证的权限策略(Policy)应遵循最小权限原则,例如:
    {
      "Statement": [{
        "Effect": "Allow",
        "Action": ["obs:object:PutObject", "obs:object:GetObject"],
        "Resource": ["obs:*:bucket:your-bucket-name/avatar/*"]
      }]
    }
    
  • 客户端收到临时凭证后,建议存储在内存中,使用后及时清理,避免持久化泄露。

4. 备选方案

若业务服务器开发成本高,可考虑:

  • 华为云函数工作流(FunctionGraph):部署无服务器函数作为中介,由鸿蒙App触发函数获取临时凭证。
  • OBS SDK直接集成:若华为云官方发布HarmonyOS Next版OBS SDK,可能内置临时凭证交换机制,需关注官方更新。

总结

核心是通过业务服务器中转STS请求,鸿蒙客户端仅使用短期有效的临时凭证生成链接。这既保证了AK/SK不暴露,又实现了灵活的访问控制。具体签名算法请严格参照华为云OBS API文档的最新要求。

回到顶部