帐户工具包在验证新号码时返回上一个号码和帐户工具包ID

时间:2017-07-19 19:16:01

标签: account-kit

我正在基于Django(Python)的网络应用程序上测试Account Kit(基本Web版本 - 电话号码验证)。我尝试的一件事是在localhost上使用多个帐户进行日志记录,并尝试连续将不同的数字链接到每个帐户。如果某个号码已成功附加到之前的帐户,我会显示已经拍摄的号码"错误提示。标准的东西。

我注意到我偶尔得到了已经被采取的#34; 未使用的号码上的错误提示也是如此。深入调查,我发现虽然我输入并验证了(通过短信)新号码,但返回给我的帐号套件ID和手机号码是前一对

我无法说明为什么会这样。有人可以帮我调试吗?如果重要,我的授权流程会使用app secret。

以下是一些相关的片段。首先,我写了账户管理员课程:

from myproj.account_kit_settings import FAID, AKAS

class AccountKitManager(object):
    obj = None

    def __init__(self, app_id, app_secret):
        self.app_secret = app_secret
        self.app_access_token = 'AA|{0}|{1}'.format(app_id, app_secret)

    def get_user_cred(self, auth_code):
        if not self.obj:
            self.set_user_cred(auth_code)
        return self.obj

    def set_user_cred(self, auth_code, url=None):
        if not url:
            url = 'https://graph.accountkit.com/v1.2/access_token?grant_type=authorization_code&code={0}&access_token={1}&appsecret_proof={2}'.\
            format(auth_code,self.app_access_token,self.get_appsecret_proof(self.app_access_token))
        data = self.retrieve_data(url)
        data = self.evaluate_data(data)
        string_obj = self.retrieve_user_cred(data["access_token"])
        self.obj = self.evaluate_data(string_obj)

    def retrieve_user_cred(self, user_access_token, url=None):
        if not url:
            url = 'https://graph.accountkit.com/v1.2/me/?access_token={0}&appsecret_proof={1}'.\
            format(user_access_token,self.get_appsecret_proof(user_access_token))
        return self.retrieve_data(url)

    def retrieve_data(self, url):
        return requests.get(url).text

    def evaluate_data(self, data):
        return ast.literal_eval(data)

    def get_appsecret_proof(self, access_token):
        h = hmac.new(self.app_secret.encode('utf-8'),msg=access_token.encode('utf-8'),digestmod=hashlib.sha256)
        return h.hexdigest()

接下来,我的使用方法如下:

mobile_data = AccountKitManager(FAID, AKAS)

def account_kit_handshake(csrf, state, status, auth_code):
    if csrf == state and status=='PARTIALLY_AUTHENTICATED':
        user_data = mobile_data.get_user_cred(auth_code)
        if FAID == user_data["application"]["id"]:
            return user_data["id"], user_data["phone"]
        else:
            # app id mismatch
            return None, None
    else:
        # csrf mismatch, or could not authenticate
        return None, None

def get_requirements(request):
    status = request.GET.get('status', None)
    auth_code = request.GET.get('code', None)
    state = request.GET.get('state', None)
    return account_kit_handshake(request.session["csrf"], state, status, auth_code)


def verify_consumer_number(request,*args,**kwargs):
    AK_ID, MN_data = get_requirements(request)
    request.session.pop("csrf",None)
    if AK_ID and MN_data:
        if someone_elses_number(MN_data['national_number'], request.user.id):
            return render(request,"used_number.html",{})
        else:
            save_consumer_credentials.delay(AK_ID, MN_data, request.user.id)
            return redirect("classified_listing")
    else:
        return render(request,"unverified_number.html",{})

更新:似乎始终没有返回用户访问令牌。这可能是变量范围的问题。

1 个答案:

答案 0 :(得分:1)

问题来自AccountKitManager类实例的范围。它是全局设置的(即在我的代码中查看mobile_data变量)。使这个变量局部解决了这个问题。