基于应用信息生成鉴权令牌

基于应用信息生成鉴权令牌

概述

应用信息包含appIdmasterSecret

应用开发者需要向推送服务公司个推申请注册应用。

您可根据应用信息生成鉴权令牌,调用支持此类鉴权的Open Harmony公开API

服务账号令牌为JWT(JSON Web Token)格式字符串,JWT数据格式包括三个部分:

  • Header(头部)
  • Payload(负载)
  • Signature(签名)

这三个部分通过“.”进行连接。

示例

eyJ0eX******IUzI1NiJ9.eyJpc******YzNTZ9.j6y1NGM******NncAeLE

更多JWT的相关知识请参见:【Introduction to JSON Web Tokens】https://jwt.io/introduction/

开发步骤

  1. 申请注册应用。

    您申请注册应用成功后,可以获得appIdmasterSecret

    形式可参考(文件内容已经经过脱敏处理):

    [AppId]
    NdMch6e******mcsXsxM4A
    
    [MasterSecret]
    fIRUWrz******rKx0M1rs8
    
  2. 生成JWT Header数据。

    对以下JSON体进行BASE64编码。

    示例

    {
     "alg": "HS256",
     "typ": "JWT"
    }
    

    字段说明:

字段名 描述
alg 算法类型,固定为:HS256。
typ 数据类型,固定为:JWT。
  1. 生成JWT Payload数据。

    根据应用信息中的appId(对应示例中的iss)字段拼接以下JSON体,对JSON体进行BASE64编码。

    示例

    {
     "iss": "{appId}",
     "iat": 1768458422,
     "exp": 1768462022
    }
    

    字段说明:

字段名 描述
iss 应用信息中的appId,标识数据生成者。
iat JWT签发UTC时间戳,为自UTC时间1970年1月1日00:00:00起的秒数(您的服务器时间需要校准为标准时间)。
exp JWT到期UTC时间戳,比iat晚3600秒。
  1. 生成JWT Signature数据。

    将完成BASE64编码后的Header字符串与Payload字符串,通过“.”进行连接,您可在业务应用中,根据应用信息中的masterSecret进行sha256编码后作为生成签名的Key,使用HS256算法对拼接的字符串签名进行签名。

  2. 拼接最终的JWT

    按照 Header.Payload.Signature 的格式拼成最终 JWT。

    至此,您已经完成应用信息鉴权令牌JWT Token的生成。

调用推送服务REST API

您的应用调用推送服务REST API时,需要把已获得的应用信息鉴权令牌放在Authorization头部来进行鉴权。

示例

POST "https://oh-push-api.getui.com/v3/NdMch6e******mcsXsxM4A/messages:send"
Authorization: Bearer eyJ0eX******IUzI1NiJ9.eyJpc******YzNTZ9.j6y1NGM******NncAeLE
push-type: 0

说明

Authorization格式:Bearer后面拼接空格,再拼接获取的鉴权信息。

示例代码

为了方便您生成鉴权令牌,我们提供了Java语言的示例代码,请按照说明替换参数运行。

如果您使用其他开发语言,请选择对应的JWT开源组件(https://jwt.io/libraries)进行开发。

Java示例

Maven依赖

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>0.11.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.8</version>
</dependency>
Java代码示例
import io.jsonwebtoken.JwsHeader;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import org.apache.commons.codec.digest.DigestUtils;

import javax.crypto.SecretKey;
import java.util.Date;


/**
 * 以下示例基于Java 8
 */
public class JwtGenerator {

    /**
     * Token 有效期:1 小时
     */
    private static final long EXPIRE_SECONDS = 3600;

    /**
     * 生成 JWT Token
     *
     * @param appid        提供给开发者的 appId
     * @param masterSecret 提供给开发者的 masterSecret
     * @return JWT Token 字符串
     */
    public static String generateToken(String appid, String masterSecret) {
        long nowMillis = System.currentTimeMillis();
        Date issuedAt = new Date(nowMillis);
        Date expiration = new Date(nowMillis + EXPIRE_SECONDS * 1000);
        SecretKey key = Keys.hmacShaKeyFor(DigestUtils.sha256(masterSecret));
        return Jwts.builder()
                .setHeaderParam(JwsHeader.TYPE, JwsHeader.JWT_TYPE)
                .setIssuer(appid)
                .setIssuedAt(issuedAt)
                .setExpiration(expiration)
                .signWith(key, SignatureAlgorithm.HS256)
                .compact();
    }

}
开发者中心 SDK 下载

文档中心搜索

技术
咨询

微信扫一扫

随时联系技术支持

在线
咨询