StsOssController.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. @Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
  5. @AUTHOR: ASJRD018
  6. @NAME: AnsjerFormal
  7. @software: PyCharm
  8. @DATE: 2019/5/10 8:43
  9. @Version: python3.6
  10. @MODIFY DECORD:ansjer dev
  11. @file: StsOssController.py
  12. @Contact: chanjunkai@163.com
  13. """
  14. from django.views.generic import View
  15. from Object.ResponseObject import ResponseObject
  16. from Object.TokenObject import TokenObject
  17. from Ansjer.config import OSS_STS_ACCESS_SECRET, OSS_STS_ACCESS_KEY, OSS_ROLE_ARN
  18. from aliyunsdkcore import client
  19. from aliyunsdksts.request.v20150401 import AssumeRoleRequest
  20. import json
  21. from var_dump import var_dump
  22. class StsOssView(View):
  23. def get(self, request, *args, **kwargs):
  24. request.encoding = 'utf-8'
  25. operation = kwargs.get('operation')
  26. return self.validation(request.GET,operation)
  27. def post(self, request, *args, **kwargs):
  28. request.encoding = 'utf-8'
  29. operation = kwargs.get('operation')
  30. return self.validation(request.POST,operation)
  31. def validation(self, request_dict, operation):
  32. response = ResponseObject()
  33. from var_dump import var_dump
  34. # var_dump(request_dict)
  35. token = request_dict.get('token', None)
  36. if operation == 'uidPreview':
  37. tko = TokenObject(token)
  38. if tko.code == 0:
  39. userID = tko.userID
  40. return self.uid_preview(userID,response)
  41. else:
  42. return response.json(tko.code)
  43. else:
  44. return response.json(444)
  45. def uid_preview(self, userID,response):
  46. storage = '{userID}/uid_preview/'.format(userID=userID)
  47. bucket_name = 'apg'
  48. endpoint = 'oss-cn-shenzhen.aliyuncs.com'
  49. region_id = 'cn-shenzhen'
  50. clt = client.AcsClient(OSS_STS_ACCESS_KEY,OSS_STS_ACCESS_SECRET,region_id)
  51. req = AssumeRoleRequest.AssumeRoleRequest()
  52. req.set_accept_format('json')
  53. req.set_RoleArn(OSS_ROLE_ARN)
  54. req.set_RoleSessionName(userID)
  55. req.set_DurationSeconds(3600)
  56. Resource_access = "acs:oss:*:*:{bucket_name}/{userID}*".format(bucket_name=bucket_name,
  57. userID=userID)
  58. Resource_access_root = "acs:oss:*:*:{bucket_name}".format(bucket_name=bucket_name)
  59. # Resource_access_root = "acs:oss:*:*:{bucket_name}".format(bucket_name=bucket_name)
  60. print(Resource_access)
  61. policys = {
  62. "Version": "1",
  63. "Statement": [
  64. {
  65. "Action": ["oss:PutObject", "oss:DeleteObject", "oss:GetObject"],
  66. # "Action": ["*"],
  67. "Resource": [Resource_access],
  68. # "Resource": ["*"],
  69. "Effect": "Allow",
  70. "Condition": {
  71. # "IpAddress": {"acs:SourceIp": ip}
  72. # "IpAddress": {"acs:SourceIp": "120.237.157.184"}
  73. # "IpAddress": {"acs:SourceIp": "*"}
  74. }
  75. },
  76. #######
  77. {
  78. "Effect": "Allow",
  79. "Action": [
  80. "oss:ListObjects"
  81. ],
  82. "Resource": [
  83. "acs:oss:*:*:{userID}".format(userID=userID)
  84. ],
  85. "Condition": {
  86. "StringLike": {
  87. "oss:Prefix": [
  88. ""
  89. ]
  90. },
  91. "StringEquals": {
  92. "oss:Delimiter": "/"
  93. }
  94. }
  95. }
  96. ]
  97. }
  98. req.set_Policy(Policy=json.dumps(policys))
  99. body = clt.do_action(req)
  100. # 使用RAM账号的AccessKeyId和AccessKeySecret向STS申请临时token。
  101. token = json.loads(body.decode('utf-8'))
  102. print(token)
  103. res = {
  104. 'AccessKeyId': token['Credentials']['AccessKeyId'],
  105. 'AccessKeySecret': token['Credentials']['AccessKeySecret'],
  106. 'SecurityToken': token['Credentials']['SecurityToken'],
  107. 'Expiration': token['Credentials']['Expiration'],
  108. 'expire': 3600,
  109. 'endpoint': endpoint,
  110. 'bucket_name': bucket_name,
  111. 'arn': token['AssumedRoleUser']['Arn'],
  112. 'code': 0,
  113. 'storage': storage,
  114. }
  115. return response.json(0,res)