Fixing the "this cannot include CR/LF" error when doing Basic auth in Ruby
Today, while testing an integration I'm currently working on for a client, I got the following error:
class: ArgumentError
message: header Authorization has field value "Basic somethingSomethingBase64Encoded", this cannot include CR/LF
This meant that my Authorization
header was considered to be invalid, because it supposedly contained a new line character at the end, even though I certainly didn't recall adding any such thing when creating it.
def encoded_credentials
Base64.encode64("#{@username}:#{@secret}")
end
Looking around online, some suggested simply switching to another authentication mechanism. Which isn't always an option. I also discovered that it just so happens that the Base64
ruby library simply adds a newline every 60 characters when encoding a string. Which can be avoided by using strict_encode
instead of encode
(cf this Github issue). Like that:
def encoded_credentials
Base64.strict_encode64("#{@username}:#{@secret}")
end
Much better.
And if that doesn't help (spoiler: for me, for some reason, it didn't), you can still take out the heavy artillery good ol' (and slightly dirty) search and replace:
def encoded_credentials
Base64.encode64("#{@username}:#{@secret}").gsub(/\n/, '')
end
Voilà!
Hope it helped, and the best of days to you!
Edit, January 25th 2023: or you could use Base64.strict_encode64 instead. Just saying.