StsOssController.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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. policys = {
  59. "Version": "1",
  60. "Statement": [
  61. {
  62. "Action": ["oss:PutObject", "oss:DeleteObject", "oss:GetObject",],
  63. # "Action": ["*"],
  64. # "Action": ["*"],
  65. "Resource": [Resource_access],
  66. # "Resource": ["*"],
  67. "Effect": "Allow",
  68. "Condition": {
  69. # "IpAddress": {"acs:SourceIp": ip}
  70. # "IpAddress": {"acs:SourceIp": "120.237.157.184"}
  71. # "IpAddress": {"acs:SourceIp": "*"}
  72. }
  73. },
  74. #######
  75. {
  76. "Effect": "Allow",
  77. "Action": [
  78. "oss:ListObjects"
  79. ],
  80. "Resource": [
  81. "*"
  82. ]
  83. }
  84. ]
  85. }
  86. req.set_Policy(Policy=json.dumps(policys))
  87. body = clt.do_action(req)
  88. # 使用RAM账号的AccessKeyId和AccessKeySecret向STS申请临时token。
  89. token = json.loads(body.decode('utf-8'))
  90. print(token)
  91. res = {
  92. 'AccessKeyId': token['Credentials']['AccessKeyId'],
  93. 'AccessKeySecret': token['Credentials']['AccessKeySecret'],
  94. 'SecurityToken': token['Credentials']['SecurityToken'],
  95. 'Expiration': token['Credentials']['Expiration'],
  96. 'expire': 3600,
  97. 'endpoint': endpoint,
  98. 'bucket_name': bucket_name,
  99. 'arn': token['AssumedRoleUser']['Arn'],
  100. 'code': 0,
  101. 'storage': storage,
  102. }
  103. return response.json(0, res)