python 阿里云oss實(shí)現(xiàn)直傳簽名與回調(diào)驗(yàn)證的示例方法
簽名
import base64 import json import time from datetime import datetime import hmac from hashlib import sha1 access_key_id = '' # 請(qǐng)?zhí)顚懩腁ccessKeySecret。 access_key_secret = '' # host的格式為 bucketname.endpoint ,請(qǐng)?zhí)鎿Q為您的真實(shí)信息。 host = '' # callback_url為 上傳回調(diào)服務(wù)器的URL,請(qǐng)將下面的IP和Port配置為您自己的真實(shí)信息。 callback_url = "" # 用戶上傳文件時(shí)指定的前綴。 upload_dir = 'user-dir-prefix/' expire_time = 1200 expire_syncpoint = int(time.time() + expire_time) policy_dict = { 'expiration': datetime.utcfromtimestamp(expire_syncpoint).isoformat() + 'Z', 'conditions': [ {"bucket": "test-paige"}, ['starts-with', '$key', 'user/test/'] ] } policy = json.dumps(policy_dict).strip() policy_encode = base64.b64encode(policy.encode()) signature = base64.encodebytes(hmac.new(access_key_secret.encode(), policy_encode, sha1).digest()) callback_dict = { 'callbackUrl': callback_url, 'callbackBody': 'filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${' 'imageInfo.width}', 'callbackBodyType': 'application/json' } callback = base64.b64encode(json.dumps(callback_dict).strip().encode()).decode() var = { 'accessid': access_key_id, 'host': host, 'policy': policy_encode.decode(), 'signature': signature.decode().strip(), 'expire': expire_syncpoint, 'callback': callback }
回調(diào)驗(yàn)簽
import asyncio import base64 import time import aiomysql import rsa from aiohttp import web, ClientSession from urllib import parse import uuid def success(msg='', data=None): if data is None: data = {} dict_data = { 'code': 1, 'msg': msg, 'data': data } return web.json_response(dict_data) def failed(msg='', data=None): if data is None: data = {} dict_data = { 'code': 0, 'msg': msg, 'data': data } return web.json_response(dict_data) async def handle(request): """ 獲取連接池 :param web.BaseRequest request: :return: """ authorization_base64 = request.headers['authorization'] x_oss_pub_key_url_base64 = request.headers['x-oss-pub-key-url'] pub_key_url = base64.b64decode(x_oss_pub_key_url_base64.encode()) authorization = base64.b64decode(authorization_base64.encode()) path = request.path async with ClientSession() as session: async with session.get(pub_key_url.decode()) as resp: pub_key_body = await resp.text() pubkey = rsa.PublicKey.load_pkcs1_openssl_pem(pub_key_body.encode()) body = await request.content.read() auth_str = parse.unquote(path) + '\n' + body.decode() parse_url = parse.parse_qs(body.decode()) print(parse_url) try: rsa.verify(auth_str.encode(), authorization, pubkey) pool = request.app['mysql_pool'] async with pool.acquire() as conn: async with conn.cursor() as cur: id = str(uuid.uuid4()) url = parse_url['filename'][0] mime = parse_url['mimeType'][0] disk = 'oss' time_at = time.strftime("%Y-%m-%d %H:%I:%S", time.localtime()) sql = "INSERT INTO media(id,url,mime,disk,created_at,updated_at) VALUES(%s,%s,%s,%s,%s,%s)" await cur.execute(sql, (id, url, mime, disk, time_at, time_at)) await conn.commit() dict_data = { 'id': id, 'url': url, 'cdn_url': 'https://cdn.***.net' + '/' + url, 'mime': mime, 'disk': disk, 'created_at': time_at, 'updated_at': time_at, } return success(data=dict_data) except rsa.pkcs1.VerificationError: return failed(msg='驗(yàn)證錯(cuò)誤') async def init(loop): # 創(chuàng)建連接池 mysql_pool = await aiomysql.create_pool(host='127.0.0.1', port=3306, user='', password='', db='', loop=loop) async def on_shutdown(application): """ 接收到關(guān)閉信號(hào)時(shí),要先關(guān)閉連接池,并等待連接池關(guān)閉成功. :param web.Application application: :return: """ application['mysql_pool'].close() # 沒(méi)有下面這句話會(huì)報(bào)錯(cuò) RuntimeError: Event loop is closed ,因?yàn)檫B接池沒(méi)有真正關(guān)關(guān)閉程序就關(guān)閉了,引發(fā)python的報(bào)錯(cuò) await application['mysql_pool'].wait_closed() application = web.Application() application.on_shutdown.append(on_shutdown) # 把連接池放到 application 實(shí)例中 application['mysql_pool'] = mysql_pool application.add_routes([web.get('/', handle), web.post('/oss', handle)]) return application if __name__ == '__main__': loop = asyncio.get_event_loop() application = loop.run_until_complete(init(loop)) web.run_app(application, host='127.0.0.1') loop.close()
到此這篇關(guān)于python 阿里云oss實(shí)現(xiàn)直傳簽名與回調(diào)驗(yàn)證的文章就介紹到這了,更多相關(guān)python 直傳簽名與回調(diào)驗(yàn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python通過(guò)win32 COM打開Excel并添加Sheet的方法
今天小編就為大家分享一篇使用Python通過(guò)win32 COM打開Excel并添加Sheet的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Python中如何實(shí)現(xiàn)真正的按位取反運(yùn)算
按位取反是位運(yùn)算符,而位運(yùn)算符是應(yīng)用在兩個(gè)數(shù)的運(yùn)算上,會(huì)對(duì)數(shù)字的二進(jìn)制所有位數(shù)進(jìn)行從低到高的運(yùn)算,下面這篇文章主要給大家介紹了關(guān)于Python中如何實(shí)現(xiàn)真正的按位取反運(yùn)算的相關(guān)資料,需要的朋友可以參考下2023-02-02利用4行Python代碼監(jiān)測(cè)每一行程序的運(yùn)行時(shí)間和空間消耗
這篇文章主要介紹了如何使用4行Python代碼監(jiān)測(cè)每一行程序的運(yùn)行時(shí)間和空間消耗,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04Python實(shí)現(xiàn)圖像增強(qiáng)
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)圖像增強(qiáng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08PyQt4實(shí)時(shí)顯示文本內(nèi)容GUI的示例
今天小編就為大家分享一篇PyQt4實(shí)時(shí)顯示文本內(nèi)容GUI的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06