没有识别有效载荷是危险的

时间:2014-11-12 17:47:37

标签: python heroku flask

我使用Heroku Scheduler在我的应用程序之外运行脚本。该脚本与run.py和procfile位于同一文件夹中。

@manager.command
def run_purge():
    candidates = models.Candidate.query.all()
    print "SECRET KEY --------->", os.environ["APP_SECRET_KEY"]
    people_purged = []
    for candidate in candidates:
        if candidate.status != 0 and candidate.approved == True and over_30_days(candidate.last_status_change):
            payload = reactivate_account_link(candidate.email, 'reactivate_account')
            send_email("Your account is innactive", "TalentTracker", [candidate.email], payload)
            candidate.status = 0
            db.session.commit()
            people_purged.append(candidate.email)
        else:
            pass    
    return send_email("Purge Completed", "TalentTracker", email_to_admin, "purge completed --> {0}".format(people_purged))

该脚本使用Flask的 It Danice 生成有效负载,并在应用程序本身的视图文件中接收有效负载。这在当地工作正常。但是,当我现场直播时,它会给我一个"内部服务器错误"。通过Print语句,我发现它触发了BadSignature异常,我完全确定原因。我的预感是,在应用程序之外使用密钥,但是当我打印秘密密钥时,它就会出现!

@app.route('/candidates/reactivate_account/<payload>/')
def reactivate_account(payload):
    s = get_serializer()
    try: 
        candidate_email = s.loads(payload)[0]
    except BadSignature:
        print "BAD SIGNATURE", payload, s.loads(payload)
        raise   
    candidate = Candidate.query.filter_by(email=candidate_email).first()
    candidate.status += 1
    candidate.last_status_change = datetime.datetime.now()  
    db.session.commit()
    commit_to_analytics(candidate.candidate_id, None, 4)
    return render_template("test.html")

这就是get_serializer在应用之外的样子。

def get_serializer(secret_key=None):
    if secret_key is None:
        secret_key = app.secret_key
    return URLSafeSerializer(secret_key)

# for getting serialized urls
def reactivate_account_link(candidate_email, path):
    s = get_serializer(os.environ["APP_SECRET_KEY"])
    loads = [candidate_email]
    payload = s.dumps(loads)
    return url_for(path, payload=payload, _external=True) 

我在应用程序之外单独创建它,但功能是相同的。我已经尝试了一个版本,我明确地称之为密钥,但这也没有用。我应该导入它而不是单独创建吗?

-----第二次更新-----

我通过提供get_serialize个功能 - 应用程序中的一个和外部的功能 - 一个全新的`secret_key&#39;来实现这一点。

但是,当我在os.environ [&#34; APP_SECRET_KEY&#34;]和app.secret_key上运行repr==时,值是相同的。有效载荷也匹配。

当我在终端中打印此密钥时,它显示没有反斜杠,例如abcdefghi(我认为是正确的行为)。实际上,秘密密钥具有反斜杠,例如AB / CD / EF / GH / IJ。我不确定这是否相关,但我想包括。

0 个答案:

没有答案