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技術と業界のベストプラクティスとして、それらのほとんどは、再現性、実用的です理解することができます