第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

使用帶有 Spring Security 的 Telegram 登錄

使用帶有 Spring Security 的 Telegram 登錄

慕桂英3389331 2023-06-21 14:52:12
我正在嘗試在 Spring Boot 應(yīng)用程序上實(shí)現(xiàn)使用 Telegram 登錄(https://core.telegram.org/widgets/login),但遇到了問題。我一直在嘗試實(shí)施他們提供的 PHP 代碼來驗(yàn)證身份驗(yàn)證,但出了點(diǎn)問題,我無法理解是什么。所以,這就是 PHP 上的代碼secret_key = SHA256(<bot_token>)if (hex(HMAC_SHA256(data_check_string, secret_key)) == hash) {  // data is from Telegram}Data-check-string 是所有接收到的字段的串聯(lián),按字母順序排序,格式key=<value>為使用換行符('\n',0xA0)作為分隔符 - 例如,'auth_date=<auth_date>\nfirst_name=<first_name>\nid=<id>\nusername=<username>.所以,我所做的是:@AllArgsConstructor@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)public class AuthenticationRequest {  @NotNull  private Long authDate;  private String firstName;  @NotEmpty  private String id;  private String lastName;  private String photoUrl;  private String username;  @NotEmpty  private String hash;  @Override  public String toString() {    final var data = new StringBuilder();    for (final Field field : getClass().getDeclaredFields()) {      try {        if (!field.getName().equals("hash") && field.get(this) != null) {          final var fieldName = CaseFormat.LOWER_CAMEL              .to(CaseFormat.LOWER_UNDERSCORE, field.getName());          data.append(fieldName).append("=").append(field.get(this)).append("\\n");        }      } catch (IllegalAccessException e) {        e.printStackTrace();      }    }    return data.substring(0, data.length() - 2);  }}還有這兩個(gè)方法:private static String hmacSha256(final String data, final byte[] secret) {    try {      Mac sha256Hmac = Mac.getInstance("HmacSHA256");      SecretKeySpec secretKey = new SecretKeySpec(secret, "HmacSHA256");      sha256Hmac.init(secretKey);      byte[] signedBytes = sha256Hmac.doFinal(data.getBytes());      return bytesToHex(signedBytes);    } catch (NoSuchAlgorithmException | InvalidKeyException ex) {      return null;    }你能告訴我我做錯(cuò)了什么嗎?也許我完全誤解了驗(yàn)證身份驗(yàn)證數(shù)據(jù)的方式,或者我錯(cuò)過了什么?
查看完整描述

2 回答

?
藍(lán)山帝景

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊

試試這個(gè),代碼有點(diǎn)難看,但效果很好!


public boolean verifyAuth(JsonObject Telegram_User){


    String hash = Telegram_User.remove("hash").getAsString();


    try {

        Mac sha256_HMAC = Mac.getInstance("HmacSHA256");

        String[] t = Telegram_User.toString().replace("{","").replace("}","").replace("\":","=").replace(",","\n").replace("\"","").split("\n");

        sha256_HMAC.init(new SecretKeySpec(MessageDigest.getInstance("SHA-256").digest(BezouroBot.telegram.getBotToken().getBytes(StandardCharsets.UTF_8)),"SHA256"));


        Arrays.sort(t);

        StringBuilder i = new StringBuilder();

        boolean First = true;


        for (String s : t) if(First){ First = false; i = new StringBuilder(s);} else i.append("\n").append(s);


        return Hex.encodeHexString(sha256_HMAC.doFinal(i.toString().getBytes())).equals(hash);


    } catch (NoSuchAlgorithmException | InvalidKeyException e) {

        e.printStackTrace();

        return false;

    }


}


查看完整回答
反對(duì) 回復(fù) 2023-06-21
?
慕碼人2483693

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超9個(gè)贊

這是我的工具


// define your token to a variable

private final String TELEGRAM_TOKEN = ""


@PostMapping("auth/telegram")

public ResponseEntity<Object> telegramAuth(@RequestBody Map<String, Object> request) {

    String hash = (String) request.get("hash");

    request.remove("hash");


    // Prepare the string

    String str = request.entrySet().stream()

            .sorted((a, b) -> a.getKey().compareToIgnoreCase(b.getKey()))

            .map(kvp -> kvp.getKey() + "=" + kvp.getValue())

            .collect(Collectors.joining("\n"));


    try {

        SecretKeySpec sk = new SecretKeySpec(

                // Get SHA 256 from telegram token

                MessageDigest.getInstance("SHA-256").digest(TELEGRAM_TOKEN.getBytes(StandardCharsets.UTF_8)

                ), "HmacSHA256");

        Mac mac = Mac.getInstance("HmacSHA256");

        mac.init(sk);


        byte[] result = mac.doFinal(str.getBytes(StandardCharsets.UTF_8));


        // Convert the result to hex string

        // Like https://stackoverflow.com/questions/9655181

        String resultStr = ByteBufUtil.bytesToHex(result);


        // Compare the result with the hash from body

        if(hash.compareToIgnoreCase(resultStr) == 0) {


            // Do other things like create a user and JWT token

            return ResponseEntity.ok("ok");

        } else {

            return ResponseEntity.status(HttpStatus.FORBIDDEN).body(

                    new MessageResponse("Login info hash mismatch")

            );

        }

    } catch (Exception e) {

        logger.error(e.getMessage(), e);

        return ResponseEntity.status(HttpStatus.FORBIDDEN).body(

                new MessageResponse("Server error while authenticating")

        );

    }

}



查看完整回答
反對(duì) 回復(fù) 2023-06-21
  • 2 回答
  • 0 關(guān)注
  • 286 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)