S3GetStsController.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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_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 django.conf import settings
  17. AWS_ACCESS_KEY_ID = settings.AWS_ACCESS_KEY_ID
  18. AWS_SECRET_ACCESS_KEY = settings.AWS_SECRET_ACCESS_KEY
  19. class S3GetStsView(View):
  20. def get(self, request, *args, **kwargs):
  21. request.encoding = 'utf-8'
  22. request_dict = request.GET
  23. operation = kwargs.get('operation', None)
  24. return self.validate(operation, request_dict, request)
  25. def post(self, request, *args, **kwargs):
  26. request.encoding = 'utf-8'
  27. request_dict = request.POST
  28. operation = kwargs.get('operation', None)
  29. return self.validate(operation, request_dict, request)
  30. def validate(self, operation, request_dict, request):
  31. response = ResponseObject()
  32. if operation == 'ota':
  33. return self.ota(request_dict, response, request)
  34. else:
  35. return response.json(404)
  36. # 授权ota升级s3预签名
  37. def ota(self, request_dict, response, request):
  38. mold = request_dict.get('mold', None) #0国内, 1国外
  39. region_name = request_dict.get('region_name', None)
  40. bucket_name = request_dict.get('bucket_name', None)
  41. endpoint = request_dict.get('endpoint', None)
  42. filepath = request_dict.get('filepath', None)
  43. role_name = request_dict.get('jobname', None)
  44. mold = int(mold)
  45. try:
  46. aws_access_key_id = AWS_ACCESS_KEY_ID[mold]
  47. aws_secret_access_key = AWS_SECRET_ACCESS_KEY[mold]
  48. aws_arn = AWS_ARN[mold]
  49. except:
  50. res = {'code': 404, 'msg': 'mold not exists!'}
  51. return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json,charset=utf-8")
  52. ###############
  53. boto3_sts = boto3.client(
  54. 'sts',
  55. aws_access_key_id=aws_access_key_id,
  56. aws_secret_access_key=aws_secret_access_key,
  57. region_name=region_name
  58. )
  59. Policy = {
  60. "Version": "2012-10-17",
  61. "Statement": [
  62. {
  63. "Effect": "Allow",
  64. "Action": "s3:*",
  65. "Resource": ["{aws_arn}:::{bucket_name}/{filepath}*".
  66. format(aws_arn=aws_arn, bucket_name=bucket_name, filepath=filepath)]
  67. }
  68. ]
  69. }
  70. response = boto3_sts.get_federation_token(
  71. Name='{role_name}'.format(role_name=role_name),
  72. Policy=json.dumps(Policy),
  73. DurationSeconds=7200
  74. )
  75. ##############
  76. res = {
  77. 'AccessKeyId': response['Credentials']['AccessKeyId'],
  78. 'AccessKeySecret': response['Credentials']['SecretAccessKey'],
  79. 'SessionToken': response['Credentials']['SessionToken'],
  80. 'Expiration': response['Credentials']['Expiration'],
  81. 'expire': 900,
  82. 'endpoint': endpoint,
  83. 'bucket_name': bucket_name,
  84. 'arn': response['FederatedUser']['Arn'],
  85. 'region': region_name,
  86. 'bucket_mold': mold
  87. }
  88. return JsonResponse(status=200, data=res)