0

AuthKit + OpenID + MysqlStore

In previous examples, I always use file store, which I found that it is quite difficult to use when I deploy BasaAsa to the server so I change to use MySQL store. To use MySQL store, I modified websetup.py in order to create table for OpenID library.

websetup.py:

"""Setup the basaasa application"""
import logging

from basaasa.config.environment import load_environment
from basaasa.users.authkit_elixir_driver import UsersFromDatabase
from basaasa import model
from authkit.authenticate.open_id import make_store #added
from pylons import config #added

log = logging.getLogger(__name__)

def setup_app(command, conf, vars):
    """Place any commands to setup basaasa here"""
    load_environment(conf.global_conf, conf.local_conf)
    from elixir import metadata
    metadata.create_all(checkfirst=True)
    store_type = config.get('authkit.openid.store.type') #added
    stote_config = config.get('authkit.openid.store.config') #added
    conn, cstore = make_store(store_type, stote_config) #added
    if store_type == 'mysql': #added
        cstore.createTables() #added

Then after I run paster setup-app development.ini, tables for storing OpenID information have been created.

0

OpenID + Authkit และ Pylons แบบมี Admin กับ User อื่นๆ

หลังจากที่โพสไปคราวก่อน ก็ลองใช้ OpenID กับ Authkit และ Pylons ได้แล้ว ใน app ชื่อ topenid แต่ว่าผมก็ยังอยากจะแยกระหว่าง admin กับ user อื่นๆ ก็เลยเขียน code เพิ่มอีกหน่อย เริ่มจาก development.ini เพิ่มบรรทัดนี้เข้าไป

topenid.admins = http://xxxx.myopenid.com/ https://me.yahoo.com/xxxxyyyy

เพื่อบอกว่า admins เป็นใครบ้าง แต่พอดีเป็นแนว openid ก็บอกไปแบบนี้ จากนั้นก็เข้าไปแก้ใน controller แบบนี้

import logging

from pylons import request, response, session, tmpl_context as c
from pylons import config
from pylons.controllers.util import abort, redirect_to
from authkit.permissions import RemoteUser
from authkit.authorize.pylons_adaptors import authorize
from authkit.permissions import RequestPermission

from topenid.lib.base import BaseController, render

log = logging.getLogger(__name__)


# class Admin นี้เป็นตัว check permission ว่าเป็น Admin หรือเปล่า
# ผมว่าน่าแยกอีกไฟล์แต่ขี้เกียจ

from authkit.authorize import NotAuthenticatedError
import urlparse
class Admin(RequestPermission):
    def __init__(self):
        if 'topenid.admins' not in config:
            raise RuntimeError, 'Require topenid.admins'
        self.users = config['topenid.admins'].split()

    def check(self, app, environ, start_response):
        if 'REMOTE_USER' not in environ:
             raise NotAuthenticatedError('Not Authenticated')
        if urlparse.urldefrag(environ['REMOTE_USER'])[0] not in self.users:
             raise NotAuthenticatedError('Not Authenticated')
        return app(environ, start_response)

class AuthController(BaseController):

    # แบบนี้ใครก็เข้าได้
    def index(self):
        return 'Hello World'

    @authorize(Admin())  # ให้เฉพาะ admin เข้า
    def test2(self):
        return 'test'

    @authorize(RemoteUser())   # ใครที่ sign-in ก็เข้าได้
    def test(self):
        return 'test'

    def signout(self):
        return 'signout'

    def signin(self):
        return 'signed in'

    def env1(self):
        return request.environ.get('REMOTE_USER')
        #return config.get('topenid.admins')[0]

ง่วงมาก Zzzz …

2

OpenID + AuthKit + Pylons (simple)

I try to post simple example how to use OpenID with AuthKit 0.4.3 and Pylons 0.9.7. by adapting example from AuthKit. So I just create new Pylons app named “topenid” and modify it as follow:

  1. development.ini:
    These lines below are added to development.ini

    authkit.setup.enable = true
    authkit.setup.method = openid, cookie
    authkit.openid.store.type = file
    authkit.openid.store.config =
    authkit.openid.charset = UTF-8
    authkit.openid.path.signedin = /auth/signin
    authkit.cookie.signoutpath = /auth/signout
    authkit.openid.store.baseurl = http://localhost:5000
    authkit.cookie.secret = somesecret
    
  2. midddleware
    ...
    import authkit.authenticate # this line is added
    ...
        app = PylonsApp()
        app = authkit.authenticate.middleware(app, app_conf) # this line is added
    ...
  3. topenid/controllers/auth.py
    import logging
    
    from pylons import request, response, session, tmpl_context as c
    from pylons.controllers.util import abort, redirect_to
    from authkit.permissions import RemoteUser
    from authkit.authorize.pylons_adaptors import authorize
    
    from topenid.lib.base import BaseController, render
    
    log = logging.getLogger(__name__)
    
    class AuthController(BaseController):
        def index(self):
            return 'Hello World'
    
        @authorize(RemoteUser())
        def test(self):
            return 'test'
    
        def signout(self):
            return 'signout'
    
        def signin(self):
            return 'signed in'

These are all modifications. I can access http://localhost:5000/auth/index as expect and http://localhost:5000/auth/test is redirected to an OpenID signin page. And I can sign out by visiting http://localhost:5000/auth/signout.

This example seems to work well but I need something more complex for example every user doesn’t have the same role. So I may post another more complex example soon.

0

My first wsgi middleware

import logging
log = logging.getLogger(__name__)
class foomid(object):
    def __init__(self, app, app_conf):
        self.app = app

    def __call__(self, environ, start_response):
        a = [str(e) for e in environ]
        a.sort()
        log.info("\n".join(a))
        response = self.app(environ, start_response)
        return response

I just want to see how to make middleware and I want to observe environ.

0

Authkit: Change sign-in form (simple)

After using Authkit with *form* authentication method for a while, I want to change sign-in form to have the same theme as other pages and also add project name to the form. Finally, I found this site http://jimmyg.org/2007/08/14/pylons-mako-templates-in-authkit/, which is (nearly) identical @sirn suggestion. They told me how to change this form so thank both of them.

However, I want to make a very simple modification first so I simplified the example. In development.ini, I just add “authkit.form.template.obj”.

authkit.setup.enable = true
authkit.setup.method = form, cookie
authkit.form.authenticate.user.type = basaasa.users.authkit_elixir_driver:UsersFromDatabase
authkit.form.authenticate.user.data = basaasa.model
authkit.cookie.secret = SomeSec
authkit.cookie.signoutpath = /auth/signout
authkit.form.template.obj = basaasa.lib.auth:make_template #I added this line

Then I added auth.py to /basaasa/lib.

auth.py:

def make_template():
    return """


Signin


<div>
BasaAsa: Signin

<table>
<tr><td>
Username: 
</td></tr>
<tr><td>
Password: 
</td></tr>
</table>


</div>


"""

def make_template() is required to return template, which is format string. Format string is just normal string with format specifier(s), for example: “xxx %s xxx”. For “def make_template()”, %s will be replace by an action, which is used as form action.

I do not plan to really use this example in BasaAsa but an example in the link in the paragraph above. However I hope this will remind me in the future how template work in Authkit and how to replace it.

8

แก้ปัญหาเล็กๆ น้อยๆ กับ Pylons + mod_wsgi + virtualenv

เดิมที่ผมมีปัญหาว่า app ที่ใช้ pylons เขียนใช้ได้บ้างไม่ได้บ้าง ชนิดที่ว่าเข้าครั้งแรกไม่ได้พอ reload ก็ใช้ได้ เป็นแบบนี้ไปเรื่อยๆ โดยไม่รู้ว่าเกิดจากอะไรกันแน่. แต่เท่าที่ดู error log ของ Apache พอว่าเกิดจากหา package ไปเจอ. ผมก็ลองแก้ไปแบบชนิดที่ว่าคิดอะไรออกก็ลองดูหมด จนผ่านไปหลายชั่วโมง. สิ่งที่ทำคือ แทนที่จะเพิ่ม path เข้าไปใน app ที่วางไว้เฉยๆ โดยไม่ได้ install เช่น ผมเอา app ชื่อ basa ไปวางไว้ใน home ก็จะอยู่ที่ /home/vee/basa ผมก็เพิ่ม /home/vee เข้าไปใน python path เลย โดย site.addsitedir(‘/home/vee’) แต่ก่อนหน้านั้นก็ site.addsitedir(‘/home/vee/env/PYLONS/lib/python2.5/site-packages’) ไปแล้ว. ตอนนี้เลยเปลี่ยนไปเรียก python setup.py build และ python setup.py install ก่อนก็จะทำให้ basa นี้ไปอยู่ใน path อย่าง /home/vee/env/PYLONS/lib/python2.5/site-packages เป็นต้น ก็ทำให้ add แค่ path เดียวคือ /home/vee/env/PYLONS/lib/python2.5/site-packages ก็พอ. ผลคือตอนนี้ยังไม่พบปัญหาอะไร app ใช้งานได้ปกติดี.

ปกติชาวบ้านเขาอาจจะ install กันแบบนี้อยู่แล้ว แต่ผมดันทำอะไรประหลาดเองหรือเปล่าก็ไม่รู้ … และไม่อยากรู้เท่าไหร่ ขอให้ app ทำงานเนียนๆ ก็พึงพอใจมากแล้ว ^_^.