对于一些用户来说,可能需要在网页,app等客户端可以操作阿里云资源,如上传文件到oss,但是用户又不想把自己的AK暴露出来,在本文中,实现用户不需要自己直接使用自己的AK来实现文件上传到oss的例子
主要步骤如下:
1,用户创建一个函数 get_sts,该函数如下:
# -*- coding: utf-8 -*-
def handler(event, context):
response = {
'isBase64Encoded': False,
'statusCode': 200,
'headers': {
"x-custom-header" : "header value"
},
'body': {
"access_key_id":context.credentials.access_key_id ,
"access_key_secret": context.credentials.access_key_secret,
"security_token" : context.credentials.security_token
}
}
return response
注意:要想获取context中credentials信息,需要配置函数所在的service的服务角色,在本例中, 配置的服务角色是一个具有操作oss读写权限的角色, 这样context.credentials有能操作oss的临时token信息
本文的配置如下:
如何给service配置服务角色,可以参考https://help.aliyun.com/document_detail/60984.html?spm=5176.doc61023.6.558.RkgmAR
2, 以函数计算作为 API 网关后端服务
2.1,具体的教程可以参考:https://help.aliyun.com/document_detail/54788.html?spm=5176.doc29497.6.584.8ykpic
2.2,本教程最后配置如下:
2.3,将api发布以后,可以使用curl来测试下:
3, 使用函数计算返回的临时token对oss进行操作
# coding=utf-8
import oss2
import requests
def put_object_to_oss():
# use your api
r = requests.get("http://05248dd6f0c14c7ebaa723f18c17b7d4-cn-shanghai.alicloudapi.com/getSts")
if r.status_code!=200:
return
sts_creds = r.json()
auth = oss2.StsAuth(sts_creds['access_key_id'], sts_creds['access_key_secret'], sts_creds['security_token'])
endpoint = "oss-cn-shanghai.aliyuncs.com" # your endpoint
bucket = "ls-oss-test" # your bucket
bucket = oss2.Bucket(auth, endpoint, bucket)
bucket.put_object("apigateway.txt", "api gate way uploaddata")
remote_stream = bucket.get_object('apigateway.txt')
return remote_stream.read()
print put_object_to_oss()
补充
现在函数计算提供了http trigger,也可以直接使用http trigger 达到上面的效果,http trigger的用法可以参考:HTTP Trigger