S3GetStsController.py 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import hashlib
  4. import json
  5. import time
  6. import uuid
  7. import boto3
  8. from django.http import HttpResponse, JsonResponse
  9. from django.views import View
  10. from Ansjer.config import AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_ARN
  11. from Controller.DeviceConfirmRegion import Device_Region
  12. from Model.models import Device_User, Device_Info, iotdeviceInfoModel, UIDCompanySerialModel, \
  13. SerialNumberModel
  14. from Object.IOTCore.IotObject import IOTClient
  15. from Object.ResponseObject import ResponseObject
  16. from Service.CommonService import CommonService
  17. class S3GetStsView(View):
  18. def get(self, request, *args, **kwargs):
  19. request.encoding = 'utf-8'
  20. request_dict = request.GET
  21. operation = kwargs.get('operation', None)
  22. return self.validate(operation, request_dict, request)
  23. def post(self, request, *args, **kwargs):
  24. request.encoding = 'utf-8'
  25. request_dict = request.POST
  26. operation = kwargs.get('operation', None)
  27. return self.validate(operation, request_dict, request)
  28. def validate(self, operation, request_dict, request):
  29. response = ResponseObject()
  30. if operation == 'ota':
  31. return self.ota(request_dict, response, request)
  32. else:
  33. return response.json(404)
  34. # 授权ota升级s3预签名
  35. def ota(self, request_dict, response, request):
  36. mold = request_dict.get('mold', None) #0国内, 1国外
  37. region_name = request_dict.get('region_name', None)
  38. bucket_name = request_dict.get('bucket_name', None)
  39. endpoint = request_dict.get('endpoint', None)
  40. filepath = request_dict.get('filepath', None)
  41. role_name = request_dict.get('jobname', None)
  42. mold = int(mold)
  43. try:
  44. aws_access_key_id = AWS_ACCESS_KEY_ID[mold]
  45. aws_secret_access_key = AWS_SECRET_ACCESS_KEY[mold]
  46. aws_arn = AWS_ARN[mold]
  47. except:
  48. res = {'code': 404, 'msg': 'mold not exists!'}
  49. return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
  50. ###############
  51. boto3_sts = boto3.client(
  52. 'sts',
  53. aws_access_key_id=aws_access_key_id,
  54. aws_secret_access_key=aws_secret_access_key,
  55. region_name=region_name
  56. )
  57. Policy = {
  58. "Version": "2012-10-17",
  59. "Statement": [
  60. {
  61. "Effect": "Allow",
  62. "Action": "s3:*",
  63. "Resource": ["{aws_arn}:::{bucket_name}/{filepath}*".
  64. format(aws_arn=aws_arn, bucket_name=bucket_name, filepath=filepath)]
  65. }
  66. ]
  67. }
  68. response = boto3_sts.get_federation_token(
  69. Name='{role_name}'.format(role_name=role_name),
  70. Policy=json.dumps(Policy),
  71. DurationSeconds=7200
  72. )
  73. ##############
  74. res = {
  75. 'AccessKeyId': response['Credentials']['AccessKeyId'],
  76. 'AccessKeySecret': response['Credentials']['SecretAccessKey'],
  77. 'SessionToken': response['Credentials']['SessionToken'],
  78. 'Expiration': response['Credentials']['Expiration'],
  79. 'expire': 900,
  80. 'endpoint': endpoint,
  81. 'bucket_name': bucket_name,
  82. 'arn': response['FederatedUser']['Arn'],
  83. 'region': region_name,
  84. 'bucket_mold': mold
  85. }
  86. return JsonResponse(status=200, data=res)