bczsalba / ekreta-docs-v3

Unofficial documentation for versions 2 and up of the e-Kreta API.
MIT License
44 stars 8 forks source link

Bearer token: invalid_request #8

Closed szimszon closed 2 years ago

szimszon commented 3 years ago

Nem tudom tud-e nekem valaki segíteni?

curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -H "User-Agent: hu.ekreta.student/1.0.5/Android/0/0" -d 'userName=xxxxxxxx&password=xxxxxxxxx&institute_code=xxxxxxxxx&grant_type=password&client_id=kreta-ellenorzo-mobile' https://idp.e-kreta.hu/connect/token

bearer token request nekem:

{"error":"invalid_request"}

-et ad ;(

Mit rontok el?

szimszon commented 3 years ago

hm, azt authentikáció jó, mert ha hibás jelszót adok meg akkor azt mondja, hogy

{"error":"invalid_grant","error_description":"invalid_username_or_password"}

szimszon commented 2 years ago

Az https://" + instID + ".e-kreta.hu/idp/api/v1/Token használatánál ezt a hibaüzenetet kapom:

{"IsException":true,"ExceptionId":"5a3ceaff-79e2-4195-86b3-12231c972979","Type":"SqlException","Message":"CREATE DATABASE permission denied in database 'master'."}

;)

FightMan01 commented 2 years ago

Eddig működött, most én is ezt a hibát kapom. Szerintem megint variáltak valamit.

FightMan01 commented 2 years ago

Megnéztem, hogy a telefonos kréta app hogyan csinálja a dolgokat:

POST /connect/token HTTP/1.1
Host: idp.e-kreta.hu
X-AuthorizationPolicy-Version: v1
X-AuthorizationPolicy-Key: qso1xLkgM1K2ujX2NiWCuPvyRWitioC1O4ItAU1GKXN1lgB060nBD3tm2AkXSSWO2N8yx0YqLSUE3refAcyRMw==
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Connection: keep-alive
X-AuthorizationPolicy-Nonce: OwLOEZCkhmaFLHM8FsQWmA==
Accept: */*
User-Agent: hu.ekreta.student/1.6.1.183403 iPhone13,2 iOS/15.0 CFNetwork/1312 Darwin/21.0.0
Accept-Language: en-GB;q=1.0, hu-HU;q=0.9
Accept-Encoding: br;q=1.0, gzip;q=0.9, deflate;q=0.8
Content-Length: 122

client_id=kreta-ellenorzo-mobile&grant_type=password&institute_code=ISKOLAKÓD&password=JELSZÓ&username=FELHASZNÁLÓ

Ami innen fontos és kell is neki az ez a rész:

X-AuthorizationPolicy-Version: v1
X-AuthorizationPolicy-Key: qso1xLkgM1K2ujX2NiWCuPvyRWitioC1O4ItAU1GKXN1lgB060nBD3tm2AkXSSWO2N8yx0YqLSUE3refAcyRMw==

Az X-AuthorizationPolicy-None lekéréséhez csak egy GET request kell ide: https://idp.e-kreta.hu/nonce

FightMan01 commented 2 years ago

Viszont ahogyan elnézem ezt nem lehet folyton újra felhasználni.

FightMan01 commented 2 years ago

Az appba való bejelentkezésnél csak ezek a kérelmek futnak le.

image
FightMan01 commented 2 years ago

Viszont a filc napló kódjában megtaláltam ezt:

Nonce getNonce(BuildContext context, String nonce, String username, String instituteCode) {
  Nonce nonceEncoder = Nonce(key: [53, 75, 109, 112, 109, 103, 100, 53, 102, 74], nonce: nonce);
  nonceEncoder.encode(username.toLowerCase() + instituteCode.toLowerCase() + nonce);

  return nonceEncoder;
}

nonce.dart:

import 'dart:convert';
import 'package:crypto/crypto.dart';

class Nonce {
  String nonce;
  List<int> key;
  String? encoded;

  Nonce({required this.nonce, required this.key});

  Future encode(String message) async {
    List<int> messageBytes = utf8.encode(message);
    Hmac hmac = Hmac(sha512, key);
    Digest digest = hmac.convert(messageBytes);
    encoded = base64.encode(digest.bytes);
  }

  Map<String, String> header() {
    return {
      "X-Authorizationpolicy-Nonce": nonce,
      "X-Authorizationpolicy-Key": encoded ?? "",
      "X-Authorizationpolicy-Version": "v1",
    };
  }
}

Csak sajnos nem sikerült még ezt átfordítanom pythonra.

szimszon commented 2 years ago

key: [53, 75, 109, 112, 109, 103, 100, 53, 102, 74]

Szép, ez így hardcode-olva? Nagyon nem akarják, hogy más hozzáférjen az api-hoz. :-(

FightMan01 commented 2 years ago

Hát nem, de minket nehéz megállítani :D

szimszon commented 2 years ago

A webböngészős megoldás sem tűnik egyszerűnek ;(

Hogy lesz ebből Matrix bot? ;(

FightMan01 commented 2 years ago
import requests
import hmac
import hashlib
import base64

key = bytes([53, 75, 109, 112, 109, 103, 100, 53, 102, 74])
nonce = (requests.get("https://idp.e-kreta.hu/nonce")).text
message = bytes(f"72428098780klik036729001{nonce}", 'utf-8')
dig = hmac.HMAC(key, message, hashlib.sha256).digest()
generated = base64.b64encode(dig).decode()
headers = {"Content-Type": "application/x-www-form-urlencoded; charset=utf-8","User-Agent": "hu.ekreta.student/1.0.5/Android/0/0", "X-AuthorizationPolicy-Key" : generated, "X-AuthorizationPolicy-Version" : "v1", "X-AuthorizationPolicy-Nonce" : nonce}
r = requests.post("https://idp.e-kreta.hu/connect/token", data="username=FELHASZNÁLÓ&password=JELSZÓ&institute_code=SULIKÓD&grant_type=password&client_id=kreta-ellenorzo-mobile", headers=headers).json()
print(r)

Nekem ezt a Python kódot sikerült összedobnom a dart alapján, viszont ez nem megy. Ha valaki tudja, hol rontottam el, nagyon megköszönném, ha elmondaná :D

szimszon commented 2 years ago

Nem lehet, hogy az User-Agent-et is vizsgálja a szerver?

FightMan01 commented 2 years ago

De, nézi, viszont az én telefonom által használt user-agentel sem ment. Itt szerintem az X-AuthorizationPolicy-Key generálásával van a baj.

FightMan01 commented 2 years ago

Sőt, szinte biztos, mert megnéztem azt a nonce-t is, amit feljebb küldtem (OwLOEZCkhmaFLHM8FsQWmA==) és erre nem azt kaptam vissza, amit kellett volna :/

bczsalba commented 2 years ago

Sziasztok!

Nagyon szívesen segítenék, de sajnos már nincs élő Kréta hozzáférésem. Hogyha bármit találtok kérlek értesítsetek és/vagy csináljatok egy PR-t hogy mások is lássák :rocket:

Sok sikert!

szimszon commented 2 years ago

Hi,

sha256-ot használtál: hmac.HMAC(key, message, hashlib.sha256)

sha512 helyett: Hmac hmac = Hmac(sha512, key);

szimszon commented 2 years ago
import requests
import hmac
import hashlib
import base64

username='xxx'
userpass='yyy'
iskid='zzz'
key = bytes([53, 75, 109, 112, 109, 103, 100, 53, 102, 74])
nonce = (requests.get("https://idp.e-kreta.hu/nonce")).text
print(nonce)
message = bytes(username.lower()+iskid.lower()+nonce, 'utf-8')
print(message)
dig = hmac.HMAC(key, message, hashlib.sha512).digest()
print(dig)
generated = base64.b64encode(dig).decode()
headers = {"Content-Type": "application/x-www-form-urlencoded; charset=utf-8",
    "User-Agent": "hu.ekreta.student/1.0.5/Android/0/0", 
    "X-AuthorizationPolicy-Key" : generated, 
    "X-AuthorizationPolicy-Version" : "v1", 
    "X-AuthorizationPolicy-Nonce" : nonce}
r = requests.post("https://idp.e-kreta.hu/connect/token", data="username="+username+"&password="+userpass+"&institute_code="+iskid+"&grant_type=password&client_id=kreta-ellenorzo-mobile", headers=headers).json()
print(r)

---->

{'access_token': 'eyJhbGciOiJSUzI1NiIsI...fm4Bx2pet-g', 'expires_in': 1800, 'token_type': 'Bearer', 'refresh_token': '1003...04295', 'scope': 'kozelkep-webapi.public kreta-dkt-webapi.public kreta-ellenorzo-webapi.public kreta-fileservice-webapi.public kreta-mobile-global-webapi.public offline_access openid'}

FightMan01 commented 2 years ago

Oh, király vagy. Bár nem jöttem rá én mit rontottam el. Kb ugyanaz az egész 😅 Annyi, hogy én hardcodeoltam az én adataimmal.

FightMan01 commented 2 years ago

Basszus Már látom :D Hülye vagyok...

FightMan01 commented 2 years ago

PR-t nyitsz?

szimszon commented 2 years ago

Te írtad át pyhtonba én csak fogtam egy typo-t. ;)

szimszon commented 2 years ago

Hogy a headereket és a fentit belekalapáljam a lib-be nekem több idő kell, ami valszeg a jövő hétig nem lesz ;(

Ha van érkezésed és időd megköszönöm, ha javítod a kódot egy PR-rel. ;)

FightMan01 commented 2 years ago

Okés, akkor csinálok egyet. Köszi a felfedezésért, tegnap vagy 6 órát foglalkoztam ezzel és még mindig nem hiszem el hogyan nem tűnt fel :D

bczsalba commented 2 years ago

Megvolt a merge, köszönöm a munkátokat!

szimszon commented 2 years ago

eKréta -> Matrix bot