2017-07-19 8 views
1

Django(Python)ベースのWebアプリケーションでアカウントキット(基本Webバージョン - 電話番号確認)をテストしています。私が試みる一つのことは、localhost上の複数のアカウントでロギングし、それぞれ異なる番号を連続してリンクしようとすることです。すでに以前のアカウントに番号が割り当てられている場合は、「既に取得済み」のエラープロンプトが表示されます。標準的なもの。新しい番号が確認されたときに以前の番号とアカウントキットIDを返すアカウントキット

私は散発的に "既に取られました"というエラープロンプトを未使用の数字で取得していることに気づいています。より深く調査したところ、新しい番号を入力して確認(SMS経由)したにもかかわらず、私に返されたアカウントキットIDと携帯番号は、前のペアのであったことがわかりました。

なぜこれが起こっているのかわかりません。誰かがこれをデバッグするのを助けることができますか?重要な場合は、承認フローでアプリの秘密情報が使用されます。


以下に関連するスニペットを示します。まず、私が書いたアカウントキットマネージャークラス:

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",{}) 

UPDATE:ユーザーのアクセストークンが常に返されていないようです。これは可変スコープで問題になる可能性があります。

答えて

0

問題は、AccountKitManagerクラスインスタンスのスコープから発生しました。それはグローバルに設定されました(つまり、コード内で変数mobile dataを参照)。この変数をローカルにすることで問題が解決されました。

関連する問題