Как я могу Base64 UrlEncode SHA256 Хеш строки в Haskell? - PullRequest
3 голосов
/ 12 июля 2019

Это для создания запроса кода и верификатора для рабочих процессов PKA OAuth.

Следующее кажется таким, каким оно должно работать (использует cryptonite):

import System.Random (newStdGen, randomRs)
import Crypto.Hash (Digest, hash)
import Crypto.Hash.Algorithms (SHA256)

x = do
    gen <- newStdGen
    codeVerifier = C.pack . take 128 $ randomRs ('0', 'z') gen
    codeChallenge = show (hash codeVerifier :: Digest SHA256)
    print codeChallenge

Но, увы, это не так. Так что я опубликую ответ, который я наконец-то решил после большой боли и труда.

1 Ответ

3 голосов
/ 12 июля 2019

И ответ, который ожидают рабочие процессы OAuth, заключается в следующем: барабанная дробь ~~~

import System.Random (newStdGen, randomRs)
import Data.ByteArray.Encoding
import Crypto.Hash.Algorithms
import Crypto.Hash

-- | This is a custom sort of urlEncode that simply replaces bad characters
urlEncode :: String -> String
urlEncode [] = ""
urlEncode ('=':xs) = urlEncode xs
urlEncode ('+':xs) = '-' : urlEncode xs
urlEncode ('/':xs) = '_' : urlEncode xs
urlEncode (x : xs) = x : urlEncode xs

codeVerifier = C.pack . take 128 $ randomRs ('a', 'z') gen
codeChallenge = urlEncode . C.unpack $ (convertToBase Base64 (hashWith SHA256 codeVerifier)  :: ByteString)

Проблема в коде OP заключается в том, что base64 кодирует String, где этот код ожидает преобразованияхеш до String, так что вы на самом деле base64 кодируете хеш напрямую как ByteArray.

В любом случае, это пнул меня в задницу, тем более что служба аутентификации, которую я использовал, настаивала, что моя ошибка была invalid_grant.Я продолжал говорить, что у меня invalid_grant ?!В любом случае, я наткнулся на эту пару седых волос, так что подумал, что помогу следующей несчастной душе.

...