액션 메뉴 항목 보안 유지

Shotgun에서는 AMI(액션 메뉴 항목)를 만들어 사이트에서 커스터마이즈된 액션을 허용할 수 있습니다. AMI는 사이트 전체에서 또는 엔티티별로 사용할 수 있습니다.

AMI의 보안을 유지하려면 Secret Token 필드를 사용합니다.

비밀 토큰 설정

비밀 토큰은 AMI의 보안을 강화합니다. 각 AMI에 비밀 토큰을 설정할 수 있습니다.

참고: 비밀 토큰은 한 번만 설정할 수 있으며 설정된 후에는 API 또는 웹을 통해 볼 수 없습니다.

Shotgun에서 페이로드 확인

비밀 토큰이 설정되면 Shotgun은 액션 서버로 보낸 각 요청에서 이를 사용하여 해시 서명을 작성합니다.

이 해시 서명은 전송되기 전에 요청 페이로드에 추가됩니다.

참고: AMI의 보안이 유지된 경우 해시 서명은 Shotgun과 액션 서버에서 일치합니다.

다음은 Python에서 받은 요청을 확인하도록 작성된 액션 서버에 대한 예입니다.

from BaseHTTPServer import BaseHTTPRequestHandler
import cgi
import hashlib
import hmac
import datetime
 
key = 'test_key'
 
class PostHandler(BaseHTTPRequestHandler):
 
    def do_POST(self):
        # Parse the form data posted
        form = cgi.FieldStorage(
                fp=self.rfile,
                headers=self.headers,
                environ={'REQUEST_METHOD':'POST',
                         'CONTENT_TYPE':self.headers['Content-Type'],
                         })
 
        # Validate the signature
        if not 'signature' in form.keys():
            print "==> Request not signed."
            return
 
        sorted_params = []
        # Echo back information about what was posted in the form
        for field in form.keys():
            if field != "signature":
                sorted_params.append("%s=%s\r\n" % (field, form[field].value))
 
        sorted_params.sort()
        string_to_verify = ''.join(sorted_params)
 
        signature = hmac.new(key, string_to_verify, hashlib.sha1).hexdigest()
        print "signature: %s" % form['signature'].value
        print "signature: %s" % signature
 
        if form['signature'].value == signature:
            print "==> Signatures match. This request was not tampered with!"
 
        now = datetime.datetime.utcnow();
        request_time = datetime.datetime.strptime(form['timestamp'].value, "%Y-%m-%dT%H:%M:%SZ")
        delta = (now -  request_time).total_seconds()
 
        if delta > 10:
            print "==> This request is getting old (%d seconds). Is it a replay attack?" % delta
        return
 
if __name__ == '__main__':
    from BaseHTTPServer import HTTPServer
    server = HTTPServer(('localhost', 8009), PostHandler)
    print 'Starting server, use  to stop'
    server.serve_forever()
팔로우

0 댓글

댓글을 남기려면 로그인하세요.