通过访问令牌/ base auth在任何处理程序上验证用户

时间:2016-07-04 20:03:08

标签: haskell yesod

我希望用户能够访问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。每个请求都将重新授权用户。像这样,我们可以拥有一个完全分离的服务器,可以服务于任意域。

也可以询问有关基础身份验证的相同问题。要点是:如何从常规处理程序

内部进行身份验证

1 个答案:

答案 0 :(得分:1)

答案是实施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