2016-07-04 31 views
0

Ich möchte, dass Benutzer auf einen RESTful-Server zugreifen und mit einem Zugriffstoken in der Abfragezeichenfolge authentifiziert werden können. Zum Beispiel https://api.example.com/v1.0/articles?access_token=1234Authentifizieren von Benutzer durch Zugriffstoken/base auth auf jedem Handler

Ich habe in der models-Datei definiert:

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

Jedes Mal, wenn ein Benutzer erstellt wird, werden vergeben wir ihnen ein einzigartiges Token.

Die Frage ist, wie die Authentifizierung für jeden Handler im laufenden Betrieb zu tun. Zum Beispiel würde ich einen ArticlesR Handler haben, dem Zugriff nur gewährt werden sollte, nachdem der Benutzer authentifiziert wurde (und somit auch autorisiert wurde).

Es sollte kein Cookie beteiligt sein. Jede Anfrage wird den Benutzer erneut authentifizieren. So könnten wir einen vollständig entkoppelten Server haben, der jede beliebige Domain bedienen kann.

Die gleiche Frage kann auch nach Base-Auth gefragt werden. Der Kern ist: Wie zu authentifizieren aus dem Innern eines regelmäßigen Handler

+0

Ich sehe einen Verweis auf meine Anwendungsfall in https://hackage.haskell.org/package/yesod-auth-1.2.4/docs/src/Yesod -Auth.html # maybeAuthId – amitaibu

Antwort

1

Die Antwort bei der Umsetzung ist 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 

Das obige Beispiel Benutzer-ID durch das Zugriffstoken in dem Abfrage-String übergeben wird authentifizieren. Es wird vorausgesetzt, dass die folgenden in Ihrem models haben:

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