阿里api网关接口创建、发布、授权、调试
下面会出现关于签名认证和阿里云api认证的概念以及认证方式的选择,如果这些还不是很清楚的可以看下我的上篇文章:
《阿里云api网关的认证方式介绍以及选择》
本篇会介绍创建3个典型接口:
app用户账号密码登录 ,认证方式: OpenID Connect(模式:获取授权api) & 阿里云APP
app用户查询用户信息 ,认证方式: OpenID Connect(模式:业务api) & 阿里云APP
设备(如:智能故事机)获取播放的资源 ,认证方式: 阿里云APP
1 进入api网关控制台
2 选择服务器所在地区
3 创建应用 ‘api网关_el_test’
4 如果要创建的api网关接口还没有所属分组,创建分组 ‘test’
5 创建api网关接口
下面创建3个典型的案例api网关接口 APP用户账号密码登录接口、APP
- 1 创建APP客户端登录接口 (如果安全认证不知道怎么选择,看文章头介绍的文章)
最后会附上 服务器后端生成KeyId,公钥、私钥的代码.
注:入参请求模式, 入参映射与入参透传的区别:入参映射需要你根据实际API需要参数,逐一录入API网关,通过映射关系,可以将参数映射到服务端上,一般情况下,比如我们请求的时候放在Query中,服务端也去Query中拿值,通过入参映射,我们可以实现请求的时候参数放在Header中,阿里API网关在转发到我们服务端的时候可以帮我们转发到Query中。入参映射可以实现阿里网关层的参数合法性校验(网关会参照校验规则对请求做初步校验,如果入参不合法 ,则不会到达您的后端服务,大大的降低了后端服务的压力),因为我们可以在每个参数后面“编辑更多”中指定参数的限制规则,比如长度限制、验证正则表达式等。入参透传的话不需要我们定义参数,阿里网关在收到我们请求的时候直接转发给我们的服务端。我们一般使用入参映射,因为这样对于我们的API需要的参数一目了然,而且以后如要加什么参数限制规则,也是很方便的。
摘自: https://www.jianshu.com/p/f04f5bd8f84b
关于请求body 非Form表单 模型,不是本文重点,这里没有介绍
官方文档: https://help.aliyun.com/document_detail/106633.html
- 2 创建 app用户查询用户信息 接口
- 3 创建 设备(如:智能故事机)获取播放的资源 接口
6 api网关接口发布
为刚才创建的3个接口都按上面操作发布 ‘测试’ 完成 后
7 api网关接口授权给指定应用
为刚才创建的3个接口都按上面操作 给 应用 “api网关_el_test” 授权。
8 调试
附, 服务器后端生成KeyId,公钥、私钥的代码 。
阿里云api网关 token 认证采用的是jws( jws 是jwt的一种实现).
import org.jose4j.json.JsonUtil;
import org.jose4j.jwk.RsaJsonWebKey;
import org.jose4j.jwk.RsaJwkGenerator;
import org.jose4j.jws.AlgorithmIdentifiers;
import org.jose4j.jws.JsonWebSignature;
import org.jose4j.jwt.JwtClaims;
import org.jose4j.jwt.NumericDate;
import org.jose4j.lang.JoseException;
import java.security.PrivateKey;
import java.util.UUID;
/**
* 认证服务器,负责生成 id_Token 并管理公钥私钥对
* 参考:https://help.aliyun.com/document_detail/48019.html?spm=a2c4g.11186623.6.592.386b7355mw0rwJ
* @author
*/
public class AsServer {
/**
* keyId,公钥,私钥 都是用 createKeyPair 方法生成
*/
private static String keyId = "0341a11b5887449a92d1c587c2d44731";
private static String privateKeyStr = "...";//这里没贴出来,自己去生成自己的 KeyPair 吧
public static String createIdToken(String userId){
try {
//Claims
JwtClaims claims = new JwtClaims();
claims.setGeneratedJwtId();
claims.setIssuedAtToNow();
//expire time
NumericDate date = NumericDate.now();
date.addSeconds(60*60*24);
claims.setExpirationTime(date);
claims.setNotBeforeMinutesInThePast(1);
claims.setSubject("YOUR_SUBJECT");
claims.setAudience("YOUR_AUDIENCE");
//添加自定义参数,必须是字符串类型
claims.setClaim("userId", userId);
//jws
JsonWebSignature jws = new JsonWebSignature();
jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256);
jws.setKeyIdHeaderValue(keyId);
jws.setPayload(claims.toJson());
PrivateKey privateKey = new RsaJsonWebKey(JsonUtil.parseJson(privateKeyStr)).getPrivateKey();
jws.setKey(privateKey);
//get token
String idToken = jws.getCompactSerialization();
return idToken;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void createKeyPair(){
String keyId = UUID.randomUUID().toString().replaceAll("-", "");
RsaJsonWebKey jwk = null;
try {
jwk = RsaJwkGenerator.generateJwk(2048);
} catch (JoseException e) {
e.printStackTrace();
}
jwk.setKeyId(keyId);
jwk.setAlgorithm(AlgorithmIdentifiers.ECDSA_USING_P256_CURVE_AND_SHA256);
String publicKey = jwk.toJson(RsaJsonWebKey.OutputControlLevel.PUBLIC_ONLY);
String privateKey = jwk.toJson(RsaJsonWebKey.OutputControlLevel.INCLUDE_PRIVATE);
System.out.println("keyId="+keyId);
System.out.println();
System.out.println("公钥 publicKeyStr="+publicKey);
System.out.println();
System.out.println("私钥 privateKeyStr="+privateKey);
}
}
用到的jws jar包, 链接:https://pan.baidu.com/s/19Spp1wBNxFJt6qPvCkg-WA 提取码:96rq
最后,本篇文章只是简单介绍了api网关接口的创建、发布、授权、调试,有些功能操作没有使用,更多参考阿里云官方文档
下篇文章介绍 客户端 访问 api网关接口 demo, 精简 java demo 源码 ,其他语言也可以参考实现。