User Authentication —HTTP Basic Auth

George Chang
origino
Published in
5 min readJul 24, 2017

網站的使用者認證是一個流程,去驗證使用者的身份。

最常見的作法就是利用帳號密碼去通過驗證登入網站,例如在一個購物網站成功登入後可以查看/管理你的個人訂單。

上述的作法就是透過Login form + Session的使用者登入,不過我們往後再介紹。

要介紹的是HTTP基本認證 (HTTP Basic Auth),這個認證是基於對網站請求(request)時的一種驗證方式,也就是說我跟你要東西的時候要先喊聲口令表明身分。

傳輸的格式為user:password,轉成base64編碼後傳輸。

登入時會在HTTP Header加入一個Authorization字段如下:

Authorization: Basic cm9iaW46aXNjaGFybWluZw==

在”Basic後面那串就是針對帳號密碼的base64字串。

然後我們來用python console還原看看:

$ python
>>> import base64
>>> base64.b64decode('cm9iaW46aXNjaGFybWluZw==').decode('utf-8')
'robin:ischarming'

便可以看到還原的帳號密碼是什麼。

由此可知,當網站非使用HTTPS傳輸時,這些請求可以被輕易得知,那麼有心人士便可以還原登入的帳號密碼。

HTTP Basic Auth唯一的優點是它的設計很簡單,而且所有的瀏覽器都支援,因此可以用在私人或保證安全的連線中。

接著讓我們來看看如何用Flask實作HTTP Basic Auth,我們依然使用之前的restful-flask project來改寫。

例如像之前實作的/users 使用者清單,一般的網站不會大方的讓大家看到所有的使用者,這便是一個需要使用者登入認證的例子。

讓我們在app/views/users.py加入一些程式碼:

# app/views/users.py# 引用Flask的request and Response object
from flask import request, Response
# 加入check_auth function,用來檢查帳號密碼
def check_auth(username, password):
return username == 'robin' and password == 'ischarming'
# 加入authenticate function,用來回應使用者需要通過認證才可以瀏覽,返回401 status code
def authenticate():
return Response(
'Could not verify your access level for that URL.\n'
'You have to login with proper credentials', 401,
{'WWW-Authenticate': 'Basic realm="Login Required"'})
# 把上面的方法包成一個裝飾器(decorator)
def requires_auth(f):
@wraps(f)
def decorated(*args, **kwargs):
auth = request.authorization
if not auth or not check_auth(auth.username, auth.password):
return authenticate()
return f(*args, **kwargs)
return decorated

可以看到在decorator內做了什麼事,我們從request object取得authorization的資料,如果使用者沒有尚未驗證,並且在輸入的帳號密碼不正確或未輸入,便會回傳authenticate()的內容。

@users.route('/', methods=['GET'])
@requires_auth
def index():
users = User.query.all()
return render_template('users/index.html', users = users)

接著我們在/users這個route的方法直接加上decorator,便完成了HTTP Basic Auth的防護。

接著我們執行看看

$ python manage.py runserver
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

然後我們在瀏覽器輸入http://127.0.0.1:5000/users

便會跳出如下圖視窗要求輸入帳號密碼。

最後附上githutb連結供參考,謝謝。

下一篇會介紹的是如何用一開始提的Login form + Session來實作使用者登入。

--

--