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. try:
  43. aws_access_key_id = AWS_ACCESS_KEY_ID[mold]
  44. aws_secret_access_key = AWS_SECRET_ACCESS_KEY[mold]
  45. aws_arn = AWS_ARN[mold]
  46. except:
  47. res = {'code': 404, 'msg': 'mold not exists!'}
  48. return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
  49. ###############
  50. boto3_sts = boto3.client(
  51. 'sts',
  52. aws_access_key_id=aws_access_key_id,
  53. aws_secret_access_key=aws_secret_access_key,
  54. region_name=region_name
  55. )
  56. Policy = {
  57. "Version": "2012-10-17",
  58. "Statement": [
  59. {
  60. "Effect": "Allow",
  61. "Action": "s3:*",
  62. "Resource": ["{aws_arn}:::{bucket_name}/{filepath}*".
  63. format(aws_arn=aws_arn, bucket_name=bucket_name, filepath=filepath)]
  64. }
  65. ]
  66. }
  67. response = boto3_sts.get_federation_token(
  68. Name='{role_name}'.format(role_name=role_name),
  69. Policy=json.dumps(Policy),
  70. DurationSeconds=7200
  71. )
  72. ##############
  73. res = {
  74. 'AccessKeyId': response['Credentials']['AccessKeyId'],
  75. 'AccessKeySecret': response['Credentials']['SecretAccessKey'],
  76. 'SessionToken': response['Credentials']['SessionToken'],
  77. 'Expiration': response['Credentials']['Expiration'],
  78. 'expire': 900,
  79. 'endpoint': endpoint,
  80. 'bucket_name': bucket_name,
  81. 'arn': response['FederatedUser']['Arn'],
  82. 'region': region_name,
  83. 'bucket_mold': mold
  84. }
  85. return JsonResponse(status=200, data=res)