通过任何处理程序上的访问令牌/基本身份验证来验证用户

Authenticate user by access token/ base auth on any handler

我希望用户能够访问 RESTful 服务器并使用查询字符串中的访问令牌进行身份验证。例如https://api.example.com/v1.0/articles?access_token=1234

我在models文件中定义了:

AccessToken
    created UTCTime default=CURRENT_TIME
    userId UserId
    token Text
    UniqueUserId userId
    UniqueToken token
    deriving Eq
    deriving Show

每次创建用户时,我们都会为他们分配一个唯一的令牌。

问题是如何为每个处理程序即时进行身份验证。因此,例如,我将有一个 ArticlesR 处理程序,只有在用户通过身份验证(因此也被授权)后才允许访问。

不应该涉及cookie。每个请求都会重新授权用户。像这样我们可以有一个完全解耦的服务器,可以服务于任意域。

关于基本身份验证也可以问同样的问题。要点是:如何从 regular handler

内部进行身份验证

答案在于实施maybeAuthId

import Database.Persist.Sql (toSqlKey)

instance YesodAuth App where

maybeAuthId = do
    mToken <- lookupGetParam "access_token"
    case mToken of
        Nothing -> return Nothing
        Just token -> do
            mUser <- runDB $ selectFirst [AccessTokenToken ==. token] []
            case mUser of
                Nothing -> return Nothing
                Just user -> return $ Just . accessTokenUserId $ entityVal user

以上示例将通过查询字符串中传递的访问令牌对用户 ID 进行身份验证。它假定您的 models 中包含以下内容:

AccessToken
    created UTCTime default=CURRENT_TIME
    userId UserId
    token Text
    UniqueUserId userId
    UniqueToken token
    deriving Eq
    deriving Show