cj-token 0.0.0 → 0.0.1
raw patch · 4 files changed
+31/−8 lines, 4 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- CJ.Auth.Token: UserBearerToken :: Text -> Text -> UserBearerToken
+ CJ.Auth.Token: UserBearerToken :: Maybe Text -> Text -> UserBearerToken
Files
- cj-token.cabal +1/−1
- library/CJ/Auth/Token.hs +5/−4
- package.yaml +1/−1
- test-suite/CJ/Auth/TokenSpec.hs +24/−2
cj-token.cabal view
@@ -3,7 +3,7 @@ -- see: https://github.com/sol/hpack name: cj-token-version: 0.0.0+version: 0.0.1 synopsis: A new Haskeleton package. description: cj-token is a new Haskeleton package. category: Other
library/CJ/Auth/Token.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE OverloadedStrings #-}+ module CJ.Auth.Token ( UserBearerToken(..) , JSONToken(..)@@ -35,13 +36,13 @@ fromClaims :: JWTClaimsSet -> Maybe a data UserBearerToken = UserBearerToken- { _bearerUserId :: T.Text+ { _bearerUserId :: Maybe T.Text , _bearerAppId :: T.Text } deriving (Eq, Show) instance JSONToken UserBearerToken where- toClaims UserBearerToken{ _bearerUserId = uid, _bearerAppId = aid } =- def { unregisteredClaims = M.fromList [ ("userId", toJSON uid)+ toClaims UserBearerToken{ _bearerUserId = maybeUid, _bearerAppId = aid } =+ def { unregisteredClaims = M.fromList [ ("userId", toJSON maybeUid) , ("appId", toJSON aid) ] } fromClaims JWTClaimsSet{ unregisteredClaims = clms } =@@ -49,7 +50,6 @@ where uid = fromValue =<< M.lookup "userId" clms aid = fromValue =<< M.lookup "appId" clms - fromValue :: FromJSON a => Value -> Maybe a fromValue = parseMaybe parseJSON @@ -64,6 +64,7 @@ where verifyUtf8Base64 base64Str = rightToMaybe $ TE.decodeUtf8' (BS64.decodeLenient $ TE.encodeUtf8 base64Str) +-- move this out of interface? encodeToken :: (JSONToken a) => Secret -> a -> POSIXTime -> T.Text encodeToken secret token expTime = encodeJWT secret expiringClaims where baseClaims = toClaims token
package.yaml view
@@ -1,5 +1,5 @@ name: cj-token-version: 0.0.0+version: 0.0.1 category: Other synopsis: A new Haskeleton package. description: cj-token is a new Haskeleton package.
test-suite/CJ/Auth/TokenSpec.hs view
@@ -10,6 +10,8 @@ import qualified Web.JWT as JWT import qualified Data.Text as T++import Data.Maybe (isNothing) import Data.String (fromString) import CJ.Auth.Token @@ -23,12 +25,33 @@ it "decode . encode = id" $ property $ \x y -> let token = UserBearerToken{ _bearerUserId = x- , _bearerAppId = y }+ , _bearerAppId = y } secret = JWT.secret "" encoded = encodeToken secret token 100 decoded = decodeToken secret encoded 0 in decoded == Just token + describe "claims" $ do+ it "token contains user id if exists" $+ property $ \uid aid ->+ let token = UserBearerToken{ _bearerUserId = uid+ , _bearerAppId = aid }+ secret = JWT.secret ""+ encoded = encodeToken secret token 100+ decoded = decodeToken secret encoded 0+ (Just UserBearerToken{ _bearerUserId = decodedUid }) = decoded+ in uid == decodedUid++ it "token does not contain user id if does not exist" $+ property $ \aid ->+ let token = UserBearerToken{ _bearerUserId = Nothing+ , _bearerAppId = aid }+ secret = JWT.secret ""+ encoded = encodeToken secret token 100+ decoded = decodeToken secret encoded 0+ (Just UserBearerToken{ _bearerUserId = decodedUid }) = decoded+ in isNothing decodedUid+ describe "decodeToken" $ it "returns Nothing if the token is expired" $ property $ \x y ->@@ -38,7 +61,6 @@ encoded = encodeToken secret token time decoded = decodeToken secret encoded 100 :: (Maybe UserBearerToken) in decoded `shouldBe` Nothing- describe "decodeToken" $ it "returns Nothing if token is garbage" $ do