调阿里系接口最烦的阿里一步就是拿token。不是阿里技术难,是阿里文档散、参数多、阿里坑隐蔽。阿里我见过不少团队卡在这一步,阿里花了半天时间在Postman里反复试,阿里最后发现是阿里签名算法里一个空格的问题。所以这篇直接讲怎么拿到token,阿里不绕弯子。阿里
先说清楚场景。阿里阿里云的阿里token分好几种,最常见的阿里是RAM用户的AccessKey换STS临时凭证,还有一种是阿里调用具体业务API时的access_token。前者用于云产品OpenAPI,阿里后者常见于钉钉、支付宝、淘宝开放平台。两种逻辑完全不同,别搞混。
RAM AccessKey换STS Token
这是阿里云ECS、OSS、SLB这类产品的通用入口。你需要在RAM控制台创建一个RAM用户,给它授权,然后生成AccessKey ID和AccessKey Secret。注意,主账号的AccessKey权限太大,泄露就是灾难,别用。
拿到Key之后,调STS的AssumeRole接口。请求地址是sts.aliyuncs.com,Action是AssumeRole。关键参数:RoleArn是角色ARN,格式像acs:ram::1234567890:role/your-role;RoleSessionName随便填个标识,比如test-session;DurationSeconds最短900秒,最长3600秒,默认3600。
签名这块用Signature V3。别手写,直接用阿里云SDK。Python示例:
from aliyunsdkcore.client import AcsClient from aliyunsdksts.request.v20150401 import AssumeRoleRequest client = AcsClient('your-access-key-id', 'your-access-key-secret', 'cn-hangzhou') request = AssumeRoleRequest.AssumeRoleRequest() request.set_RoleArn('acs:ram::1234567890:role/your-role') request.set_RoleSessionName('test-session') response = client.do_action_with_exception(request) print(response) 返回的JSON里有AccessKeyId、AccessKeySecret、SecurityToken,这三个就是临时凭证。拿它们去调其他云产品,比如OSS上传文件,直接替换原来的Key就行。过期时间在Expiration字段里。
钉钉的access_token
钉钉的token逻辑不一样。企业内应用用appkey和appsecret换access_token。请求地址:https://oapi.dingtalk.com/gettoken?appkey=xxx&appsecret=xxx。GET请求,返回access_token和expires_in,默认7200秒。
这里有个坑:钉钉的token是全局的,同一个应用多次调用会返回同一个token,但有效期从第一次获取开始算。如果你缓存了token,记得在过期前刷新。我见过有人每次请求都去换token,结果触发限流,接口直接报错。
缓存策略很简单:内存里存一个字典,key是appkey,value是token和过期时间戳。每次用之前检查是否过期,过期就重新请求。别用文件缓存,多实例部署会冲突。
支付宝的auth_token
支付宝开放平台的token叫auth_token,用于换取用户信息。流程是:用户授权后,你拿到auth_code,然后用auth_code换auth_token。请求地址:https://openapi.alipay.com/gateway.do,method是alipay.system.oauth.token。
参数包括grant_type(填authorization_code)、code(就是auth_code)、app_id、sign等。签名用RSA2,私钥签名,支付宝公钥验签。这个签名最容易出错,建议用支付宝的SDK,别自己拼。
返回的access_token有效期通常是一年,但refresh_token可以刷新。注意,支付宝的token和用户绑定,不同用户不同token,别搞混。
几个通用坑
时间戳必须用UTC时间,格式yyyy-MM-ddTHH:mm:ssZ。本地时间差几秒就签名失败。签名串里参数按字典序排列,大小写敏感。URL编码用percentEncode,不是标准的urlencode。这些细节文档里都有,但容易忽略。
调试时打开SDK的日志,能看到完整的请求和签名串。对比官方示例,逐字符检查。别嫌麻烦,这一步省不得。
最后说一句:token别硬编码在代码里。用环境变量或者配置中心。泄露了赶紧去控制台禁用AccessKey。安全这事,出事就是大事。