スキャンコードのIMのログイン機能を達成するためにどのように?主流の技術的な原則をログに記録するテキストスキャンコードを知ろう

1はじめに

この機能をログに記録するスキャンコードは、最初は、PC側が(スキャンコードは、そうでない場合は、ログインしていない)人類機能に対するビットものの、マイクロチャネルに従事し始めたが、かなりクールですと言っているべきです。

下の写真は、かかわらず、IMユーザーや一般の開発者の、あなたが精通する必要があります:

「ログインマイクロスイープを持っていると考えられているなぜ、私たちはそうではない?。」 - だから、スローされる必要があり、プログラマの添加から、IMプロダクトオーナーとプロダクトマネージャーに従事

まあ、長いマイクロチャネル機能がある限り、すべての時間は、すべての後に鍋、難易ビットの大きなをダンプしたいIMプログラマは、上司であることを前提としていますし、「I」IM製品のいくつかのマイクロ文字が持っている必要があります。

我々は避けることができないので、あなただけの正直、ハードラインの技術的な原則を知って取得し、それを所有することができます。

この記事では、簡単にスキャン論理機能を実装するためのコードと、淘宝網の現実、スキャンコードのログイン機能マイクロ手紙、学習および技術の巨大な主流の思考の研究アプリケーションをログに記録する技術を紹介します。

2、基本的な技術の原則

最終的には2.1スキャンコードのログイン機能は何ですか?

ログオンするための最初の導入スキャンコードにどのようなものです。今の学生のほとんどは、マイクロ手紙、QQと淘宝網、携帯電話上のソフトウェアのこのタイプが装備されています。これらのアプリは、対応するWebクライアントを持っています。スイープが一掃ログインすることができ、携帯電話サービスを利用して、自分のWebページを使用するときに、ユーザーがより便利で安全なログインできるようにするには、それが自然に明らかです。

いくつかの大手メーカーは、ログインコードは次のようにするときの効果を席巻インタフェースを使用します。

多くの小さなパートナーは非常に不思議な感じもありますが、ページはわずか2次元コードを示し、どのように2次元コードを掃引し、そしてそれに署名した携帯電話を知っているだろうか?登録が完了した後、ユーザーが情報をユーザーに指示することができます。また、それは本当に素晴らしいああです。

2.2スキャンコードのログイン機能の完全な技術的なロジック

1)論理Webサーバの嵌合端を持ちます:

次のステップは、このサービスの詳細な実施のためです。

ブラウザが要求のログイン・サーバは、2次元コードを取得し、送信するときにまず、ユーザーは、サイトのログインページが開きます。サーバが要求を受信した後、それはランダムなUUIDを生成し、キー値としてこのIDは、Redisのサーバに格納され、及び有効期限を設定し、後に、再取得するリフレッシュされる二次元コードが必要にユーザログを有効期限が切れています。

一方、一緒にキー値と、同社の認証文字列は、2次元コードは、二次元コード(2次元コード生成の画像を生成し、インターフェースによって生成され、多くのオンラインインタフェースと既製のソースコードは、そこにあるここで説明されることはありません)。次に、2次元コードの画像とユーザーのブラウザに一緒にUUID復帰。

2次元コードとUUIDを取得するには、ブラウザは、ログイン要求が成功し、1秒間に1回ずつ、ブラウザに送信されます。UUIDの要求は、現在のページの識別子を運びます。ここではいくつかの学生が奇妙になり、唯一のRedisに保存された一つのサーバがキー値としてのuuid、どのユーザID情報、それだろうか?

ここでは、実際のユーザIDに関する情報が存在します、ID情報はRedisのサーバーに電話で保存されています。詳細については、「サーバーへの電話の論理的な終わりに。」をお読みください。

2)論理サーバと携帯端末と:

お使いの携帯電話を作り、オープンスイープログ:ブラウザは、2次元コード、ページに表示し、ユーザーにヒントを与えるために、二次元コードを取得することを言います。

携帯電話ユーザーのうち2次元コードをスキャンするには、(また、多くのデモがあり、インターネット上の文字列、ここでは詳細に説明されていないを得るために、2次元コードスキャン機能)検証メッセージとUUIDを取得することができます。

サーバーの電話側にアクセスする際に、電話の最後には、パラメータはユーザーのトークンを運ぶために戻ってログインされていますので、携帯電話ターミナルサーバは、(直接の代わりに携帯電話側のトークンからこの値を渡し、ユーザーのuserIdを解析し、 useridはリスクはずっと)小さくなります修正され、トークンが暗号化され、セキュリティのために、直接転送ユーザーIDが傍受して変更することができます。モバイル端末パースは、データとユーザは、サーバ(サーバは、クライアント・サーバとWebサーバの電話側は、同じサーバーの電話ではありませんされているサーバ)に認証されたログイン要求を送信するために一緒にパラメータとしてトークン。

サーバは、要求、第1比較パラメータ検証情報を受信した後、ユーザのログイン要求インタフェースかどうかを決定します。そうだとすれば、それは携帯電話側に確認メッセージを返します。

返された携帯端末の領収書は、登録確認ボックスがユーザーに表示された後(より人間的なログインながら、ユーザのエラーを防ぐため)。ログイン操作は、電話が再び要求を送信したユーザを確認した後。サーバーとGET UUIDのuserId後、Redisのに格納された値として、ユーザのユーザID値は、鍵ペアとしてキーのuuid。

3)ログインが成功したロジックがある場合には:

ブラウザが要求を再送信したとき次に、ブラウザサーバは、ユーザIDを取得し、ブラウザに、ブラウザのトークンは、ブラウザが要求を再送信し、ユーザ情報バックへのログイン方法、音を呼び出すことができます、ログインに成功。携帯電話のエンドユーザ情報、及びユーザ情報が必ずしも正確に同じブラウザであるため、代わりに直接格納されたユーザ情報のここに格納されたユーザIDです。

次のように4)図に示した詳細な技術的原理をまとめます:

3、淘宝網のスキャンコード技術にログイン

このセクションでは、スキャンコード、実際に淘宝網はロジックを実装ログに記録するスキャンコードを解析するために勉強し、例えば、淘宝網にログオンします。

ログイン画面login.taobao.com/member/logiは...背中のパラメータを渡します。

そして、リクエスト(GET)メッセージは、この次のとおりです。

https://qrlogin.taobao.com/qrcodelogin/qrcodeLoginCheck.do?lgToken=2c3b4d53ef0513787bf4ce711ea5ba53&defaulturl=&_ksTS=1540106757739_2804&callback=jsonp2805复制代码

キーは、lgTokenにあるあなたは、ポーリング中にページのサーバーを要求するコール・インタフェース(ロングポーリングが長いポーリングする必要があります)2次元コードを開いたときでユニークなIDページ、サインです。

ノースキャンコードならば、それが返されます。

スイープ場合は、それが返されます:

{

"コード": "10001"、

「メッセージ」:「モバイルスキャンQRコードの成功」、

「成功」:真

}

長い時間がないスキャンコードワード、Webクライアントは、ポーリング、2次元コードの失敗を停止することはありません!

確認ログインするときに、携帯端末、インターフェイスに戻ります:

{ "コード": "10006"、 "成功":真、 "URL":「https://login.taobao.com/member/loginByIm.do?uid=cntaobaoxxx&token=ff82fc0d1d395a33d3b38ec5a4981336&time=1530179143250&asker=qrcodelogin&ask_version=1.0.0&defaulturl= HTTPS://www.taobao.com&webpas=0b7aed2d43f01825183e4a49c6cae47d1479929926" }

もちろん、「確認ログイン」の間の相互作用をクリックするだけで、携帯電話端末とサーバは何が起こったのかおそらく、ログインが成功したことを示します:サービス要求を終了するlgToken端に生成されたページ、サーバが再びとき、Webクライアント、このことを覚えていて、lgTokenが記録さだと思いますポーリング要求インタフェースは、それはあなたがWebクライアントでトークンにログインすることができ、真のログイン状態トークンを返します。

下に示すように、技術的なロジックを詳細:

4、マイクロチャネル技術スキャンコードログイン

4.1技術的な原則フローチャート

マイクロチャネルアクセスアドレスのWebバージョンは次のとおりです。wx.qq.com/は、綿密な調査を所有することができます興味を持っています。

4.2実際のロジック技術

1)固有のUUID、ならびにUIDに関する情報が含まれていた二次元コードを取得します。

//取得UUID

getUUID:関数(){

vare = t.defer()。

returnwindow.QRLogin = {}、

$アヤックス({

URL:i.API_jsLogin、

データ型:「スクリプト」

})。行う(関数(){

200 == window.QRLogin.code?e.resolve(window.QRLogin.uuid):e.reject(window.QRLogin.code)

})。{((機能)フェイル

e.reject()

})、

e.promise

}

2)ブラウザがサーバーをポーリング、スキャンコードの状態を取得:

//スキャンコードのステータスを確認

checkLogin:関数(E、A){

VARN = t.defer()

= || 0;

returnwindow.code = 0、

window.checkLoginPromise = $アヤックス({

URL:i.API_login + "?loginicon =真&UUID =" + E + "&先端=" + A + "&R =" +〜NEWDATE、

データ型:「スクリプト」、

タイムアウト:35e3

})。行う(関数(){

newRegExp( "/" + location.host + "/")。

(window.redirect_uri && window.redirect_uri.indexOf( "/" + location.host + "/")<0)であれば

returnvoid(LOCATION.HREF = window.redirect_uri)。

生成物= {

コード:window.code、

REDIRECT_URI:window.redirect_uri、

userAvatar:window.userAvatar

}。

n.resolve(E)

})。{((機能)フェイル

n.reject()

})、

n.promise

}

3)スキャンコードの状態は、サーバ、対応するアクションによって返されます。

* 408スキャンコードタイムアウト:電話がスキャンではないコードや無許可のログインを行う場合は、サーバは、戻りステータスコード408は、25秒程度ブロックします- >フロントをポーリングし続けます

失敗次元コード400 *:約5分以内でないスキャンコード、二次元コードが失敗しました

* 201はスキャンコードです:電話はスキャンコードを持っている場合は、すぐにサーバとユーザのステータスコード(window.code = 201、window.code.userAvator =「の基本情報に戻る ...」)、 - > フロントエンドをポーリングし続けます

* 200の認定: -ターゲット・ページにリダイレクト>ストップポーリングフロントエンド、トークンへのアクセス、電話が確認ログインにクリックした場合、サーバは200とトークンを返します。

特定のコードの例は以下の通りです。

スキャンコード//サーバが返す状態、対応する操作

functiono(C){

スイッチ(c.code){

case200:

t.newLoginPage(c.redirect_uri).then(関数(T){

バロ= t.match(/ <RET>(。*)<\ / RET> /)

、R = t.match(/ <スクリプト>(。*)<\ /スクリプト> /)

、C = t.match(/ <SKEY>(。*)<\ / SKEY> /)

、S = t.match(/ <wxsid>(。*)<\ / wxsid> /)

、L = t.match(/ <wxuin>(。*)<\ / wxuin> /)

、D = t.match(/ <pass_ticket>(。*)<\ / pass_ticket> /)

、F = t.match(/ <メッセージ>(。*)<\ /メッセージ> /)

、U = t.match(/ <redirecturl>(*)<\ / redirecturl> /)。

returnu?無効(window.location.href = U [1]):O && "0" = O [1]!?(アラート(F && F [1] || "登录失败")、

i.report(i.AUTH_FAIL_COUNT、1)、

空location.reload()):。(E EMITを$( "newLoginPage"、{

RET:O && O [1]、

鍵SKey:C && C [1]、

SID:S && S [1]、

UIN:L && L [1]、

パスチケット:D && D [1]、

コード:R

})、

ボイド(a.getCookie( "webwx_data_ticket")|| n.report(n.ReportType.cookieError、{

テキスト:「webwx_data_ticket法案が失われました」

クッキー:document.cookie

})))

});

ブレーク;

case201:

e.isScan =!0、

n.report(n.ReportType.timing、{

タイミング:{

スキャン:Date.now()

}

})、

t.checkLogin(e.uuid).then(O、関数(T){

!T && window.checkLoginPromise &&(e.isBrokenNetwork =!0)

});

ブレーク;

case408:

t.checkLogin(e.uuid).then(O、関数(T){

!T && window.checkLoginPromise &&(e.isBrokenNetwork =!0)

});

ブレーク;

case400:

case500:

case0:

VARS = a.getCookie( "refreshTimes")|| 0;

S <5?(S ++、

a.setCookie( "refreshTimes"、S、0.5)、

document.location.reload()):e.isNeedRefresh = 0;!

ブレーク;

case202:

e.isScan =!1、

e.isAssociationLogin = !1,

a.setCookie( "login_frequency"、0、2)、

window.checkLoginPromise &&(window.checkLoginPromise.abort()、

window.checkLoginPromise = NULL)、

R()

}

e.code = c.code、

e.userAvatar = c.userAvatar、

a.log( "GETコード"、c.code)

}

4.3まとめ

マイクロチャンネルスキャンコードログイン・ページの端部が、ポーリングデータは、問題を解決するためにクロスドメインであるJSONPの形で返されたとき。

場合フロントブロッキングバックグラウンドスキャンコード、最適縮小ポーリング及びポーリング遠位無効に応じてポーリング要求を用いたマイクロチャネルスキャンコードログイン・ページの終わり、。

5.本概要

この資料に記載されている技術的な原則は、IMアプリケーションの実装にのみ限定されるものではないので、スキャンコードは、現在唯一のIMアプリケーションが表示されている、この機能をログに記録する、モバイル端末の様々なオンラインサイトでは、この機能を持っていますスキャンコードは、ログオンします。

また、実際のデータ解析を把持を容易にするために、本論文ではPCケースの解析は、Webクライアントを目指しているが、実際にお使いのPCの終わりには、このインストールを.DMG、.exeファイル、リッチクライアント(ある場合バージョン)、原理は同じであり、ブラウザのクロスドメインの問題を考慮する必要はありません。


BLOG住所www.liangsonghua.com

マイクロチャンネル公衆数に焦点:保存卵の黒板には、よりエキサイティングな取得します!

公開番号説明:Jingdongの中での作業に技術の洞察を共有し、同様JAVA技術と業界のベストプラクティスとして、それらのほとんどは、再現性、実用的です理解することができます


おすすめ

転載: juejin.im/post/5e45f943e51d45271d5d2dce