package ch.rasc.sec.controller; import java.io.IOException; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.google.zxing.BarcodeFormat; import com.google.zxing.WriterException; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; import ch.rasc.sec.entity.User; import ch.rasc.sec.repository.UserRepository; @Controller public class QRCodeController { private final UserRepository userRepository; QRCodeController(UserRepository userRepository) { this.userRepository = userRepository; } @RequestMapping(value = "/qrcode/{username}.png", method = RequestMethod.GET) public void qrcode(HttpServletResponse response, @PathVariable("username") String username) throws WriterException, IOException { User user = this.userRepository.findByUserName(username); if (user != null) { response.setContentType("image/png"); String contents = "otpauth://totp/" + username + ":" + user.getEmail() + "?secret=" + user.getSecret() + "&issuer=SpringSecurityTOTP"; QRCodeWriter writer = new QRCodeWriter(); BitMatrix matrix = writer.encode(contents, BarcodeFormat.QR_CODE, 200, 200); MatrixToImageWriter.writeToStream(matrix, "PNG", response.getOutputStream()); response.getOutputStream().flush(); } } }