验证新号码时,Account Kit 返回之前的号码和 Account Kit ID
Account Kit returning previous number and account kit ID when a new number is verified
我正在基于 Django (Python) 的网络应用程序上测试帐户工具包(基本网络版本 - phone 号码验证)。我尝试的一件事是在 localhost 上使用多个帐户登录,并尝试 link 一个不同的号码连续地发送给每个帐户。如果一个号码已经成功附加到以前的帐户,我会显示 "already taken" 错误提示。标准的东西。
我注意到我偶尔也会在 未使用的号码 上收到 "already taken" 错误提示。深入调查,我发现虽然我输入并验证(通过短信)了一个新号码,但返回给我的帐户工具包 ID 和手机号码是 前一对 。
我不知道为什么会这样。有人可以帮我调试吗?以防万一,我的授权流程使用应用程序密码。
以下是一些相关的片段。首先,Account Kit Manager class 我写过:
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",{})
更新:似乎并不总是返回用户访问令牌。这可能是 可变范围 的问题。
问题源于 AccountKitManager class 实例的范围。它是全局设置的(即在我的代码中查看 mobile_data
变量)。使这个变量成为本地变量解决了这个问题。
我正在基于 Django (Python) 的网络应用程序上测试帐户工具包(基本网络版本 - phone 号码验证)。我尝试的一件事是在 localhost 上使用多个帐户登录,并尝试 link 一个不同的号码连续地发送给每个帐户。如果一个号码已经成功附加到以前的帐户,我会显示 "already taken" 错误提示。标准的东西。
我注意到我偶尔也会在 未使用的号码 上收到 "already taken" 错误提示。深入调查,我发现虽然我输入并验证(通过短信)了一个新号码,但返回给我的帐户工具包 ID 和手机号码是 前一对 。
我不知道为什么会这样。有人可以帮我调试吗?以防万一,我的授权流程使用应用程序密码。
以下是一些相关的片段。首先,Account Kit Manager class 我写过:
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",{})
更新:似乎并不总是返回用户访问令牌。这可能是 可变范围 的问题。
问题源于 AccountKitManager class 实例的范围。它是全局设置的(即在我的代码中查看 mobile_data
变量)。使这个变量成为本地变量解决了这个问题。