我正在尝试在 Spring Boot 应用程序上实现使用 Telegram 登录(https://core.telegram.org/widgets/login),但遇到了问题。
我一直在尝试实施他们提供的 PHP 代码来验证身份验证,但出了点问题,我无法理解是什么。
所以,这就是 PHP 上的代码
secret_key = SHA256(<bot_token>)
if (hex(HMAC_SHA256(data_check_string, secret_key)) == hash) {
// data is from Telegram
}
Data-check-string 是所有接收到的字段的串联,按字母顺序排序,格式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);
}
}
还有这两个方法:
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;
}
你能告诉我我做错了什么吗?也许我完全误解了验证身份验证数据的方式,或者我错过了什么?
蓝山帝景
慕码人2483693
相关分类