kay-framework 3.0.0 でTwitter認証をしてみる

kay-framework 3.0.0 でTwitter認証をしてみる

Category:雑記Tags:

kay-framework と Twitter での Oauth については素晴らしい文献が present さんのブログ にありますが、kay-framework が 3.0.0 になった事と Twitter API のアップデートで見事にハマったのでメモ致しました。

基本設定

kay-framework 3.0.0 のTwitter認証で必要なもので present さんのブログ と差分がある所は settigs.py の内容です。
GAEMA_VALID_SERVICES がkay-framework 3.0.0で定義不要となっているみたいです。

settigs.py はこんな感じに。

# -*- coding: utf-8 -*-

"""
A sample of kay settings.

:Copyright: (c) 2009 Accense Technology, Inc. 
										 Takashi Matsuo <tmatsuo@candit.jp>,
										 All rights reserved.
:license: BSD, see LICENSE for more details.
"""

DEFAULT_TIMEZONE = 'Asia/Tokyo'
DEBUG = True
PROFILE = False
SECRET_KEY = 'SECRET_KEYSECRET_KEYSECRET_KEYSECRET_KEY'
SESSION_PREFIX = 'session_prefix:'
COOKIE_AGE = 1209600 # 2 weeks
COOKIE_NAME = 'cookie_name'

ADMINS = (
)

TEMPLATE_DIRS = (
  'myapp/templates',
)

USE_I18N = False
DEFAULT_LANG = 'en'

INSTALLED_APPS = (
  'myapp',
  # 以下を追記
  'kay.ext.gaema',
)

APP_MOUNT_POINTS = {
  'myapp': '/',
}

CONTEXT_PROCESSORS = (
  'kay.context_processors.request',
  'kay.context_processors.url_functions',
  'kay.context_processors.media_url',
)

MIDDLEWARE_CLASSES = (
  # 以下を追記
  'kay.auth.middleware.AuthenticationMiddleware',
  'kay.sessions.middleware.SessionMiddleware',
)

# 以下を追記
AUTH_USER_BACKEND = 'kay.auth.backends.gaema.GAEMABackend'

# 以下を追記
GAEMA_USER_MODEL = 'myapp.models.User'

# 以下を追記
GAEMA_SECRETS = {
  'twitter_consumer_key': 'あなたのconsumer key',
  'twitter_consumer_secret': 'あなたのconsumer secret',
}

views.py はこんな感じに。

# -*- coding: utf-8 -*-
"""
tweetprints.views
"""
import logging
import settings

from werkzeug import Response
from kay.ext.gaema.utils import (
  create_gaema_login_url, create_gaema_logout_url, get_gaema_user
)
from kay.ext.gaema.decorators import gaema_login_required
from kay.ext.gaema.services import TWITTER
from kay.utils import (
  render_to_response, url_for
)

def _renderToResponse(template,dictionary={}):
  dictionary['loginURL'] =create_gaema_login_url(TWITTER,url_for("myapp/index"))
  dictionary['logoutURL']=create_gaema_logout_url(TWITTER,url_for("myapp/index"))
  dictionary['user']=get_gaema_user(TWITTER)
  logging.info(dictionary['user'])
  return render_to_response(template,dictionary)

def index(request):
  return _renderToResponse('myapp/index.html')
                             
@gaema_login_required(TWITTER)
def home(request):
  return _renderToResponse('myapp/home.html')

テンプレートの中に以下の記述をすればログイン・ログアウトが完成するはず!

{% if None == user %}
    <a href="{{loginURL}}">
    {{_('login'|e)}}
    </a>
{% else %}
    <a href="{{url_for('myapp/home')}}">
        <img src="{{user.profile_image_url}}" height="24" width="24">
        {{user.name}}
    </a>
    <a href="{{loginURL}}">
        {{_('logout'|e)}}
    </a>
{% endif %}

loginのリンクを踏むとTwitterのOauthが発動して無事に認証できていねぇ
GAEのログを調べると「Could not authenticate with OAuth.」で認証失敗している模様。

Could not authenticate with OAuth

Google先生にお伺いを立ててもヒントは全く見つからず。

手を加えたところ

kay-framework のソースコードを拝見すると、 API(´Д`)古イネ
と言う訳でソースコードを直接修正。
/myproject/kay/ext/gaema/auth.py 385行目

    #_OAUTH_REQUEST_TOKEN_URL = "http://twitter.com/oauth/request_token"
    #_OAUTH_ACCESS_TOKEN_URL = "http://twitter.com/oauth/access_token"
    #_OAUTH_AUTHORIZE_URL = "http://twitter.com/oauth/authorize"
    #_OAUTH_AUTHENTICATE_URL = "http://twitter.com/oauth/authenticate"
    _OAUTH_REQUEST_TOKEN_URL = "https://api.twitter.com/oauth/request_token"
    _OAUTH_ACCESS_TOKEN_URL = "https://api.twitter.com/oauth/access_token"
    _OAUTH_AUTHORIZE_URL = "https://api.twitter.com/oauth/authorize"
    _OAUTH_AUTHENTICATE_URL = "https://api.twitter.com/oauth/authenticate"
    _OAUTH_NO_CALLBACKS = True

/myproject/kay/ext/gaema/auth.py 439行目

        #url = "http://twitter.com" + path + ".json"
        url = "https://api.twitter.com/1.1"  + path + ".json"

以上でTwitter認証できるようになりました。

最後に

認証後のユーザーの情報はview.pyで下記のようにして取得できるようです。

user = get_gaema_user(TWITTER)

スポンサーリンク

コメント (0)

コメントをどうぞ

注意プライバシーポリシーに同意の上で送信ください。

注意お名前は公開されます。
補足メールアドレスは公開されません。

関連記事

CakePHP3の環境構築 Amazon Linux編

CakePHP3の環境構築 Amazon Linux編

Category:雑記Tags:,

この記事のまとめ 症状1 composer で intl extension を要求されます。 対処1 yum で使用している PHP のバージョンにあった intl extension をインストールしました。 症状2…