[ADD] BBVA ENDPOINT

parent 283692e4
......@@ -11,16 +11,15 @@ import web.multitask.trismegistoservices.singleton.bbvaSingleton;
@RequestMapping("bbva")
public class bbvaRest {
private final bbvaService service;
private final bbvaSingleton singleton;
public bbvaRest(bbvaService service, bbvaSingleton singleton) {
this.service = service;
public bbvaRest(bbvaSingleton singleton) {
this.singleton = singleton;
}
@PostMapping("/private/prepareRequest")
public ResponseEntity<?> getHeader(@RequestBody String json) {
bbvaService service = new bbvaService();
JSONObject response = service.getToken(json);
String token = response.optString("access_token");
if(token.isEmpty()){
......@@ -35,7 +34,7 @@ public class bbvaRest {
System.out.println("token = "+singleton.getToken());
System.out.println("digest = "+singleton.getDigest());
System.out.println("signature = "+singleton.getSignature());
return ResponseEntity.ok(service.generateQR(singleton.getToken(),singleton.getDigest(),singleton.getSignature(),json).toMap());
return ResponseEntity.ok(service.peticionHTTP(singleton.getToken(),singleton.getDigest(),singleton.getSignature(),json).toMap());
}
}
......
......@@ -73,20 +73,20 @@ class tokenRest {
boolean isTokenExpired = jwtTokenUtil.isTokenExpired(json.getString("token"));
if (isTokenExpired) {
response.put("message", "Expired Token").put("status", false);
response.put("message", "Token expired").put("status", false);
return ResponseEntity.status(403).body(response.toMap());
}
boolean oneLifeToken = tokenSingleton.isTokenAvailable(json.getString("token"));
if (oneLifeToken) {
response.put("message", "1-life Token is still up").put("status", true);
response.put("message", "El token de una vida sigue en pie").put("status", true);
return ResponseEntity.ok(response.toMap());
}
boolean validToken = jwtTokenUtil.validateToken(json.getString("token"));
if (!validToken) {
response.put("message", "This token doesn't exist, it might be created on malicious purposes").put("status", false);
response.put("message", "El token no existe").put("status", false);
return ResponseEntity.status(401).body(response.toMap());
}
......@@ -105,16 +105,16 @@ class tokenRest {
JSONObject json = new JSONObject(token);
UserDetails userDetails = userRepo.findByUsername(json.getString("username"));
if (userDetails == null) {
return ResponseEntity.status(401).body(new JSONObject().put("token", "").put("message", "Invalid Credentials").put("status", false).toMap());
return ResponseEntity.status(401).body(new JSONObject().put("token", "").put("message", "Credenciales invalidas").put("status", false).toMap());
} else if (userDetails.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("SERVICE"))) {
boolean onelife = json.optBoolean("onelife", false);
String generatedToken = jwtTokenUtil.generateToken((User) userDetails, json.optBigInteger("ms", onelife ? BigInteger.valueOf(0) : BigInteger.valueOf(3600000)), false);
if (onelife) {
tokenSingleton.addToken(generatedToken);
}
return ResponseEntity.ok(new JSONObject().put("token", generatedToken).put("message", "Generated").put("status", true).toMap());
return ResponseEntity.ok(new JSONObject().put("token", generatedToken).put("message", "Generado").put("status", true).toMap());
} else {
return ResponseEntity.status(401).body(new JSONObject().put("token", "").put("message", "Invalid Credentials").put("status", false).toMap());
return ResponseEntity.status(401).body(new JSONObject().put("token", "").put("message", "Credenciales invalidas").put("status", false).toMap());
}
}
......@@ -127,7 +127,7 @@ class tokenRest {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return ResponseEntity.ok(new JSONObject().put("remaining", remaining).put("message", "OK").put("expiration", dateFormat.format(expirationDate)).put("status", true).toMap());
} catch (Exception e) {
return ResponseEntity.status(401).body(new JSONObject().put("remaining", 0).put("message", "Invalid Token").put("status", false).toMap());
return ResponseEntity.status(401).body(new JSONObject().put("remaining", 0).put("message", "Token invalido").put("status", false).toMap());
}
}
......@@ -158,29 +158,61 @@ class tokenRest {
JSONObject json = new JSONObject(tokenBody);
String token = json.getString("token");
boolean doConsume = json.optBoolean("consume", false);
try {
String detokenized = jwtTokenUtil.detokenizeData(token);
if (detokenized.isEmpty()) {
return ResponseEntity.status(498).body(
new JSONObject()
.put("data", "")
.put("message", "Token inválido")
.put("status", false)
.toMap()
);
}
if (jwtTokenUtil.isTokenExpired(token)) {
return ResponseEntity.status(400).body(new JSONObject().put("data", "").put("message", "Token has expired").put("status", false).toMap());
} else {
if (!tokenSingleton.isTokenAvailable(token)) {
return ResponseEntity.status(400).body(new JSONObject().put("data", "").put("message", "token has been already consumed").put("status", false).toMap());
} else {
String detokenized = jwtTokenUtil.detokenizeData(token, doConsume);
if(detokenized.isEmpty()){
return ResponseEntity.status(400).body(new JSONObject().put("data", "").put("message", "Invalid Token").put("status", false).toMap());
}else{
if (doConsume) {
tokenSingleton.consumeToken(token);
}
}
return ResponseEntity.ok(new JSONObject().put("data", detokenized).put("message", "OK").put("status", true).toMap());
}
return ResponseEntity.status(419).body(
new JSONObject()
.put("data", "")
.put("message", "Token ha expirado")
.put("status", false)
.toMap()
);
}
if (!tokenSingleton.isTokenAvailable(token)) {
return ResponseEntity.status(419).body(
new JSONObject()
.put("data", "")
.put("message", "Token ya ha sido consumido")
.put("status", false)
.toMap()
);
}
if (doConsume) {
tokenSingleton.consumeToken(token);
}
return ResponseEntity.ok(
new JSONObject()
.put("data", detokenized)
.put("message", "OK")
.put("status", true)
.toMap()
);
} catch (Exception e) {
return ResponseEntity.status(400).body(new JSONObject().put("data", "").put("message", e.getMessage()).put("status", false).toMap());
return ResponseEntity.status(500).body(
new JSONObject()
.put("data", "")
.put("message", e.getMessage())
.put("status", false)
.toMap()
);
}
}
@PostMapping("/consume")
public ResponseEntity<?> consumeToken(@RequestBody String token) {
JSONObject json = new JSONObject(token);
......@@ -188,7 +220,7 @@ class tokenRest {
if (tokenSingleton.consumeToken(json.getString("token"))) {
return ResponseEntity.ok(new JSONObject().put("message", "OK").put("status", true).toMap());
} else {
return ResponseEntity.status(400).body(new JSONObject().put("message", "Invalid Token").put("status", false).toMap());
return ResponseEntity.status(400).body(new JSONObject().put("message", "Token invalido").put("status", false).toMap());
}
} catch (Exception e) {
return ResponseEntity.status(400).body(new JSONObject().put("message", e.getMessage()).put("status", false).toMap());
......
package web.multitask.trismegistoservices.services.BBVA;
import okhttp3.*;
import okio.Buffer;
import org.json.JSONObject;
import org.springframework.stereotype.Service;
import web.multitask.trismegistoservices.utils.CommonUtils;
......@@ -20,18 +21,25 @@ import java.util.zip.GZIPInputStream;
@Service
public class bbvaService {
String client_secret = "513375e5181e462fb3ec7a00dfc26dc7";
String client_id = "174895823298";
String grant_type = "client_credentials";
String globalDate = CommonUtils.getCurrentDateRFC1123();
public JSONObject getToken(String json) {
try {
JSONObject obj = new JSONObject(json);
obj.put("client_secret",client_secret);
obj.put("client_id",client_id);
obj.put("grant_type", grant_type);
obj.remove("body");
String host = obj.getString("host");
String formBody = CommonUtils.jsonToUrlEncoded(obj);
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://"+host + "/auth/oauth/v2/token")
.url("https://" + host + "/auth/oauth/v2/token")
.post(RequestBody.create(formBody, MediaType.parse("application/x-www-form-urlencoded")))
.build();
......@@ -62,7 +70,7 @@ public class bbvaService {
}
public String txtToSign(String json, String digest) {
JSONObject obj = new JSONObject(json );
JSONObject obj = new JSONObject(json);
String host = obj.getString("host");
String endpoint = obj.getString("endpoint");
String method = obj.getString("method");
......@@ -79,7 +87,8 @@ public class bbvaService {
}
public PrivateKey loadPrivateKey(String path) {
try(InputStream in = bbvaService.class.getResourceAsStream( path)) {
try (InputStream in = bbvaService.class.getResourceAsStream(path)) {
assert in != null;
String keyString = CommonUtils.readInputStream(in);
return loadPrivateKeyFromString(keyString);
} catch (Exception e) {
......@@ -113,44 +122,77 @@ public class bbvaService {
}
public JSONObject generateQR(String token,String digest,String signature,String json) {
public JSONObject peticionHTTP(String token,String digest,String signature,String json) {
try {
JSONObject obj = new JSONObject(json);
JSONObject body = obj.getJSONObject("body");
String host = obj.getString("host");
JSONObject jsonBody = new JSONObject(json);
String host = jsonBody.getString("host");
String endpoint = jsonBody.getString("endpoint");
String extra = jsonBody.optString("extra", "");
String method = jsonBody.optString("method", "get").toLowerCase();
MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
RequestBody requestbody = RequestBody.create(body.toString(), mediaType);
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://" + host + "/pe/request-to-pay/v1/qr")
.post(requestbody)
MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
RequestBody requestBody = null;
if ("post".equals(method)) {
JSONObject body = jsonBody.optJSONObject("body", new JSONObject());
requestBody = RequestBody.create(body.toString(), mediaType);
}
Request.Builder builder = new Request.Builder()
.url("https://" + host + endpoint + extra)
.addHeader("Content-Type", "application/json")
.addHeader("Accept-Encoding", "gzip")
.addHeader("Authorization", "Bearer " + token)
.addHeader("Digest", "SHA-512="+digest)
.addHeader("Signature", "algorithm=\"rsa-sha512\",headers=\"(request-target) host date digest\",signature=\""+signature+"\"")
.addHeader("Host",obj.getString("host"))
.addHeader("Date", globalDate)
.build();
.addHeader("Digest", "SHA-512=" + digest)
.addHeader("Signature", "algorithm=\"rsa-sha512\",headers=\"(request-target) host date digest\",signature=\"" + signature + "\"")
.addHeader("Host", host)
.addHeader("Date", globalDate);
Response response = client.newCall(request).execute();
String bodyResult;
System.out.println("x-request-id = "+response.header("x-request-id"));
if (response.body() != null) {
String encoding = response.header("Content-Encoding", "");
if ("gzip".equalsIgnoreCase(encoding)) {
bodyResult = decompressGzip(response.body().byteStream());
Request request = "post".equals(method) ? builder.post(requestBody).build() : builder.get().build();
StringBuilder requestInfo = new StringBuilder();
requestInfo.append("URL: ").append(request.url()).append("\n");
requestInfo.append("Method: ").append(request.method()).append("\n");
requestInfo.append("Headers:\n");
for (String name : request.headers().names()) {
requestInfo.append(" ").append(name).append(": ").append(request.header(name)).append("\n");
}
if (request.body() != null) {
try {
Buffer buffer = new Buffer();
request.body().writeTo(buffer);
String bodyString = buffer.readUtf8();
requestInfo.append("Body:\n").append(bodyString).append("\n");
} catch (IOException e) {
requestInfo.append("Body: (error reading body)\n");
}
}
System.out.println(requestInfo);
try (Response response = client.newCall(request).execute()) {
System.out.println("x-request-id = " + response.header("x-request-id"));
String bodyResult;
if (response.code() == 204) {
bodyResult = "{}";
} else if (response.body() != null) {
String encoding = response.header("Content-Encoding", "");
bodyResult = "gzip".equalsIgnoreCase(encoding)
? decompressGzip(response.body().byteStream())
: response.body().string();
} else {
bodyResult = response.body().string();
bodyResult = "{}";
}
} else {
bodyResult = "{}";
System.out.println(bodyResult);
return new JSONObject(bodyResult);
}
System.out.println(bodyResult);
response.close();
return new JSONObject(bodyResult);
} catch (Exception e) {
System.out.println(e.getMessage());
return new JSONObject().put("status", false).put("message", e.getMessage());
......@@ -159,13 +201,16 @@ public class bbvaService {
private String decompressGzip(InputStream compressed) throws IOException {
try (GZIPInputStream gis = new GZIPInputStream(compressed);
BufferedReader reader = new BufferedReader(new InputStreamReader(gis, "UTF-8"))) {
BufferedReader reader = new BufferedReader(new InputStreamReader(gis, StandardCharsets.UTF_8))) {
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
return sb.toString();
} catch (Exception e) {
System.out.println(e.getMessage());
return "";
}
}
}
......@@ -4,6 +4,7 @@ import java.io.Serializable;
import java.math.BigInteger;
import java.util.Date;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.JwtBuilder;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import io.jsonwebtoken.Jwts;
......@@ -38,39 +39,46 @@ public class tokenUtils implements Serializable{
public String tokenizeData(String data, BigInteger ms,boolean onelife){
Date expirationDate = new Date(System.currentTimeMillis() + ms.longValue());
return Jwts.builder()
.setSubject(data)
.setIssuedAt(new Date())
.setExpiration(expirationDate)
.signWith(Keys.hmacShaKeyFor(onelife ? jwtSecret2.getBytes() : jwtSecret.getBytes()))
.compact();
JwtBuilder jwtBuilder = Jwts.builder();
jwtBuilder.setSubject(data);
jwtBuilder.setIssuedAt(new Date());
if(!ms.equals(BigInteger.valueOf(0))){
jwtBuilder.setExpiration(expirationDate);
}
jwtBuilder.signWith(Keys.hmacShaKeyFor(onelife ? jwtSecret2.getBytes() : jwtSecret.getBytes()));
return jwtBuilder.compact();
}
public String detokenizeData(String token, boolean doConsume){
public String detokenizeData(String token) {
String tokenReturned = "";
try{
tokenReturned = Jwts.parserBuilder()
.setSigningKey(Keys.hmacShaKeyFor(jwtSecret.getBytes()))
.build()
.parseClaimsJws(token)
.getBody()
.getSubject();
}catch (Exception e){
try{
tokenReturned = Jwts.parserBuilder()
.setSigningKey(Keys.hmacShaKeyFor(jwtSecret2.getBytes()))
try {
tokenReturned = getSubjectIgnoringExpiration(token, jwtSecret);
} catch (Exception e) {
try {
tokenReturned = getSubjectIgnoringExpiration(token, jwtSecret2);
} catch (Exception e2) {
System.out.println("No se pudo decodificar el token con ninguna clave: " + e2.getMessage());
}
}
return tokenReturned;
}
private String getSubjectIgnoringExpiration(String token, String secret) {
try {
// Parsea normalmente
return Jwts.parserBuilder()
.setSigningKey(Keys.hmacShaKeyFor(secret.getBytes()))
.build()
.parseClaimsJws(token)
.getBody()
.getSubject();
}catch (Exception e2){
System.out.println(e2.getMessage());
}
} catch (ExpiredJwtException e) {
// Si está expirado, aún así devuelve el subject
return e.getClaims().getSubject();
}
return tokenReturned;
}
public String generateDataSource(JSONObject json){
String dataReturned = "";
......
-----BEGIN RSA PRIVATE KEY-----
MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQDVIDkTVL8M/Dk/
quE7vJTb/UO3POzi/rpv12e8aDHTLt41HgrIqEhcepiYTzo3hlQE5FmfhUG2StDP
gFVmnLBeQnMdiExENqfLGmvJoIH0mPgYV5Abk0O+yBelS4GUMg8FOxnWykSkWAm4
gm+J2xLhNcQvApGawJvIg7nhj8NHxx2kfrZyihJeY7ZySZHmpRPuDPKuHpssnZjJ
Coo4jY4TpjmgImYIlCXlvSx5Qe3INTyLZEzcSALno1saT+4bI3sk4tB/QVnjBHtD
vwkTeSUYVA/PoGy76gEyv42hGyIMrMnlq29f5/Fu6wjKPYjYK8B1t+xKWmaabVun
3BmwipKfxXpEZQr49w1tJp9Zvg4r5VUxLB+rtp4dDFDTR5bBuJuLm6wmnWGKRBlL
eNOOsUAZHGkgfJmgl9F8KGo//hbKkaDg/QV0HmHOPOpFmMb3HH8KymyPt3mjxcyo
hwyaScpXdCAx1lSaiCelvo7ykU9fbeNCwwizoBlV0WmNdSz2Hgu6UTSj8V9uvMPS
4kl3W/arD/7Sy+idncYu/6hplOyOJ0FYkiyINi7kmiXOyEO/QX73FqwfiCwEh8+y
Q0qginuVACfetj81RxrwkyvuF/kK24WUZP0ELvirJzuqaKy6r9RiPElM78GmI3L8
HdxJa/lovp7yRbbu4Fu7BWKj0lLJ2wIDAQABAoICACrlpHdOnHG5prA47cK/T1sE
HAgavDdoPBBc0+VpN3YhPdqFJHiE3qO2jVZCxB3+7JRbfeqMwNA3ONY7J3VS3nDq
gQ8Vqvwj4BwSQlW/98hKrc0AeuIB/yW8Un4Tt44jkUBlR+sipTRLABHiNx8RODia
QNWRd8slL3XphZVwAUdGPaIpWwGs5suW2FcilbpNybglZQdE48jUI7d7ZpzBaTJt
R7YClnTtlL8sF3KEoZ6lkH0iABJqcCM9jw25vtw5hQTEnmCuv6/g7AqTvfjsbln6
OYB58sjT7c/QHGqr8muIr86Jdg5gugiwSAGk5xFTpRZMocPJdFNq5YLg207cZWxj
Gl+P2mxgYHEUroipm+2PyqqX/btLwmrx+EsAKH15sJnrbs7IYJ0Q2jJErSuORLH8
43kxpF7ESzwUr+7iEpBFYEMhcDwzOGLv9KrHIo5RlLf93136EQ0sHBdElf44Flv3
gicsjxeLVTHO1kUgdPanJkZuDmArVqAwLlqUpxV1Lh0zqVVZuHOEwVmSXTyNZlSz
5a11FbFXt07mt7KfL633S8FNN8TvV306yeWE/L2+l5vi1U877DLXQK49o23whhTV
wdgqRhVbqpC3foYC3pDc5UZ4IO89lFIuw81fW7DCFPM2PLOqxJ4QhzcT2O8Dwhhl
mpkAIHHWRsDsXU/0vodRAoIBAQDwcUSrpMjOKWBLKNDkLJp6M834D5rJgQlnUPg9
iE7s7/ekqWseP/ThTnHCqU68Pqk59oovgTuUdaS30ObRKhCNlbXLajMq2kE03O1A
m/bvLiSl9DrhuwXkV5ewH5PBt16046f1+4FyKur8tzGPZVj4lOSNyO+rYM3PX4NE
71sDb9WdfbhQYCKodxNcoL8wX2JFgH0Ek0IsKhf/OZM4REUu/5+2crAN/p58qoLU
PCZT7U+EuYx/isq9IfjMBJp8bEHdr7hmmw4tfp17CmMQAZUql8Mbf4b7Gek6web+
7/xwFff56jdg3BShvXnmSpao80zXKm6K7RGKu2w6/eph4ONZAoIBAQDi6npajn4L
ajP/yATDW3sHLdblayhmPUJydWLSj9LggxUyUwQEgkzfJgDqoi6AYg91Wddj/BxD
HH1BmDYvKtKqAN+C+T/p80vk88WIclAwrDfQ1muXVKEoSdG71BJZVJYVYfE+mn+H
Mb9HSPToVXEZM3pSk7xkh46IU4oU4g9i95qv+lwwf2svWx9cOn0BPyx9rCr9jdzS
zr//tAlnsbbGqEv8DpK3SfBAoCUaMtKFov7L+KDJ9KRx3Hx2headwAobzKtdR5Zx
n6e6T+WitU5OFefZirK8rgfdkjutGS1g/nP6hxqJZiTmvMFT9iwBH+rjL4edzhOf
KvzP+mfZszRTAoIBAQDv+u1iL5cohY2RloxfoNER9RC3bMO+KOc80kjiCWFVBPFz
zJCYYZdFJSlP8/Ic2qHGs3Yake7obz7XJE6sJ0LcPbdz7mxhcfMxEuxN1xzwfmqf
pJL8Z9Eqpe5FIE82QpHpE2u5jKwXShS95Q43JB1YBivUA+CKeZURTDBVplx9oqpf
hXJn7nvJDwgpJFuOqTUJT4P4BA5AzEalO07gEuvGS+aZkAB+B0sh/IGV2O8cRzhd
rWA4kEtn2DddUZ7rXpWi8Naouku9Rqlhe+2BtUKvf0eB85fCmYr6VTv76YVYTeTx
8D4Tk7WX9Ohs3Ldgq21fN/+a86DVidktS+8af/4JAoIBAHygP1bhD8UBLVH77vHE
motU18Pk2KleV9I5Om9e4njARbH/+iLn1YRxgOtc66FDOi4/i5a0bmlFil2uVYQO
Rulr1VY/wqShJTu3zvOjpPs2eulN+oWAy4ovEOvSC8nYNR3FTxQNEqGT5vQl06yO
0LEAntwfm8ay1Mt25k2V4tF+IA0qudtBAANgTpb+4I0Av1S+bFYZxgBZ4QV1Qf0b
k8EDycfD0TytdTBpRDdhVlJjNQGdqeGBZZfLeug1nnVhdavS+wMeQDhjcWFYZEy6
uykTyuSl0ojiJBvDJtdpDo1I8zXTYfW4jefUH3IXsA9mEkF4Z0l6VziCCZvIcaUV
UVUCggEBAN4tvBUf1IX5shxoDjBcte+UwYovZhmnfjgRKASjir4vAVm42FNCsgFc
IOtuOsvctXAoeyKM0aq0sBLYy1SE/HDqrsEGFWA8Bwv1TrbFN3iXjyCZcwgrKKVj
kRZJGV6m38RNQfm2GKeYaBh7Qa9m7S+fb5xILRQGPNzHJsV+nthp9lQo9zKev4yQ
kNIKnLvkFzhgUcdz0QGro/UQot2BeYSVdOQGTfKVwfaQrzERRH7TxsPpeNdy2byG
Fu28XFnxpu8af76rhja22Jz7nAFYHLuHp4KFMEN7rjb4LuF6a/ThrBMpwTpLIlep
PnpOxl5jWjhzfwkOcU5V+qBdkCd+fWo=
MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQDGI3Ro7kPh3pmd
hLzI4cdonCVRVMF+KnsmRqIzzcN9sDPa212yM5fUwaVD8IfG7rSECRteGswNzZAT
ivc/5Ephm6DtxZ2Ww92MF0AMb115Aup42Lpa/SepDQm0SwP5XkLk+qV82KyDSbfx
AwhFGwgpBCBk6UxoU7hRxq/RDS+MagVQKT7kza5rlIN3G5kTy8WTyQXZ2YX8jBbB
sEAoLyFC7ICyOv4Wp3LiI0wAJ+zLsIWp6eQcKukr0GwNDSpwg4FlAOnNqFnymv7m
hlMHjZegCNb5LxMzCIw/YgfDGkPcZWHNRnWe11VlwwVNl/WqJYTItxoroSGPij2u
8wpgH05rhlQm8YEL0WDPyn2eVXjBPvGz9knVSEjVorK0mSYEqOCPyoLwCEJCyk8Z
huVSh6ZbIYNN7R6QJShTYwv0BHBFdErYYQCzKVDu5UYGfNmK7GYM/PYHnetl9+mr
sbiAtGpX90cVswPX2dtTbodxlO/KUUTGyFJGYz4uqKkm5QKt+vgv4zCz8hrH4rml
1snljsXDETF1pN7oKcheRMWKiwyHm/Z9ePSjq1aI5T4MBIGzxUCdsTNIzgc1UO9y
AlbgJK7jKnpf5xo7DJXEbLPWK/AusCgB+E6GEjuPiwiwjgV+V7mRgFqDVIiMPM+i
jzMYyMFJNHkzI84oC7vkwMQ1n3zuQQIDAQABAoICAQCIV5NeNT6e6ZdZTiK+NKcM
NA511dXD5KWTZB1velLgZWR5YGQsINaEv6/ifVxhJpcvGDkt21C42tAesoyK+aO5
YOcvVsGnIiaMpN8c73EpuTjxaWlq/TLSYDdiShB1A0kS2esQauTi/tJFVWnWa9CE
sOM9rVA3pgx6sTcAqosimz4GuCsgNOyl+K8yQdpnRdwyYqzVCJrretaZ95deT3ga
3jV8750yp40lUVaV8ONAErsXfevK+jgzPxtrK7kdbVCX2TYJn6QtjjyDEsGFvAgv
RoXvOFaE0of3gZSHy8YQne7b23VKlTCdcsJub3fL2j9yApVOmnVGmcDyZymnlUNX
AWCW4r6ZNKO8ftgQB4B7fwEakG2CQcIk2+eP2fMmLvBV44jloBap3z0HrXZSim3f
ZiVIWur5AsyouQ04H4KzN9NAV/CbFt0QcJyHeo3py3/BbrpmGxqVhBUd7cplVxwn
mn9GELmI/KBAeLW4vMaXjObUf4ZM+u3cx5YBYSO5by+YfVbNdr48tX4hTeY44d30
F4fmRUgKrwaqw7j0YacGGzro7eNhwXSrP+JcF5fgCJxdbOQ1rrYyKhF1YOiC9vmL
kH3JjcUHxMFOe89HbmhCDZ0NPmjrBW6Cr6HpVSk7qoanfxCbp78d/Vu49HMX+jM2
qNAk+5zF0XAx/rtriu03wQKCAQEA0LkUgWNrdCMRUAKNJEIdfyp36POU8K0Rr4jL
I7yZOofBlku0Q27InxFSF5j5pIeTLgZVYLkSTGNTLdQCvQPIwPa8Q7NLlMbMuONP
AoexhjVd3/fr1TCV6aVEPuAKomcs543xJbWonGMtY07PQ9Hn6Oou/Ffct31W4GzV
EBj6tlDa945MOWRyhkGVqsIFmSyup5fO+M4oRGbesrpZE3UQtmhYE9QJ5iwfxAmL
RwTqojtcD5lTpvHXGzEQMi8/hpRH3x0RlN9L8z+yZ6RJAf+Rl40+LbtBtYOLuHzz
7Z9NxsqtfX2jzLVF9aglV6MbZssCUWg3y91xxqdllIa+8b42mQKCAQEA8wSgvQak
VibAupEk9fgPa85JlQxZSiKvQhhd5qHz4st4G17JmCwBPV+ED7tWTM+9heQOWe9Q
wLJchH+9Y+eQbIPsXfckXD5MICzg+rZHUFlVvjL7WEheLaTmxVHd9ipjy72Fn2v/
/JtGckYqJpF/ukKYcSFSyAYfVunwtYJRygmrky3b4qz+Jv7vl/DhRSmxVFdX3LT2
yH79XlqNX9gLHNcP0ERHy2hWxK2I8XaLIjZRyRoDk9ZkVWMyCr/0luz93ROTy2rx
rWlI1Tat4VH7j+BIKxDq0/oBXou1aT9OPUe662Ok5+AjqimSGERM8HTN+tR1YDrF
2GrhsQgbb5ZF6QKCAQA8RcXrGzeTYPEF5sa1OrZj23Km/Xf8DC44P0tR9YtWAI/h
g9j5RAuBC7JmCBHG9jOFLeUHuknTbzc826Uyyd32AwoYjrT7sHC7z0AoneCgvdZu
75vVg2M3Bjdv5KiNfzfTYgTJ++xFxMn9jGuDzSCn/MA2tHSTNAmbYzIfpOb5MN4a
cKgIRr5fkJ7UoZSWR/XjhY4KARZVslMKz48bdEmwMu+EQk3dfs5pgMwMZRoQYQ3T
n1YttlaEjqV7qHMyvK0Ie89w6w52nuU40pMWlaOIXQwgjpuJ/AOj8clKzB7ckfiJ
bXeYjJw4NScbaIloJKV1tp+uKjNJx1spCcQn8OK5AoIBABG5iK/AyEOwV+ZDp9p4
2UcXqK5CVFDf7sB3XoHv1gX4qS313+ZFb2G2kb9D/qtji4M0ewd8OPuVBsJzPrEG
trXzeU3xNKm1sX+3RkGDAfiOS36v4T0zKgtSN7K0oefOd7DohdJ24hjeimjTTUe6
3QIM0WmO8Ka+K5L/RRs4AhcmVWlKsvr5eyAFAByo6QVOYSyxoirq2AUPnhM/r4gK
DeVwmiqqkEH5vjpiHdbeuo8oPxbX2uLxhCfmMEQwc/p+FpYFU4ZGqpHnV/SVJGGG
xT5dMWZSuY30ch0fO4ANqfs2PB/nCKQQ6QkENy+l66auHkfpLxZxsvRx9zweR0IA
R+ECggEBAJLGO/CQ9X735PFtIjTMAjgEF3j5R2AyHJoc1RqIE6qLczPPPO4i9uXB
s4WOjfP0G/X6/9nyM+BnKs7QpJEwZHmppaZ5ukjZhnuVrYMLeHTJw276NXqtdToI
PXcLyKIqrqCYkk9o2+bRFH3U52YldI2O9mPv4+9MYHVCLBESlHhwBw5llyFrqkYw
jp3xNensd+/UqY/CjymD5fVxJN03nnBTFMHeXVLRO43Xc6zV5scC8EOehSKs6NIc
FOYDTTLs3XMdS4tykRAwQ2OpnEs1Fk6w3Q6xmr8KvNlfh3DxFvW2gVryezKta0Ep
0GMizk9iG+w4xxSK0eWBPYKtS4NBPxw=
-----END RSA PRIVATE KEY-----
\ No newline at end of file
{
"type": "service_account",
"project_id": "trimegisto-planilla",
"private_key_id": "ec3ed783ba6ce35de0367caacbff70b35baa4d8e",
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDYi4NVOq7o5axq\nXpfiHaMUhpfDfty56AkzjD3mf9phPar3OsCtudKjNFt4S5i3IhBRXq8ytfV0h5F5\nFF+cNOZKacTCv66vT3hUS2qvWdlsm+0LKZEGWXMBRAJfQUroCxQP37jd7am+rFCA\nioGRR2+n3a++HRa/y1olV2uY3rJFd35yFCi1oS9ObjxzFCWM2kHemM1XBjUWDbFf\nynC/PEj1lv1ASVIO5wr9iL6ZXlLItmewmWd1ZvLfV9dcpvZSOhK1AaPIy1CQcSkh\ny6ul5c6TPK7XZEMs23kSy7mSKitTVQrnzu1qn0szxVqYyI8eqVbfgsoXShaf4kWh\nvsyo9kzBAgMBAAECggEAIXRkZO19ClQ5b/GPS4rCoDAvEC/wT/RuP32CLrM//Nf3\nKtzz2aMkzLwRCaO8Q0bK+JdFP/NmqYssSWWBY/O0RHjUwjW0+jav424HXHHoKmRo\nmdnhIvb80ow8RZUjynezsMQinn7SQ7gBc+pyHAzKTkfsl9WMpzL2iWBZKjP1nM+R\nhAJXYTKPdPX4aOEo/CldvoU23lfxhhMM8aCcKWb9kpu/W5qdInhh8FnJZdRk+Ad3\nziJQRJvzLGCvxbCjYwNQbybjMFH3vJQp/jvcA9JluxQQfFfqCZd7bON+r+aDFALR\nLy/TFAwtLcB6ggXx2Gm//1QIdwWImFoFaoFcceSxxQKBgQDsfeoqs1tsNFw76l/O\nUkxIp8wqwxgvbmxA9bshZE4xiE76HOWJ3SVCPCmW984hVzwzh85vcdWQeHakrorG\nJ5d8HnR83/MItiJRB9GD8o8HuhRkEjGYymgtzCuln2HmNJrUfkoYF8QLEN3ctQrd\n49vxKjs8hMlsScqSfjjFXPU56wKBgQDqaF9oSfqz6xT56dS7n4ehLZ9Q/2qmaOL5\ngxOwfu4388IvZswpJ/v6Pieps5IYMv1bFNc/I7+1x7IKI/K+7bVWblEEpQEJdqQj\nQradiCTASaafKGbq+ObqyG9kSm/NT7r3VCDhDwNe1TchL5tPOFWxVJfIwrgY9Nw2\nZlRSTtUdAwKBgFNDWcjC8TM9lCO8NxMLQrRp76Y2njNE63RLkCEHkcg6t6OzvNU3\nOUECsZnnkXmHnzh9Xh86svh0kUEV+uIdWmZmypiUuJqelaJ14DxWkCkmSLua9D9Z\nNCi7s7pSTUOhzcl21Vt6Mpm6zIJCc5r/+JYGSmjaT5iCuoGtUwuZ2PUVAoGBANRu\nrHA2A0cEd+kY+Zrjs6XlU6mzH/MZwQFAwhpEnh0FAum0breprdkWdRl9TJwzsZnW\npE9rVXUnOfmopHhVsu5WYYQlCXCLHat67UaMuEmvNZqtob+2vIbwCMtKDlJxvE4i\n5v0vfu11q1We8FB2DGr97+SYWwD6/4spZ6eEG+0DAoGARXQLveeSo4OVpbg29eQ9\n0bPOfYKjF7vNAGf0yDB19fgrQmz/MxaN0KKfIqXb91kFL2TZg9ekwNwN42cH0TJU\nlvIXfOjF4oXcCC1x2b5J7a3FlLrYGJZXiWapF0rg9KtvsfnEFwfucwvfWG6tOYh9\n3UgwfMV9qHCMRN1tvfbzXJo=\n-----END PRIVATE KEY-----\n",
"client_email": "tp-services@trimegisto-planilla.iam.gserviceaccount.com",
"client_id": "109307993437397271961",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/tp-services%40trimegisto-planilla.iam.gserviceaccount.com",
"universe_domain": "googleapis.com"
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment