std::string AuthInfo::generateRawJwt(VPackBuilder const& bodyBuilder) { VPackBuilder headerBuilder; { VPackObjectBuilder h(&headerBuilder); headerBuilder.add("alg", VPackValue("HS256")); headerBuilder.add("typ", VPackValue("JWT")); } std::string fullMessage(StringUtils::encodeBase64(headerBuilder.toJson()) + "." + StringUtils::encodeBase64(bodyBuilder.toJson())); std::string signature = sslHMAC(_jwtSecret.c_str(), _jwtSecret.length(), fullMessage.c_str(), fullMessage.length(), SslInterface::Algorithm::ALGORITHM_SHA256); return fullMessage + "." + StringUtils::encodeBase64U(signature); }
void RestVocbaseBaseHandler::generateSaved( arangodb::OperationResult const& result, std::string const& collectionName, TRI_col_type_e type, VPackOptions const* options, bool isMultiple) { if (result.wasSynchronous) { createResponse(GeneralResponse::ResponseCode::CREATED); } else { createResponse(GeneralResponse::ResponseCode::ACCEPTED); } if (isMultiple && !result.countErrorCodes.empty()) { VPackBuilder errorBuilder; errorBuilder.openObject(); for (auto const& it : result.countErrorCodes) { errorBuilder.add(basics::StringUtils::itoa(it.first), VPackValue(it.second)); } errorBuilder.close(); _response->setHeaderNC(StaticStrings::ErrorCodes, errorBuilder.toJson()); } generate20x(result, collectionName, type, options); }
std::string RestAuthHandler::generateJwt(std::string const& username, std::string const& password) { VPackBuilder headerBuilder; { VPackObjectBuilder h(&headerBuilder); headerBuilder.add("alg", VPackValue("HS256")); headerBuilder.add("typ", VPackValue("JWT")); } std::chrono::seconds exp = std::chrono::duration_cast<std::chrono::seconds>( std::chrono::system_clock::now().time_since_epoch() ) + _validFor; VPackBuilder bodyBuilder; { VPackObjectBuilder p(&bodyBuilder); bodyBuilder.add("preferred_username", VPackValue(username)); bodyBuilder.add("iss", VPackValue("arangodb")); bodyBuilder.add("exp", VPackValue(exp.count())); } std::string fullMessage(StringUtils::encodeBase64(headerBuilder.toJson()) + "." + StringUtils::encodeBase64(bodyBuilder.toJson())); std::string signature = sslHMAC(_jwtSecret.c_str(), _jwtSecret.length(), fullMessage.c_str(), fullMessage.length(), SslInterface::Algorithm::ALGORITHM_SHA256); return fullMessage + "." + StringUtils::encodeBase64U(signature); }