Webアプリケーションのマルチアカウントシステムの設計とマイクロチャンネルスキャンコードログインを実装

1はじめに概要

その上で機能テスト、パフォーマンステスト、セキュリティテストとのための会社の後の統合管理にMISシステムへのより良い自動化された緊急の必要性が行われ、これらの結果を報告しています。

次のようにこのMISシステムの特性は以下のとおりです。

  • 職員による内部使用
  • パブリックネットワークで展開

、上記の特性に基づいて、明らかに、このような人間の内部システムように完全なアカウントを実装するには、アカウントにプライバシーと利便性のニーズを取るために、現実的ではない、著者は行うには、マイクロチャンネルスキャンコードを使用すると、ログイン認証、およびバックオフィスの管理だと思います監査のメンバーは、次の結果を得ることができるように:

  • これは、利便性を確保するために、(登録が完了されたマイクロチャネルを掃引)登録しきい値なしに達成することができます
  • プライバシーを確​​保するために、分離することにより、監査役のいかなるシステムありません、

次に、このシステムの開発が完了し、そして後に何を昇華し、小さなを要約する必要性を感じるので、この記事を書くための動機があります。

以上の2つのアカウントの原則

この論文の本来の目的は、することです「署名するマイクロチャンネルスキャンコードを達成」が、その後、私はちょうどこの、この論文の構想を実現するために考えて、それが低すぎる見えます。だからここのようにして展開だ「マルチアカウントのログイン認証システム」

近年では、より多くのインターネットの発展とのコラボレーションなど、現在のシステムのログイン、より多くの、はるか以前の単一のユーザー名ウェイアップを超えました。ユーザー名とパスワードに加えて、サイトには、次の一般的なログインを提供しています:

    • 第三者認証

      マイクロチャネル/ QQ /新浪微博(中国)グーグル/ Facebookの/ Githubの(海外)

    • バインディングアカウント

      電話番号、メールボックス番号

上記のいくつかのログインに基づいて、それは次のように形成されている「図ログインのマルチアカウントシステム」

IMG

理論的根拠:

    • 第三者認証

      対応する値(ユーザー情報)を返すために、信頼できる第三者から取得し、その後することができUSER_ID追加のパスワード認証プロセスを変更することができるグループが作成されます将来的に完成予定の再入力を必要としない結合のuser_idとしてプレースホルダのユーザー認証が成功した後に設定セッション状態

    • バインディングアカウント

      すでに達成user_idの結合に対応するアカウントを完了するために登録を、それは認識と意味USER_IDはログインして使用することができますUSER_ID成功した認証の認証状態の後に設定セッションを完了するために、システムのログを記録するために、同じまたは異なるパスワードを(一般的に同じパスワードを使用)

アカウントの結合アプローチは比較的単純であり、ここではそれらを繰り返すありません。

基づいて許可サードパーティの方法を、このアプローチに基づいて、インターネットますますオープンな性質は、間違いなく、より多くのアプリケーション、より多くの主流となりますので、それはより微妙で、学習が比較的強いことができます。以下意志マイクロチャンネルスキャンコードを説明するための例として、不正アクセスの。

3ログインロジックスキャンコード

使用したマイクロチャネル・スキャン・コード次のように不正アクセスロジックは、次のとおりです。

IMG

これは主に以下のものを扱います:

  • 第三者への認証要求を開始
  • サードパーティの認証コールバック
  • MISシステムとローカルUSER_IDの関係システム(新しいユーザー)
  • 設定したセッションのログインステータス
  • 異なる処理結果表示インタフェース

マイクロチャンネルスキャンコード4の工程

人々は、以下のプロセス(ソーシャルネットワーキングサイトとして知られているが経験する掃引ログインするために使用されるマイクロ文字のコードはほとんど知っている例として):

  1. オープンはほとんど知っているホームページを、をクリックして「マイクロ手紙ログイン」アイコンを
  2. ブラウザは、次の2つの次元コードページ(参照番号1を参照)は、マイクロチャネルのドメインにリダイレクトされます
  3. マイクロチャネルは、携帯電話のユーザーを開き、スイープ
  4. 携帯電話のマイクロチャネルの許可をクリックします
  5. 2次元コード上のPC用ページの表示が正常に認可され、ためになって、ほとんど知っている家庭、認証が成功しています

エンドユーザーのための全体のプロセスは、ほんの数秒では、と任意のパスワードを入力しない非常に安全で便利な経験であると言うことができます。

そこで問題は、二次元のマイクロ文字のコードをスキャンすることによって、何が起こっているのか、最後に、わずか数秒内でこの時間を登録MISシステムにログインして完成されましたか?

いくつかの重要なコミュニケーションプロセス分析のブラウザのキャプチャ。

IMG

PCのブラウザは、順番に(長い時間に2つの長い接続が開始されます保留中の要求のステータスを):

  • 移動端末のマイクロセルにスキャンコードを待って(図に標識された。2)
  • 電話マイクロ手紙クリックを待って、「OKログイン」(図3にマーク)ボタン

この2つの状態は、携帯電話側の完了を確認した後に、ページ上のPCブラウザのページが承認した後、学生に向けられることになる、背中PC側の二次元コードページにフィードバックされている(のような、ほとんど知っている家)。

次のように特定の政党の通信タイミングは次のとおりです。

IMG

通信に関与するプロセス全体に図オブジェクトが明瞭図符号の部分に記載されている次のように注釈を付けました。

  1. マイクロチャンネルのAPIと受信サーバーのコールバックURLのパラメータ
  2. カメラによってモバイルマイクロチャンネルスキャン二次元コード、光学原理完全にデータを通信します
  3. PCのブラウザ上で受信した問い合わせスキャンコード状態の長い接続状況の戻り値、および更新プロンプト
  4. クエリモバイルクライアントPCには、ブラウザのステータス値に[OK]ボタンをクリックして、迅速に更新し、その後にリダイレクト1を処理する URLアドレスを渡します
  5. 承認後、サイトサーバーは、正常に完了し、システムのビジネスロジック登録のユーザーまたはログインしています
  6. サーバーは、ログイン成功インターフェイスにユーザーをリダイレクトします(存在する場合、新規登録ユーザーがない場合は、追加の監査)

マイクロチャンネルスキャンは、コード認証部分の開発について、これは、与えられただけで次の事項に行くことはありません。

  • マイクロチャネルプラットフォームのAPIインタフェースの様々な、を参照してください。公式ドキュメントを提供するためのオープンなプラットフォームを微信
  • コードの開発権は、企業の資格でログインする必要がありマイクロチャンネルスキャンは、オープンプラットフォームを微信(個々のユーザを得ることができません)
  • コールバックURLの微信オープンプラットフォームを埋めるために必要なドメインの登録は、地域開発の転送コールバックURLのパラメータは、一貫して、レコードのためでなければなりません

5コードの実装

上記の原理によると、最終的に我々は、参照のための具体的な実装コードを提供し、簡単にするために、アウト掲載しませ実装いくつかの一般的なユーティリティ関数があります。

使用python3.5達成マイクロチャンネルスキャンコードのログインWebアプリケーション以下の参照コードに示します。

対応する図1を識別する。実装コード:

class WeChatAuth(MyBaseHandler):
    """
    点击后直接重定向到微信登录界面

    - wechat QR扫码登录,web端
    - 直接重定向到微信的页面
    """

    def get(self):
        state = get_uuid1_key()  # 生成唯一的码

        wx_qr_param = dict(
            appid=wx_webapp.appid,
            # redirect_uri=wx_webapp.qr_auth_cb_url,
            redirect_uri='http://your.domain.com/wechat/wechat-auth-callback/',
            response_type='code',
            scope=wx_webapp.login_scope,
            state=state
        )  ##wechat_redirect

        wx_qr_url = 'https://open.weixin.qq.com/connect/qrconnect?%s#wechat_redirect' \
                    % urllib.parse.urlencode(wx_qr_param)

        self.redirect(wx_qr_url)
        
复制代码
class WeChatAuthCallback(MyBaseHandler):
    """
    微信第三方认证之后,开始将此用户在本系统沉淀下来

    - 用于微信服务器传回code的值
    - 此处要再请求获得access_token
    """

    async def get(self):
        wx_code = self.get_argument('code', '')
        wx_state = self.get_argument('state', '')

        if wx_code == '':
            res = ConstData.msg_forbidden
            dlog.debug(res)
            self.write(res)
            return

        dlog.debug('wx_code:%s,wx_state:%s' % (wx_code, wx_state))

        access_token_res = wx_webapp.get_auth_access_token(code=wx_code, state=wx_state)
        user_info = wx_webapp.get_auth_user_info(auth_access_token_res=access_token_res)
        """:type:WeChatUser"""  # 微信返回的用户信息串

        if user_info is None:
            res = ConstData.msg_forbidden
            dlog.debug(res)
            self.write(res)
            return

        wechat_user = await MisWeChatUser.objects.get(openid=user_info.openid, unionid=user_info.unionid)
        """:type:MisWeChatUser"""
        # 一个Open_id下面所有的id都是靠union来区分账号

        if wechat_user is not None:
            user = await User.objects.get(user_id=wechat_user.user_id)
            assert user is not None
            if user.active:
                if await user.is_online():
                    await self.update_session()  # 更新时间
                else:
                    await self.create_session(user)  # 新增加一个session
                self.write('in authorized page')
                # self.redirect('/')  # todo 重定向到登录授权后的主页
                return

        # 如果不存在wechat备案信息,则需要备案wechat信息,而且新注册初始账号
        default_new_user_id = 'u_' + get_uuid1_key()

        new_wechat_user = MisWeChatUser(
            openid=user_info.openid,
            nickname=user_info.nickname,
            unionid=user_info.unionid,
            # user_id=wx_webapp.appid + '_' + user_info.unionid,  # 通过微信号登录生成的一个唯一的用户名,后面可以提供修改
            user_id=default_new_user_id,
            appid=wx_webapp.appid
        )
        new_wechat_user.set_default_rc_tag()

        # rand_salt = get_rand_salt()
        new_user = User(
            user_id=default_new_user_id,
            # salt=rand_salt,  # 防止别人md5撞库反向破解的随机数
            # passwd=StringField()  # 密码,通过第三方登录的默认不设置
            first_name=user_info.nickname,
            status=FieldDict.user_status_init,  # 表示是可更改状态
            active=False,
        )
        new_user.set_default_rc_tag()

        await new_wechat_user.save()
        await new_user.save()
        self.write('in unauthorized page')

        # self.redirect(URL_ROOT)  # todo 导入到未授权的页面
复制代码

6機能テスト

2つのテストケースを設計します。

ユーザは、上述したプロセスを完了することができたときに、マイクロチャンネルスキャンコードを確認してください。

  1. 自動登録かどうかを確認するためにマイクロ手紙アカウントで署名するスキャンコード
  2. プロンプトが「不正なページ」にリダイレクトするかどうか

データベース内の修飾された微小チャンネルが自動的によってスキャンコードの後に​​ユーザステータス監査ログに登録されています。

  1. ユーザステータスが変更された真=アクティブ
  2. プロンプトが「認証ページ」にリダイレクトするかどうか
  3. あなたは、データベースにログオンセッションの状態を参照しています

次のようにテストショットは、以下のとおりです。

IMG

7まとめ

私はプロダクトマネージャーだった場合、私は、Webアプリケーション製品をすれば、その後、初期段階での製品は、私は間違いなくこの方法でログインしきい値が低すぎるためにサインインするためにマイクロ文字を選ぶだろう、しきい値は、ユーザーの試作品であります活性の少なくともレベルの最小のフォローアップに閾値ログインによって影響されません。

おすすめ

転載: juejin.im/post/5d7e12c7f265da03d316f1cf