QQのWebアプリケーションの使用は、インターネットQQの公式サイトで作成されていることを前提にログインし、WebアプリケーションにおけるAPP ID QQインターネットおよびAPP KEYを取得
1、内蔵されたルーティング
#1 QQ登录 パス(' loginQq / '、qq.loginQq、NAME = ' loginQq / ' )、 パス(' 戻る/ '、qq.returns、名前= ' 戻ります/ ')、
2、フロントページ書き込みQQのログインリンクは、この論文では、一時的にリンク要求を使用するためにアイコンを使用していませんでした。
<a data-wow-delay= ".5s" href= "/blog/loginQq/"> QQ登录する</a>»
図3に示すように、フォルダの下に作成されたアプリケーションプログラム、及び、機能をカプセル化するための戻りデータからパッケージのOpenID(データベース・ユーザーID内部テンセント)を抽出する機能をfunction.py utilsの作成
次のように関数の内容は、カプセル化されました。
輸入再 デフparse_jsonp(jsonp_str): 試してください: リターン re.search(' ?。^ [^(] * \((*)\)[^)] * $ '、jsonp_str).group(1 ) を除い: 引き上げるとValueErrorを(' 无效数据!')
図4に示すように、コードビハインド
django.shortcuts インポート、レンダリングリダイレクトを、のHttpResponse、HttpResponseRedirect から blog.models インポートメンバー から urllibはインポートの解析 から urllibはのインポート要求としてREQ インポート再 インポートJSON のインポートランダム から blog.utils インポート機能 DEF loginQq(要求): 国家 = STR( random.randrange(100000,999999)) #は、クロスドメインの偽造攻撃を防ぐために、ランダムなステータスコードを定義します。 ますrequest.session [作る' 国家' ] =国家を #ランダムステータスコードが返された認証情報を検証するため、セッションを保存します。 = CLIENT_ID ' 101 716 344 ' #のWebアプリケーションAPP IDでQQインターネット。 #コールバックアドレスがコード化され、ユーザーは認証がこのリンクをコールすることに同意します。 =コールバックをparse.urlencode({ ' REDIRECT_URI ':' http://127.0.0.1:8000/blog/returns ' }) #。REDIRECT_URI = HTTP%3A 2F %%% 2Fblog 2F127.0.0.1%3A8000%2Freturnsの #1 団体サードパーティのQQのログインリンク LOGIN_URL = ' https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=%s&%s&state=%s '%(client_idの、コールバック、州) リターン HttpResponseRedirect(LOGIN_URL) #QQのログインは、サードパーティの認証ページにリダイレクト DEF (リクエスト)を返します: IFますrequest.session [ 「国家」 ] == request.GET [ 「国家」 ]: #検証のステータスコードは、クロスドメイン偽造攻撃を防ぎます。 = `` request.GET``コード[ ' コード' ] #ユーザ認証コード取得 CLIENT_IDを= ' 101 716 344 ' #APP ID QQ配線Webアプリケーション。 = client_secret ' 7f42aaac69f866750078fbe1edd9d2a4 ' #WebアプリケーションでAPPキーQQインターネット。 =コールバック({parse.urlencode ' REDIRECT_URIを':「Http://127.0.0.1:8000/blog/returns 」}) #コールバックアドレスがエンコードされているが、ユーザーが認証がこのリンクをコールすることに同意します。 = LOGIN_URL ' https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&code=%s&client_id=%s&client_secret=%s&%s '%(コード、CLIENT_ID、client_secret、コールバック) #のアクセストークンを取得するために、組織リンク #は、のHttpResponse(LOGIN_URL)を返す 。レスポンス= req.urlopen(LOGIN_URL).read()のデコード() #123456789&:オープンアクセストークン取得リンクaccess_tokenは access_tokenは = re.split(' &'、レスポンス)[0]を #123456789:アクセスaccess_tokenはトークン取得 RESをReq.urlopen =(' https://graph.qq.com/oauth2.0/me?' + access_tokenは).read()。デコード() #オープンOpenIDのリンクを取得する のOpenID = json.loads(function.parse_jsonpを( RES))' のOpenID ' ] #リターンデータから取得410225632333335556566のOpenID のUserInfo = req.urlopen(' https://graph.qq.com/user/get_user_info?oauth_consumer_key=%s&openid=%s&%s '%( CLIENT_ID 、OpenIDの、access_tokenは))。読む()。デコード() #ユーザーの情報へのリンクのためのオープン #の印刷ビュー取得したユーザ情報の 印刷(のUserInfo) のUserInfoJson.loads =(のUserInfo) #のユーザ情報(JSON形式)データを返した辞書として読み取ります。 = Member.objects.filterユーザー(member_qq_id = OpenIDの) #のユーザーが存在するかどうかを問い合わせ IF ません:ユーザは #何のユーザーが存在する場合 #は、新しいユーザーを作成していない member_obj = Member.objects.create(member_qq_id = OpenIDの、member_nickname =のUserInfo [ ' ニックネーム' ]、MEMBER_NAMEのUserInfo = [ ' ニックネーム' ]、member_photoのUserInfo = [ ' figureurl_qq_1 ' ]) #のユーザーメンバー=()新しいユーザーを作成します。# #user.member_qq_id = OpenIDのユーザ情報#の書き込み #をuser.member_nickname =ユーザー情報[ 'ニックネーム'] #の書き込みユーザ情報 #user.member_nameのUserInfo = [ 'ニックネーム']ユーザ情報#書き込む #ユーザ情報#を書き込むため#user.genderのUserInfo = [ '性別'] #のユーザー.member_photo =のuserinfo [ 'figureurl_qq_1'] #の書き込みユーザー情報 #1 user.save()#保存またはユーザーが更新 ますrequest.session [作る' MEMBER_ID ' ] = member_obj.member_id #ユーザーがセッションの書き込みのOpenIDを記録し ますrequest.sessionを作ります【' MEMBER_NAME ' ] =のUserInfo [ ' ニックネーム' ] #の ホームへの戻り経路 リターンリダイレクト('/ブログ/インデックス/ ") それ以外: 返すのHttpResponseを(' 認証に失敗しました!')
この記事では、ローカルのテストプロジェクトにQQのログイン機能なので、インターネットのコールバックアドレスQQの公式サイトがローカルアドレス用に変更する必要があり、
5、機能テストプロジェクトを開始
図6は、データベーステーブルのメンバーは、メンバーシップ情報が書き込まれているビュー。
行わ。