使用STS临时访问凭证访问OSS

使用STS临时访问凭证访问OSS,第1张

使用STS临时访问凭证访问OSS

假设您是一个移动App开发者,希望使用阿里云OSS服务来保存App的终端用户数据,并且要保证每个App用户之间的数据隔离。此时,您可以使用STS授权用户直接访问OSS。

阿里云OSS官网文档地址:使用STS临时访问凭证访问OSS - 对象存储 OSS - 阿里云

目录

一、DEMO项目文件截图

二、DEMO项目代码片段 

三、 访问接口运行结果 

 

  1. App用户登录。App用户和云账号无关,它是App的终端用户,App服务器支持App用户登录。对于每个有效的App用户来说,需要App服务器能定义出每个App用户的最小访问权限。
  2. App服务器请求STS服务获取一个安全令牌(SecurityToken)。在调用STS之前,App服务器需要确定App用户的最小访问权限(用RAM Policy来自定义授权策略)以及凭证的过期时间。然后通过扮演角色(AssumeRole)来获取一个代表角色身份的安全令牌(SecurityToken)。
  3. STS返回给App服务器一个临时访问凭证,包括一个安全令牌(SecurityToken)、临时访问密钥(AccessKeyId和AccessKeySecret)以及过期时间。
  4. App服务器将临时访问凭证返回给App客户端,App客户端可以缓存这个凭证。当凭证失效时,App客户端需要向App服务器申请新的临时访问凭证。例如,临时访问凭证有效期为1小时,那么App客户端可以每30分钟向App服务器请求更新临时访问凭证。
  5. App客户端使用本地缓存的临时访问凭证去请求OSS API。OSS收到访问请求后,会通过STS服务来验证访问凭证,正确响应用户请求。
     
一、DEMO项目文件截图

二、DEMO项目代码片段 

application.properties

#阿里云访问控制RAM子账户信息,需要登录阿里云控制台查看(Secret只在创建时可查看,需要做好备份)
aliyun.oss.accessKeyId=LTAI5tRzx6VDpPA28wG6XHpb
aliyun.oss.accessKeySecret=KqfbKGA48OiU8vrs6Ruwe9HzcLMbHq
#角色ID,在角色中进行授权,获取相应的权限
aliyun.sts.roleArn=acs:ram::1481594054055183:role/ramosstest
#指临时凭证的名称,一般来说建议使用不同的应用程序用户来区分。自定义(可不设置)
aliyun.sts.roleSessionName=RamOssTest

pom.xml

        
            org.projectlombok
            lombok
            true
        
        
        
            com.aliyun
            aliyun-java-sdk-sts
            3.0.0
        
        
            com.aliyun
            aliyun-java-sdk-core
            3.5.0
        
        

 StsTokenVO.java

package com.csdn.vo;

import lombok.Data;

import java.io.Serializable;


@Data
public class StsTokenVO implements Serializable {
    
    private String accessKeyId;
    
    private String accessKeySecret;
    
    private String securityToken;
}

 StsTokenService.java

package com.csdn.service;

import com.csdn.vo.StsTokenVO;

public interface StsTokenService {
    
    StsTokenVO getStsToken();
}

 StsTokenServiceImpl.java

package com.csdn.service;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.aliyuncs.sts.model.v20150401.AssumeRoleRequest;
import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse;
import com.csdn.vo.StsTokenVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Service
public class StsTokenServiceImpl implements StsTokenService {
    private static final Logger LOGGER = LoggerFactory.getLogger(StsTokenServiceImpl.class);
    @Value("${aliyun.oss.accessKeyId}")
    private String accessKeyId;
    @Value("${aliyun.oss.accessKeySecret}")
    private String accessKeySecret;
    @Value("${aliyun.sts.roleArn}")
    private String roleArn;
    @Value("${aliyun.sts.roleSessionName}")
    private String roleSessionName;
    
    private static final Long durationSeconds = 300L;
    private static final String ENDPOINT = "sts.aliyuncs.com";

    
    @Override
    public StsTokenVO getStsToken() {
        StsTokenVO tokenVO = new StsTokenVO();
        try {
            // 添加endpoint(直接使用STS endpoint,前两个参数留空,无需添加region ID)
            DefaultProfile.addEndpoint("", "", "Sts", ENDPOINT);
            // 构造default profile(参数留空,无需添加region ID)
            IClientProfile profile = DefaultProfile.getProfile("", accessKeyId, accessKeySecret);
            // 用profile构造client
            DefaultAcsClient client = new DefaultAcsClient(profile);
            final AssumeRoleRequest request = new AssumeRoleRequest()
            request.setMethod(MethodType.POST);
            request.setRoleArn(roleArn);
            request.setRoleSessionName(roleSessionName);
            // request.setDurationSeconds(durationSeconds);
            // 针对该临时权限可以根据该属性赋予规则,格式为json,没有特殊要求,默认为空
            // request.setPolicy(policy); // Optional
            final AssumeRoleResponse response = client.getAcsResponse(request);
            AssumeRoleResponse.Credentials credentials = response.getCredentials();
            tokenVO.setAccessKeyId(credentials.getAccessKeyId());
            tokenVO.setAccessKeySecret(credentials.getAccessKeySecret());
            tokenVO.setSecurityToken(credentials.getSecurityToken());
            return tokenVO;
        } catch (ClientException e) {
            LOGGER.error("获取阿里云STS临时授权权限失败,错误信息:" + e);
            return null;
        }
    }
}

 StsTokenController.java

package com.csdn.controller;

import com.csdn.service.StsTokenService;
import com.csdn.vo.StsTokenVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class StsTokenController {

    @Autowired
    private StsTokenService stsTokenService;

    @GetMapping("/oss/token")
    public StsTokenVO getToken() {
        return stsTokenService.getStsToken();
    }

}
三、 访问接口运行结果

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5708196.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存