tencent cloud

文档反馈

JavaScript(应用认证)

最后更新时间:2023-12-22 10:05:54

    操作场景

    该任务指导您使用 JavaScript 语言,通过应用认证来对您的 API 进行认证管理。

    操作步骤

    1. API 网关控制台,创建一个 API,选择鉴权类型为应用认证(参考 创建 API 概述)。
    2. 将 API 所在服务发布至发布环境(参考 服务发布与下线)。
    3. 在控制台 应用管理 界面创建应用。
    4. 在应用列表中选中已经创建好的应用,单击绑定 API,选择服务和 API 后单击提交,即可将应用与 API 建立绑定关系。
    5. 参考 示例代码,使用 JavaScript 语言生成签名内容。

    环境依赖

    API 网关提供 JSON 请求方式和 form 请求方式的示例代码,请您根据自己业务的实际情况合理选择。

    注意事项

    应用生命周期管理,以及 API 向应用授权、应用绑定 API 等操作请您参考 应用管理
    应用生成签名过程请您参考 应用认证方式

    示例代码

    JSON 请求方式示例代码

    const https = require('https')
    const crypto = require('crypto')
    
    // 应用 ApiAppKey
    const apiAppKey = 'APIDLIA6tMfqsinsadaaaaaaaapHLkQ1z0kO5n5P'
    // 应用 ApiAppSecret
    const apiAppSecret = 'Dc44ACV2Da3Gm9JVaaaaaaaaumYRI4CZfVG8Qiuv'
    
    const dateTime = new Date().toUTCString()
    const body = {
    arg1: 'a',
    arg2: 'b',
    }
    const md5 = crypto.createHash('md5').update(JSON.stringify(body), 'utf8').digest('hex')
    const contentMD5 = Buffer.from(md5).toString('base64')
    const options = {
    hostname: 'service-xxxxxxxx-1234567890.gz.apigw.tencentcs.com',
    port: 443,
    path: '/data',
    method: 'POST',
    headers: {
    Accept: 'application/json',
    'Content-Type': 'application/json',
    'Content-MD5': contentMD5,
    'Content-Length': JSON.stringify(body).length,
    'x-date': dateTime,
    },
    }
    
    const signingStr = [
    `x-date: ${dateTime}`,
    options.method,
    options.headers.Accept,
    options.headers['Content-Type'],
    contentMD5,
    options.path,
    ].join('\\n')
    const signing = crypto.createHmac('sha1', apiAppSecret).update(signingStr, 'utf8').digest('base64')
    const sign = `hmac id="${apiAppKey}", algorithm="hmac-sha1", headers="x-date", signature="${signing}"`
    options.headers.Authorization = sign
    
    const req = https.request(options, (res) => {
    console.log(`STATUS: ${res.statusCode}`)
    res.on('data', (chunk) => {
    console.log('BODY: ' + chunk)
    })
    })
    req.on('error', (error) => {
    console.error(error)
    })
    req.write(JSON.stringify(body))
    req.end()
    

    form 请求方式示例代码

    const https = require('https')
    const crypto = require('crypto')
    const querystring = require('querystring')
    const url = require('url')
    
    // 应用 ApiAppKey
    const apiAppKey = 'APIDLIA6tMfqsinsadaaaaaaaapHLkQ1z0kO5n5P'
    // 应用 ApiAppSecret
    const apiAppSecret = 'Dc44ACV2Da3Gm9JVaaaaaaaaumYRI4CZfVG8Qiuv'
    
    const dateTime = new Date().toUTCString()
    const body = {
    arg1: 'a',
    arg2: 'b',
    }
    const contentMD5 = ''
    const options = {
    hostname: 'service-xxxxxxxx-1234567890.gz.apigw.tencentcs.com',
    port: 443,
    path: '/data',
    method: 'POST',
    headers: {
    Accept: 'application/json',
    'Content-Type': 'application/x-www-form-urlencoded',
    'x-date': dateTime,
    },
    }
    
    // form 参数拼接 query 参数并按照字典排序
    const parsedPath = url.parse(options.path, true)
    const sortedQueryParams = sortQueryParams({ ...body, ...parsedPath.query })
    const signingStr = buildSignStr(sortedQueryParams)
    const signing = crypto.createHmac('sha1', apiAppSecret).update(signingStr, 'utf8').digest('base64')
    const sign = `hmac id="${apiAppKey}", algorithm="hmac-sha1", headers="x-date", signature="${signing}"`
    
    options.headers.Authorization = sign
    
    // 发送请求
    const req = https.request(options, (res) => {
    console.log(`STATUS: ${res.statusCode}`)
    res.on('data', (chunk) => {
    console.log('BODY: ' + chunk)
    })
    })
    req.on('error', (error) => {
    console.error(error)
    })
    req.write(querystring.stringify(body))
    req.end()
    
    function sortQueryParams(body) {
    const keys = Object.keys(body).sort()
    let signKeys = []
    for (let i = 0; i < keys.length; i++) {
    signKeys.push(keys[i])
    }
    // 按字典序排序
    return signKeys.sort()
    }
    
    function buildSignStr(sorted_body) {
    const keyStr = sorted_body
    .map((item) => {
    return `${item}=${body[item]}`
    })
    .join('&')
    return [
    `x-date: ${dateTime}`,
    options.method,
    options.headers.Accept,
    options.headers['Content-Type'],
    contentMD5,
    `${parsedPath.pathname}${keyStr ? `?${keyStr}` : ''}`,
    ].join('\\n')
    }
    
    
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持