StsOssController.py 3.5 KB

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