5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

未成年なのでGooglePlayにアプリを出せないからAWSで自分のサイトからダウンロードできるようにする

Last updated at Posted at 2023-10-31

悲しいことに未成年はアプリのリリースができない

悲しいことにGooglePlayは18歳、AppleStoreは20歳じゃないとアプリが出せません。
自分は普段UnrealEngineでアプリを開発しているのですがリリースできないのは悲しいです。
そこでAndroidでは野良アプリのダウンロードができるため、自分のwebサイト(AWS)でapkを配布することにしますた。

見よう見まねでAWSは構築しているためセキュリティなどで不備がある場合は優しく教えて頂けると幸いです。

S3+Lambda+API Gateway +reCAPTCHAで実装する

reCAPTCHAをweb側に搭載し、API Gatewayを通じてAWS Lambdaで認証をしS3の署名付きurl(時間制限付き)を生成し、クライアント側に返す形です。クライアント側からはobject key(apkファイル)を指定します。
以下がガバガバ構成図です(厳密には多分違う)

Desktop Screenshot 2023.11.01 - 00.41.26.54.png

サーバー側のコード

AWS Lambda.py

import json
import urllib
import boto3
import os

def lambda_handler(event, context):
    recaptcha_secret = os.environ['RECAPTCHA_SECRET']
    bucket_name = os.environ['bucket_name']
    
    body = json.loads(event['body'])
    response = body['g-recaptcha-response']
    object_key = body['object_key']

    url = "https://www.google.com/recaptcha/api/siteverify"
    values = {
        'secret': recaptcha_secret,
        'response': response
    }

    data = urllib.parse.urlencode(values).encode()
    req = urllib.request.Request(url, data)
    response = urllib.request.urlopen(req)
    result = json.load(response)

    common_headers = {
        'Access-Control-Allow-Origin': 'https://aoharu.works',
        'Access-Control-Allow-Methods': 'POST',
        'Access-Control-Allow-Headers': 'Content-Type'
    }

    if result['success']:
        s3_client = boto3.client('s3')
        url_expiration_seconds = 4
        signed_url = s3_client.generate_presigned_url('get_object',
                                                      Params={'Bucket': bucket_name, 'Key': object_key},
                                                      ExpiresIn=url_expiration_seconds)

        return {
            'statusCode': 200,
            'headers': common_headers,
            'body': json.dumps({'message': 'Success', 'link': signed_url})
        }
    else:
        return {
            'statusCode': 400,
            'headers': common_headers,
            'body': json.dumps({'message': 'reCAPTCHA validation failed'})
        }

多分本当はobject keyにバリデーションを付けるべきなんだと思います

最後に

何かご指摘があれば優しく教えて頂けると嬉しいです

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?