进入IAM控制台后点击角色,找到上面创建身份池时命名的两个角色名。
点击给经过验证的auth_xx的这个角色,点击附加策略。
测试可以点击附加策略后选择AWSIoTFullAccess全部权限,也可以点击创建内联策略自定义一个,json格式串可以网上搜,自定义主要可以缩小一些权限范围,后面再讲权限策略设置。
至此可以简单理解下:一个用户下载了APP,刚使用时是一个游客,当用户使用了Amazon账户联合登录或者服务器端对他进行了验证合法后用户就获得了auth_xx这个角色的权限,就能和IOT互动了。
3)创建IOT Policy
为什么还需要创建Iot Policy呢,因为官方文档里介绍这种接入AWS IOT的方式是由IAM角色的权限策略和这个identity身份上的权限策略组合而定的,至于两者的权限是如何合并界定参考官方,我也没细致研究。(题外话:如果给unauth_xx身份直接赋予了AWSIoTFullAccess权限是后不用附加IOT策略也是可以连接IOT平台的)
点击安全性->策略,创建一个新策略,内容也可以先设置全部权限,稍后和上面IAM一样再进行细分。
三 、编码
下面介绍以Login with Amzon为身份提供商接入AWS IOT
已准备好的工作:
1>创建了一个身份池,关联定义了两个IAM角色,一个是未经过认证的角色,权限默认不需要更改,另一个是经过认证的角色,附加上了AWSIoTFullAccess权限。该身份提供商Amazon的ID已填写。
2>Iot的后台创建了一个策略,策略先定义的全部权限(参照上图)
3>注意区域选择一致
Android App中接入Login with Amazon不做详解,网上资料齐全没什么难度。
在oncreat方法里先初始化Cognito认证构造方法
credentialsProvider = new CognitoCachingCredentialsProvider(
getApplicationContext(), // Context
"XXXXXXXXXXXX", //Cognito控值台创建的身份池ID
Regions.US\_EAST\_1 // 身份池所属区域
);
题外话:如果是使用的自定义身份验证的方式,就不能使用这个构造方法了,要使用下面这个
DeveloperAuthenticationProvider developerProvider = new DeveloperAuthenticationProvider
(null, Cognito\_Pool\_ID, Regions.US\_EAST\_1,baseApplication);
credentialsProvider = new CognitoCachingCredentialsProvider( context, developerProvider, Regions.US\_EAST\_1 );
developerProvider是需要自己实现的一个方法,继承自AWSAbstractCognitoDeveloperIdentityProvider
public class DeveloperAuthenticationProvider extends AWSAbstractCognitoDeveloperIdentityProvider {
private static final String developerProvider = "xxxxxx";//这是自定义的身份提供商名
private BaseApplication baseApplication;
//构造方法
public DeveloperAuthenticationProvider(String accountId, String identityPoolId, Regions region, BaseApplication baseApplication) {
super(accountId, identityPoolId, region);
this.baseApplication = baseApplication;
}
.............
这个自定义类中主要是要实现refresh方法
@Override
public String refresh() {
String result = "";
String getIdenttid = "";
String token="";
try {
//这里要调用后台服务器方法来获取权限,这里就简单传了存在sp中的用户ID到后台服务器
String appToken = (String)baseApplication.get("token","");
result = AcceletNetWork.synGet(HttpUrls.GetCognitoToken+"&appToken="+appToken);//这里采用的是同步
Gson gson = new Gson();
TokenDataBean dataBean = gson.fromJson(result, TokenDataBean.class);
getIdenttid = dataBean.getIdenti