[ADD] BBVA ENDPOINT

parent 283692e4
...@@ -11,16 +11,15 @@ import web.multitask.trismegistoservices.singleton.bbvaSingleton; ...@@ -11,16 +11,15 @@ import web.multitask.trismegistoservices.singleton.bbvaSingleton;
@RequestMapping("bbva") @RequestMapping("bbva")
public class bbvaRest { public class bbvaRest {
private final bbvaService service;
private final bbvaSingleton singleton; private final bbvaSingleton singleton;
public bbvaRest(bbvaService service, bbvaSingleton singleton) { public bbvaRest(bbvaSingleton singleton) {
this.service = service;
this.singleton = singleton; this.singleton = singleton;
} }
@PostMapping("/private/prepareRequest") @PostMapping("/private/prepareRequest")
public ResponseEntity<?> getHeader(@RequestBody String json) { public ResponseEntity<?> getHeader(@RequestBody String json) {
bbvaService service = new bbvaService();
JSONObject response = service.getToken(json); JSONObject response = service.getToken(json);
String token = response.optString("access_token"); String token = response.optString("access_token");
if(token.isEmpty()){ if(token.isEmpty()){
...@@ -35,7 +34,7 @@ public class bbvaRest { ...@@ -35,7 +34,7 @@ public class bbvaRest {
System.out.println("token = "+singleton.getToken()); System.out.println("token = "+singleton.getToken());
System.out.println("digest = "+singleton.getDigest()); System.out.println("digest = "+singleton.getDigest());
System.out.println("signature = "+singleton.getSignature()); 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 { ...@@ -73,20 +73,20 @@ class tokenRest {
boolean isTokenExpired = jwtTokenUtil.isTokenExpired(json.getString("token")); boolean isTokenExpired = jwtTokenUtil.isTokenExpired(json.getString("token"));
if (isTokenExpired) { 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()); return ResponseEntity.status(403).body(response.toMap());
} }
boolean oneLifeToken = tokenSingleton.isTokenAvailable(json.getString("token")); boolean oneLifeToken = tokenSingleton.isTokenAvailable(json.getString("token"));
if (oneLifeToken) { 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()); return ResponseEntity.ok(response.toMap());
} }
boolean validToken = jwtTokenUtil.validateToken(json.getString("token")); boolean validToken = jwtTokenUtil.validateToken(json.getString("token"));
if (!validToken) { 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()); return ResponseEntity.status(401).body(response.toMap());
} }
...@@ -105,16 +105,16 @@ class tokenRest { ...@@ -105,16 +105,16 @@ class tokenRest {
JSONObject json = new JSONObject(token); JSONObject json = new JSONObject(token);
UserDetails userDetails = userRepo.findByUsername(json.getString("username")); UserDetails userDetails = userRepo.findByUsername(json.getString("username"));
if (userDetails == null) { 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"))) { } else if (userDetails.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("SERVICE"))) {
boolean onelife = json.optBoolean("onelife", false); boolean onelife = json.optBoolean("onelife", false);
String generatedToken = jwtTokenUtil.generateToken((User) userDetails, json.optBigInteger("ms", onelife ? BigInteger.valueOf(0) : BigInteger.valueOf(3600000)), false); String generatedToken = jwtTokenUtil.generateToken((User) userDetails, json.optBigInteger("ms", onelife ? BigInteger.valueOf(0) : BigInteger.valueOf(3600000)), false);
if (onelife) { if (onelife) {
tokenSingleton.addToken(generatedToken); 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 { } 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 { ...@@ -127,7 +127,7 @@ class tokenRest {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 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()); return ResponseEntity.ok(new JSONObject().put("remaining", remaining).put("message", "OK").put("expiration", dateFormat.format(expirationDate)).put("status", true).toMap());
} catch (Exception e) { } 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 { ...@@ -158,29 +158,61 @@ class tokenRest {
JSONObject json = new JSONObject(tokenBody); JSONObject json = new JSONObject(tokenBody);
String token = json.getString("token"); String token = json.getString("token");
boolean doConsume = json.optBoolean("consume", false); boolean doConsume = json.optBoolean("consume", false);
try { 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)) { if (jwtTokenUtil.isTokenExpired(token)) {
return ResponseEntity.status(400).body(new JSONObject().put("data", "").put("message", "Token has expired").put("status", false).toMap()); return ResponseEntity.status(419).body(
} else { new JSONObject()
.put("data", "")
.put("message", "Token ha expirado")
.put("status", false)
.toMap()
);
}
if (!tokenSingleton.isTokenAvailable(token)) { if (!tokenSingleton.isTokenAvailable(token)) {
return ResponseEntity.status(400).body(new JSONObject().put("data", "").put("message", "token has been already consumed").put("status", false).toMap()); return ResponseEntity.status(419).body(
} else { new JSONObject()
String detokenized = jwtTokenUtil.detokenizeData(token, doConsume); .put("data", "")
if(detokenized.isEmpty()){ .put("message", "Token ya ha sido consumido")
return ResponseEntity.status(400).body(new JSONObject().put("data", "").put("message", "Invalid Token").put("status", false).toMap()); .put("status", false)
}else{ .toMap()
);
}
if (doConsume) { if (doConsume) {
tokenSingleton.consumeToken(token); tokenSingleton.consumeToken(token);
} }
} return ResponseEntity.ok(
return ResponseEntity.ok(new JSONObject().put("data", detokenized).put("message", "OK").put("status", true).toMap()); new JSONObject()
} .put("data", detokenized)
} .put("message", "OK")
.put("status", true)
.toMap()
);
} catch (Exception e) { } 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") @PostMapping("/consume")
public ResponseEntity<?> consumeToken(@RequestBody String token) { public ResponseEntity<?> consumeToken(@RequestBody String token) {
JSONObject json = new JSONObject(token); JSONObject json = new JSONObject(token);
...@@ -188,7 +220,7 @@ class tokenRest { ...@@ -188,7 +220,7 @@ class tokenRest {
if (tokenSingleton.consumeToken(json.getString("token"))) { if (tokenSingleton.consumeToken(json.getString("token"))) {
return ResponseEntity.ok(new JSONObject().put("message", "OK").put("status", true).toMap()); return ResponseEntity.ok(new JSONObject().put("message", "OK").put("status", true).toMap());
} else { } 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) { } catch (Exception e) {
return ResponseEntity.status(400).body(new JSONObject().put("message", e.getMessage()).put("status", false).toMap()); return ResponseEntity.status(400).body(new JSONObject().put("message", e.getMessage()).put("status", false).toMap());
......
package web.multitask.trismegistoservices.services.BBVA; package web.multitask.trismegistoservices.services.BBVA;
import okhttp3.*; import okhttp3.*;
import okio.Buffer;
import org.json.JSONObject; import org.json.JSONObject;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import web.multitask.trismegistoservices.utils.CommonUtils; import web.multitask.trismegistoservices.utils.CommonUtils;
...@@ -20,18 +21,25 @@ import java.util.zip.GZIPInputStream; ...@@ -20,18 +21,25 @@ import java.util.zip.GZIPInputStream;
@Service @Service
public class bbvaService { public class bbvaService {
String client_secret = "513375e5181e462fb3ec7a00dfc26dc7";
String client_id = "174895823298";
String grant_type = "client_credentials";
String globalDate = CommonUtils.getCurrentDateRFC1123(); String globalDate = CommonUtils.getCurrentDateRFC1123();
public JSONObject getToken(String json) { public JSONObject getToken(String json) {
try { try {
JSONObject obj = new JSONObject(json); 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"); obj.remove("body");
String host = obj.getString("host"); String host = obj.getString("host");
String formBody = CommonUtils.jsonToUrlEncoded(obj); String formBody = CommonUtils.jsonToUrlEncoded(obj);
OkHttpClient client = new OkHttpClient(); OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder() 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"))) .post(RequestBody.create(formBody, MediaType.parse("application/x-www-form-urlencoded")))
.build(); .build();
...@@ -62,7 +70,7 @@ public class bbvaService { ...@@ -62,7 +70,7 @@ public class bbvaService {
} }
public String txtToSign(String json, String digest) { public String txtToSign(String json, String digest) {
JSONObject obj = new JSONObject(json ); JSONObject obj = new JSONObject(json);
String host = obj.getString("host"); String host = obj.getString("host");
String endpoint = obj.getString("endpoint"); String endpoint = obj.getString("endpoint");
String method = obj.getString("method"); String method = obj.getString("method");
...@@ -79,7 +87,8 @@ public class bbvaService { ...@@ -79,7 +87,8 @@ public class bbvaService {
} }
public PrivateKey loadPrivateKey(String path) { 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); String keyString = CommonUtils.readInputStream(in);
return loadPrivateKeyFromString(keyString); return loadPrivateKeyFromString(keyString);
} catch (Exception e) { } catch (Exception e) {
...@@ -113,44 +122,77 @@ public class bbvaService { ...@@ -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 { try {
JSONObject obj = new JSONObject(json); JSONObject jsonBody = new JSONObject(json);
JSONObject body = obj.getJSONObject("body"); String host = jsonBody.getString("host");
String host = obj.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(); OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder() MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
.url("https://" + host + "/pe/request-to-pay/v1/qr")
.post(requestbody) 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("Content-Type", "application/json")
.addHeader("Accept-Encoding", "gzip") .addHeader("Accept-Encoding", "gzip")
.addHeader("Authorization", "Bearer " + token) .addHeader("Authorization", "Bearer " + token)
.addHeader("Digest", "SHA-512="+digest) .addHeader("Digest", "SHA-512=" + digest)
.addHeader("Signature", "algorithm=\"rsa-sha512\",headers=\"(request-target) host date digest\",signature=\""+signature+"\"") .addHeader("Signature", "algorithm=\"rsa-sha512\",headers=\"(request-target) host date digest\",signature=\"" + signature + "\"")
.addHeader("Host",obj.getString("host")) .addHeader("Host", host)
.addHeader("Date", globalDate) .addHeader("Date", globalDate);
.build();
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");
}
Response response = client.newCall(request).execute(); 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; String bodyResult;
System.out.println("x-request-id = "+response.header("x-request-id"));
if (response.body() != null) { if (response.code() == 204) {
bodyResult = "{}";
} else if (response.body() != null) {
String encoding = response.header("Content-Encoding", ""); String encoding = response.header("Content-Encoding", "");
if ("gzip".equalsIgnoreCase(encoding)) { bodyResult = "gzip".equalsIgnoreCase(encoding)
bodyResult = decompressGzip(response.body().byteStream()); ? decompressGzip(response.body().byteStream())
} else { : response.body().string();
bodyResult = response.body().string();
}
} else { } else {
bodyResult = "{}"; bodyResult = "{}";
} }
System.out.println(bodyResult); System.out.println(bodyResult);
response.close();
return new JSONObject(bodyResult); return new JSONObject(bodyResult);
}
} catch (Exception e) { } catch (Exception e) {
System.out.println(e.getMessage()); System.out.println(e.getMessage());
return new JSONObject().put("status", false).put("message", e.getMessage()); return new JSONObject().put("status", false).put("message", e.getMessage());
...@@ -159,13 +201,16 @@ public class bbvaService { ...@@ -159,13 +201,16 @@ public class bbvaService {
private String decompressGzip(InputStream compressed) throws IOException { private String decompressGzip(InputStream compressed) throws IOException {
try (GZIPInputStream gis = new GZIPInputStream(compressed); 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(); StringBuilder sb = new StringBuilder();
String line; String line;
while ((line = reader.readLine()) != null) { while ((line = reader.readLine()) != null) {
sb.append(line); sb.append(line);
} }
return sb.toString(); return sb.toString();
} catch (Exception e) {
System.out.println(e.getMessage());
return "";
} }
} }
} }
...@@ -4,6 +4,7 @@ import java.io.Serializable; ...@@ -4,6 +4,7 @@ import java.io.Serializable;
import java.math.BigInteger; import java.math.BigInteger;
import java.util.Date; import java.util.Date;
import io.jsonwebtoken.ExpiredJwtException; import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.JwtBuilder;
import org.json.JSONObject; import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.Jwts;
...@@ -38,39 +39,46 @@ public class tokenUtils implements Serializable{ ...@@ -38,39 +39,46 @@ public class tokenUtils implements Serializable{
public String tokenizeData(String data, BigInteger ms,boolean onelife){ public String tokenizeData(String data, BigInteger ms,boolean onelife){
Date expirationDate = new Date(System.currentTimeMillis() + ms.longValue()); Date expirationDate = new Date(System.currentTimeMillis() + ms.longValue());
return Jwts.builder() JwtBuilder jwtBuilder = Jwts.builder();
.setSubject(data) jwtBuilder.setSubject(data);
.setIssuedAt(new Date()) jwtBuilder.setIssuedAt(new Date());
.setExpiration(expirationDate) if(!ms.equals(BigInteger.valueOf(0))){
.signWith(Keys.hmacShaKeyFor(onelife ? jwtSecret2.getBytes() : jwtSecret.getBytes())) jwtBuilder.setExpiration(expirationDate);
.compact(); }
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 = ""; String tokenReturned = "";
try{ try {
tokenReturned = Jwts.parserBuilder() tokenReturned = getSubjectIgnoringExpiration(token, jwtSecret);
.setSigningKey(Keys.hmacShaKeyFor(jwtSecret.getBytes())) } catch (Exception e) {
.build() try {
.parseClaimsJws(token) tokenReturned = getSubjectIgnoringExpiration(token, jwtSecret2);
.getBody() } catch (Exception e2) {
.getSubject(); System.out.println("No se pudo decodificar el token con ninguna clave: " + e2.getMessage());
}catch (Exception e){ }
try{ }
tokenReturned = Jwts.parserBuilder() return tokenReturned;
.setSigningKey(Keys.hmacShaKeyFor(jwtSecret2.getBytes())) }
private String getSubjectIgnoringExpiration(String token, String secret) {
try {
// Parsea normalmente
return Jwts.parserBuilder()
.setSigningKey(Keys.hmacShaKeyFor(secret.getBytes()))
.build() .build()
.parseClaimsJws(token) .parseClaimsJws(token)
.getBody() .getBody()
.getSubject(); .getSubject();
}catch (Exception e2){ } catch (ExpiredJwtException e) {
System.out.println(e2.getMessage()); // Si está expirado, aún así devuelve el subject
} return e.getClaims().getSubject();
} }
return tokenReturned;
} }
public String generateDataSource(JSONObject json){ public String generateDataSource(JSONObject json){
String dataReturned = ""; String dataReturned = "";
......
-----BEGIN RSA PRIVATE KEY----- -----BEGIN RSA PRIVATE KEY-----
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
PnpOxl5jWjhzfwkOcU5V+qBdkCd+fWo= 0GMizk9iG+w4xxSK0eWBPYKtS4NBPxw=
-----END RSA PRIVATE KEY----- -----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