SORACOM Enterprise Button의 간이 위치 정보를 이용해 지역 밖에서의 누락 실수를 방지(CloudFunctions/Python판)

TL; DR (정리)


  • SORACOM Enterprise Button의 간단한 위치 정보를 사용하여 한 지역에서만 작동하는 버튼을 만들었습니다.
  • 2019/7/2 SORACOM Discovery에서 새로 발표 된 SORACOM Funk를 사용하여 GCP의 CloudFunctions를 실행했습니다.
  • "지역 외부"가 CloudFunctions 측에서 결정되었으므로 버튼 작동 횟수는 평소와 같이 소비됩니다

  • 장비



    SORACOM Enterprise Button (초기 버튼 등록이 완료된 것으로 합니다)

    주로 사용한 것



    SORACOM Funk
    CloudFunctions(GCP)
    pyjwt (JWT (Json Web Token) Python 버전 라이브러리)

    구축 내용



    SORACOM Enterprise Button을 누를 때 SORACOM Funk를 통해 CloudFunctions를 시작합니다.
    CloudFunctions에서 위치 정보를 가져옵니다. (이 때 jwt 사용)
    지역외이면 동작, 그렇지 않으면 동작하지 않게 합니다.
    판단할 로직 부분만 기사로 합니다.

    구축 절차



    CloudFunctions 설정



    나중에 SORACOM 콘솔에서 시작 함수를 지정하기 위해 먼저 CloudFunctions를 설명합니다.
    CloudFunctions 화면에서 함수 만들기를 선택하고 다음과 같이 입력합니다. 여기서 ★ 부분의 URL은 SORACOM Funk 설정에서 사용하기 위해 취득해 둡니다.
    함수의 이름은 뭐든지 좋지만, enterprise_button 그리고라도 해 둡시다.
    기본 Node.js도 좋지만 Python에서도 설명 할 수 있으므로 Python을 선택했습니다.



    계속 requirements.txt 편집입니다.
    pyjwt를 사용하기 위해 requirements.txt 에 이하 기재를 합시다. (여기에 기재한 내용이 pip install되는 이미지입니다)

    CloudFunctions(requirements.txt)
    pyjwt
    

    다음은 실행 함수입니다. 기본 시작 함수 이름이 hello_world에서 exec_button로 변경되었으므로,
    실행 함수 이름과 환경 변수 설정이 필요합니다.

    SORACOM 설명 그럼, http 헤더에 x-soracom-token 가 있어, 그것을 JWT로 디코드할 수 있다고 하는 것.
    그래서 이렇게 됩니다.

    CloudFunctions(main.py)
    import jwt
    import os
    
    def exec_button(request):
        if 'x-soracom-token' not in request.headers:
            return 'Not from soracom button.'
    
        # Decode jwt token. (algorithm : RS256)
        data = jwt.decode(request.headers.get("x-soracom-token"), verify=False)
        if not is_inside_area(data['ctx']['location']):
            return 'Out of area.'
    
        # Write your code here.
        return 'Inside area.'
    
    def is_inside_area(position):
        northwest = {'lat': float(os.environ.get('northwest_lat', 1.0001)), 'lon': float(os.environ.get('northwest_lon', 178.0001))}
        southeast = {'lat': float(os.environ.get('southeast_lat', 0.0001)), 'lon': float(os.environ.get('southeast_lon', 179.0001))}
        if 'lat' not in position or not(isinstance(position['lat'], float)):
            return False
        if not(southeast['lat'] <= position['lat'] and position['lat'] <= northwest['lat']):
            return False
        if not(northwest['lon'] <= position['lon'] and position['lon'] <= southeast['lon']):
            return False
        return True
    

    보충: is_inside_area 함수는, 취득한 간이 위치 정보(위도 경도)가 그 영역에 포함되어 있는지 어떤지를 판단하고 있습니다.
    この枠内にあるか?を判断している
    northwest - - - - -
    -                 -
    -                 -
    -                 -
    - - - - - southeast
    

    실행 함수 이름을 exec_button로 지정합니다.
    고급 설정이 필요하므로 그 아래의 Environment variables, networking, timeouts and more를 클릭하십시오.



    환경 변수만 다음과 같이 지정합니다. (그 외는 디폴트로 OK)
    배포해 둡시다. (함수를 처음으로 작성하는 경우는 「작성」입니다)



    이것으로 CloudFunctions 설정이 완료됩니다.

    SORACOM Enterprise Button 설정



    SORACOM 콘솔에서 Funk 및 위치 정보 활성화를 구성합니다.
    해당 Enterprise Button이 속한 SIM 그룹의 설정 페이지를 엽니다. (나는 enterprisebutton이라는 그룹 이름)
    설정하는 부분은 빨간색 테두리로 둘러싸인 두 부분입니다.



    그럼 순서대로 설정합시다.
    SORACOM Air for Cellular 설정 : 위치 정보 검색을 활성화합니다. 또한 바이너리 파서로 @button를 설정합니다.



    SORACOM Funk 설정 : Funk에서 CloudFunctions를 실행합니다. ★로 취득한 함수의 엔드포인트를 기재합니다.



    이것으로 위치 정보를 취득할 수 있었을 경우에, 지역외를 판정할 수가 있습니다.
    이것에 의해 지역외에서 잘못 눌러 버렸을 때에 동작을 시키지 않는다, 라고 할 수 있네요.
    도움이되면 다행입니다.

    좋은 웹페이지 즐겨찾기