StsOssController.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import json
  2. from aliyunsdkcore import client
  3. from aliyunsdksts.request.v20150401 import AssumeRoleRequest
  4. from django.views.generic import View
  5. from Ansjer.config import OSS_ROLE_ARN
  6. from Object.ResponseObject import ResponseObject
  7. from Object.TokenObject import TokenObject
  8. from django.conf import settings
  9. OSS_STS_ACCESS_KEY = settings.OSS_STS_ACCESS_KEY
  10. OSS_STS_ACCESS_SECRET = settings.OSS_STS_ACCESS_SECRET
  11. class StsOssView(View):
  12. def get(self, request, *args, **kwargs):
  13. request.encoding = 'utf-8'
  14. operation = kwargs.get('operation')
  15. return self.validation(request.GET, operation)
  16. def post(self, request, *args, **kwargs):
  17. request.encoding = 'utf-8'
  18. operation = kwargs.get('operation')
  19. return self.validation(request.POST, operation)
  20. def validation(self, request_dict, operation):
  21. response = ResponseObject()
  22. # var_dump(request_dict)
  23. token = request_dict.get('token', None)
  24. if operation == 'uidPreview':
  25. tko = TokenObject(token)
  26. if tko.code == 0:
  27. userID = tko.userID
  28. return self.uid_preview(userID, response)
  29. else:
  30. return response.json(tko.code)
  31. else:
  32. return response.json(444)
  33. def uid_preview(self, userID, response):
  34. storage = '{userID}/uid_preview/'.format(userID=userID)
  35. bucket_name = 'apg'
  36. endpoint = 'oss-cn-shenzhen.aliyuncs.com'
  37. region_id = 'cn-shenzhen'
  38. clt = client.AcsClient(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, region_id)
  39. req = AssumeRoleRequest.AssumeRoleRequest()
  40. req.set_accept_format('json')
  41. req.set_RoleArn(OSS_ROLE_ARN)
  42. req.set_RoleSessionName(userID)
  43. req.set_DurationSeconds(3600)
  44. Resource_access = "acs:oss:*:*:{bucket_name}/{userID}*". \
  45. format(bucket_name=bucket_name, userID=userID)
  46. policys = {
  47. "Version": "1",
  48. "Statement": [
  49. {
  50. "Action": ["oss:PutObject", "oss:DeleteObject", "oss:GetObject", ],
  51. # "Action": ["*"],
  52. # "Action": ["*"],
  53. "Resource": [Resource_access],
  54. # "Resource": ["*"],
  55. "Effect": "Allow",
  56. "Condition": {
  57. # "IpAddress": {"acs:SourceIp": ip}
  58. # "IpAddress": {"acs:SourceIp": "120.237.157.184"}
  59. # "IpAddress": {"acs:SourceIp": "*"}
  60. }
  61. },
  62. #######
  63. {
  64. "Effect": "Allow",
  65. "Action": [
  66. "oss:ListObjects"
  67. ],
  68. "Resource": [
  69. "*"
  70. ]
  71. }
  72. ]
  73. }
  74. req.set_Policy(Policy=json.dumps(policys))
  75. body = clt.do_action(req)
  76. # 使用RAM账号的AccessKeyId和AccessKeySecret向STS申请临时token。
  77. token = json.loads(body.decode('utf-8'))
  78. print(token)
  79. res = {
  80. 'AccessKeyId': token['Credentials']['AccessKeyId'],
  81. 'AccessKeySecret': token['Credentials']['AccessKeySecret'],
  82. 'SecurityToken': token['Credentials']['SecurityToken'],
  83. 'Expiration': token['Credentials']['Expiration'],
  84. 'expire': 3600,
  85. 'endpoint': endpoint,
  86. 'bucket_name': bucket_name,
  87. 'arn': token['AssumedRoleUser']['Arn'],
  88. 'code': 0,
  89. 'storage': storage,
  90. }
  91. return response.json(0, res)