スポンサーサイト

0

    一定期間更新がないため広告を表示しています


    • 2014.12.23 Tuesday
    • -
    • -
    • -
    • -
    • -
    • by スポンサードリンク

    クッキーを使わない認証できました!

    0
      何とかできたようなので公開します★
      everesさん、常山さん、ありがとうございましたm(_ _)m

      セッションキーを取ろうとするとNoneが返ってきてうまく行かないので(saveする前にとってんのかな??)、結局ユーザーIDとパスワードをGETで持ちまわる形にしました。

      ■デコレータ(見づらくてすみません)
      前回everesさんに手直しして頂いたものを元に作ってます。

      from django.contrib.auth import REDIRECT_FIELD_NAME
      from django.contrib.auth.models import User
      from django.http import HttpResponseRedirect
      from myproject.lib.minihash import hash, hashdecode
      from django.conf import settings
      from urllib import quote

      def login_required(view_func):
      login_url = "/accounts/login/"
      def _checklogin(request, *args, **kwargs):
      if request.user.is_authenticated():
      return view_func(request, *args, **kwargs)
      else:
      try:
      request.META['HTTP_USER_AGENT'].index("DoCoMo")
      user = User.objects.get(is_active=True,id=request.GET['user'])
      if user.check_password(hashdecode(request.GET['pwd'])):
      request.user = user
      return view_func(request, *args, **kwargs)
      except:
      pass
      return HttpResponseRedirect('%s?%s=%s' % (login_url, REDIRECT_FIELD_NAME, quote(request.get_full_path())))

      _checklogin.__doc__ = view_func.__doc__
      _checklogin.__dict__ = view_func.__dict__
      return _checklogin

      パスワードを生のまま持ってると何かと危険だと思うので、簡単ですが暗号化をかけてあります^^;
      minihashというのが自作の簡単なhash化用モジュール(?)で、hash(暗号)・hashdecode(復号)という関数を入れてあります。

      ■コンテキスト

      def mobile_session(request):
      try:
      request.META['HTTP_USER_AGENT'].index("DoCoMo")
      q = "?user=%s&pwd=%s" % (request.GET['user'],request.GET['pwd'])
      except:
      q = ""
      return { 'q':q }

      説明は不要かと思いますが、Docomo携帯でアクセス、かつGETでuserとpwdを持っていれば
      それをqという変数に入れています。
      何に使うかというと、ログイン後のページ遷移でuser/pwdを持ち廻るために、テンプレート内の全てのリンクタグ&FORMタグに追加しました。←これが一番面倒でした…


      ■ログイン用ビュー
      #ついでですが、newformsを使って自分で書いたものなので参考になるかと。

      #モデル類の他に先ほどのminihashとnewformsをimport
      class LoginForm(forms.Form):
      username = forms.CharField(label="ユーザー名", required=True, max_length=30)
      password = forms.CharField(label="パスワード", required=True, max_length=30, widget=forms.PasswordInput)
      next = forms.CharField(required=False, widget=forms.HiddenInput)

      def login(request):
      if request.method == 'POST':
      form=LoginForm(request.POST.copy())
      if form.is_valid():
      from django.contrib.auth import authenticate, login
      d = form.cleaned_data
      user = authenticate(username=d['username'], password=d['password'])
      if user:
      if user.is_active:
      login(request, user)
      try:
      url = d['next']
      except KeyError:
      url = "/community/"
      try:
      request.META['HTTP_USER_AGENT'].index("DoCoMo")
      url = url + "?user=%s&pwd=%s" % (user.id, hash(d['password']))
      except:
      pass
      return HttpResponseRedirect(url)
      else:
      error_msg = "退会済み、又はアカウント停止中です。万が一、身に覚えの無い場合はこちらからお問合せ下さい。"
      else:
      error_msg = "ユーザー名又はパスワードが違います。"
      return render_to_response("registration/login.html", { 'form':form, 'error_msg':error_msg }, context_instance=RequestContext(request))
      try:
      form
      except:
      try:
      next = request.META['HTTP_REFERER']
      except:
      next = "/community/"
      form = LoginForm(initial={ 'next':next })
      return render_to_response("registration/login.html", { 'form':form }, context_instance=RequestContext(request))


      こんな感じでDocomo携帯でログイン→認証状態を保持してページ遷移 が実現できました。
      Docomo携帯の判別甘くない?というご指摘があると思いますが^^;公開用のドキュメントルートにはhttpd.confレベルでアクセス制限をかけてあるので、あとはUAだけの判別で足りるという判断から。
      あとは追加でSoftBankのクッキー未対応携帯も同じ動作をするようにいじったら終わりの予定です(汗


      スポンサーサイト

      0

        • 2014.12.23 Tuesday
        • -
        • 12:11
        • -
        • -
        • -
        • -
        • by スポンサードリンク

        コメント
        コメントする








           
        この記事のトラックバックURL
        トラックバック

        PR

        calendar

        S M T W T F S
             12
        3456789
        10111213141516
        17181920212223
        24252627282930
        << September 2017 >>

        twitter

        selected entries

        categories

        archives

        recent comment

        • 結局CodeIgniter用汎用Modelクラス&汎用CRUDスクリプトを書きました
          プログラマー
        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
          よし
        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
          ななうぇぶ
        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
          よし
        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
          よし
        • WindowsのPCで開発するphperがxhprofを使う方法
          ななうぇぶ
        • WindowsのPCで開発するphperがxhprofを使う方法
          川本
        • [バッドノウハウ]Symfony2で別テーブルの集計項目を一覧に含めたいとき
          よし
        • Symfony Advent Calendar JP 2012 day 14 - vendorをcomposerで管理しているプロジェクトにcomposerを使わずにバンドルを追加したときのautoloadの書き方
          77web
        • Symfony Advent Calendar JP 2012 day 14 - vendorをcomposerで管理しているプロジェクトにcomposerを使わずにバンドルを追加したときのautoloadの書き方
          ktz

        recent trackback

        • HTMLの表(TABLE)のセル(TD)に斜線を引くjavascriptライブラリ slash.js 作っちゃいました
          常山日記
        • django対symfony 日本語メール送信(その1 symfony編)
          CPA-LABテクニカル
        • CodeIgniterでユーザー認証
          されどLAMPな日々
        • 久々にdjangoを最新版にしたらHTMLがエスケープされちゃった!!(解決済み)
          常山日記
        • FastCGIを諦めてmod_pythonを使う。Apacheのアップグレード
          サーバー用語集
        • さくらインターネット、sqlite3でdjango@CGI版を使う際の設定メモ
          常山日記
        • さくらインターネット スタンダードプランでdjango使ってる方、DBは?
          mitszoの日記
        • python多次元リストをsort(並べ替え)する方法?
          mitszoの日記
        • フォームから送信した値とrequest.POSTの挙動($_POST@PHPとの比較)
          Humming Via Kitchen
        • 日本語テキストをtruncate@django(Python全般にも??)
          常山日記

        recommend

        links

        profile

        search this site.

        others

        mobile

        qrcode

        powered

        無料ブログ作成サービス JUGEM