资讯 社区 文档
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术

鉴权认证机制

简介

鉴权的主要目的是获取Access_token。Access_token是用户的访问令牌,承载了用户的身份、权限等信息。鉴权主要分为以下两步:

1.获取AK/SK

2.获取Access_token

  • 代码形式→适用于有计算机基础的用户
  • 网页调试工具→适用于零基础的用户
  • 在线调试工具(推荐)→快速调试接口效果

1. 获取AK/SK

当您成功创建应用后,在对应产品页签下选择“应用列表”,可查看已创建的应用。

平台将会分配给您此应用的相关凭证,主要为AppID、API Key、Secret Key。以上三个信息是您应用实际开发的重要凭证,每个应用各不相同,为了您的财产和服务安全请您妥善保管image.png

另外,我们为您提供了教学视频,您可以直接浏览视频获取详细教程。

2. 获取 Access_token

百度AI开放平台使用OAuth2.0授权调用开放API,调用API时必须在URL中带上Access_token参数,Access token默认有效期为30天,获取Access_token的流程如下:

请求URL数据格式

向授权服务地址https://aip.baidubce.com/oauth/2.0/token发送请求(推荐使用POST),并在URL中带上以下参数:

  • grant_type: 必须参数,固定为client_credentials
  • client_id: 必须参数,应用的API Key
  • client_secret: 必须参数,应用的Secret Key

例如:

https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=Va5yQRHlA4Fq5eR3LT0vuXV4&client_secret=0rDSjzQ20XUj5itV6WRtznPQSzr5pVw2&

获取Access_token的两种方式

接下来为您提供两种获取Access_token的方法,您可以按照自己的需求进行选择。

方式一:通过代码的形式获取Access_token

以下为您提供示例代码。这里以python语言为例进行演示。

  1. 打开python编译器,输入Access_token示例代码【python】。
import requests
import json


def main():
        
    url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=xxxxxx&client_secret=xxxxx"
    
    payload = ""
    headers = {
        'Content-Type': 'application/json',
        'Accept': 'application/json'
    }
    
    response = requests.request("POST", url, headers=headers, data=payload)
    
    print(response.text)
    

if __name__ == '__main__':
    main()
package baidu.com;

import okhttp3.*;
import org.json.JSONObject;

import java.io.*;

class Sample {

    static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build();

    public static void main(String []args) throws IOException{
        MediaType mediaType = MediaType.parse("application/json");
        RequestBody body = RequestBody.create(mediaType, "");
        Request request = new Request.Builder()
            .url("https://aip.baidubce.com/oauth/2.0/token?client_id=&client_secret=&grant_type=client_credentials")
            .method("POST", body)
            .addHeader("Content-Type", "application/json")
            .addHeader("Accept", "application/json")
            .build();
        Response response = HTTP_CLIENT.newCall(request).execute();
        System.out.println(response.body().string());

    }
}
<?php
class Sample {
    
    public function run() {
        $curl = curl_init();
        curl_setopt_array($curl, array(
            CURLOPT_URL => "https://aip.baidubce.com/oauth/2.0/token?client_id=&client_secret=&grant_type=client_credentials",
            CURLOPT_TIMEOUT => 30,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_CUSTOMREQUEST => 'POST',
            
            
            CURLOPT_HTTPHEADER => array(
                'Content-Type: application/json',
                'Accept: application/json'
            ),

        ));
        $response = curl_exec($curl);
        curl_close($curl);
        return $response;
    }
}

$rtn = (new Sample())->run();
print_r($rtn);
using System;
using System.IO;
using RestSharp;
namespace SampleApplication {
    public class Sample {

        
        public static void Main(string[] args) {
            var client = new RestClient($"https://aip.baidubce.com/oauth/2.0/token?client_id=&client_secret=&grant_type=client_credentials");
            client.Timeout = -1;
            var request = new RestRequest(Method.POST);
            request.AddHeader("Content-Type", "application/json");
            request.AddHeader("Accept", "application/json");
            var body = @"";
            request.AddParameter("application/json", body,  ParameterType.RequestBody);
            IRestResponse response = client.Execute(request);
            Console.WriteLine(response.Content);

        }
    }
}
package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "strings"
)

func main() {

    url := "https://aip.baidubce.com/oauth/2.0/token?client_id=&client_secret=&grant_type=client_credentials"
    payload := strings.NewReader(``)
    client := &http.Client {}
    req, err := http.NewRequest("POST", url, payload)

    if err != nil {
        fmt.Println(err)
        return
    }
    req.Header.Add("Content-Type", "application/json")
    req.Header.Add("Accept", "application/json")

    res, err := client.Do(req)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer res.Body.Close()

    body, err := ioutil.ReadAll(res.Body)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(body))
}
  
const request = require('request')

async function main() {
    var options = {
        'method': 'POST',
        'url': 'https://aip.baidubce.com/oauth/2.0/token?client_id=&client_secret=&grant_type=client_credentials',
        'headers': {
                'Content-Type': 'application/json',
                'Accept': 'application/json'
        }
    };

    request(options, function (error, response) {
        if (error) throw new Error(error);
        console.log(response.body);
    });
}

main();
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <curl/curl.h>
#include <json/json.h>
#include <fstream>


inline size_t onWriteData(void * buffer, size_t size, size_t nmemb, void * userp)
{
    std::string * str = dynamic_cast<std::string *>((std::string *)userp);
    str->append((char *)buffer, size * nmemb);
    return nmemb;
}


int main(int argc, char *argv[])
{
    std::string result;
    CURL *curl;
    CURLcode res;
    curl = curl_easy_init();
    if(curl) {
        curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
        curl_easy_setopt(curl, CURLOPT_URL, "https://aip.baidubce.com/oauth/2.0/token?client_id=&client_secret=&grant_type=client_credentials");
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
        curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https");
        struct curl_slist *headers = NULL;
        headers = curl_slist_append(headers, "Content-Type: application/json");
        headers = curl_slist_append(headers, "Accept: application/json");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        const char *data = "";
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &result);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, onWriteData);
        res = curl_easy_perform(curl);
        std::cout<<result;
    }
    curl_easy_cleanup(curl);
    return (int)res;
}
  1. 在【官网获取的AK】和【官网获取的SK】中输入创建应用后获取的AK、SK。

get_access_token_1.png

  1. 输入完成后运行代码,服务器将返回json文本参数,如下:
  • access_token:要获取的Access Token;

get_access_token_2.png

  • expires_in:Access Token的有效期(秒为单位,有效期30天);

get_access_token_3.png

  • 其他参数忽略,暂时不用;
  1. 若请求错误,服务器将返回的JSON文本包含以下参数:
  • error: 错误码;关于错误码的详细信息请参考下方鉴权认证错误码。
  • error_description: 错误描述信息,帮助理解和解决发生的错误。

例如,认证失败返回:

{
    "error": "invalid_client",
    "error_description": "unknown client id"
}

鉴权认证错误码

error error_description 解释
invalid_client unknown client id API Key不正确
invalid_client Client authentication failed Secret Key不正确

方式二:使用网页调试工具获取Access_token

依次在网页调试工具中输入:

  • grant_type: 必须参数,固定为client_credentials
  • client_id: 必须参数,应用的API Key
  • client_secret: 必须参数,应用的Secret Key

具体的参数,您可以在控制台应用列表中看到,如果您还不熟悉,请您查看上一步“获取AK/SK”。

图片17.png

输入完成后,点击send,返回json字符串,获取Access_token。例如图中获取的access_token为24.a7179f3da2d56a81d0af25931c67efee.2592000.1627131472.282335-24130966

图片18.png

另外,为您提供教学视频。您可以点击视频查看详细步骤。

方式三:在线调试工具(推荐)

您可以在 示例代码中心 中快速调试接口,可进行签名验证、查看在线调用的请求内容和返回结果、示例代码的自动生成。

3. 密钥安全提示与止损方法

1.请勿将您的AK/SK、以及生成的Access token与他人共享或硬编码到APP及终端,为保护您的资源安全,平台可能会针对恶意滥用token进行禁用。
image.png

2.使用http协议兑换token有被截获sk的风险。如发生凭证(即AK/SK或Access token)泄露,您可以在【应用详情】页更新应用的Secret Key。 请注意:更新后历史生成的Access_token将立即失效,请及时更新运营环境中的Secret Key,避免影响服务调用。
image.png

使用Access Key ID/Secret Access Key的开发者注意

如果您使用的是“安全认证/Access Key ”中的Access Key ID 和 Secret Access Key的开发者,则不能使用获取Access Token的方式鉴权,具体鉴权认证机制参考“百度云鉴权认证机制”。

上一篇
创建应用
下一篇
调用服务