public async Task <Response> SignIn(UserViewModel model) { try { User _user = null; if (!string.IsNullOrEmpty(model.Email)) { _user = await this._repository.GetByEmail(model.Email); } if (_user != null) { bool authorized = Crypto.ComparePassword(model.Password, new Encoded(_user.Password)); if (authorized) { var _model = this._mapper.Map <UserViewModel>(_user); var _auth = new Auth <UserViewModel>(Jwt.CreateToken(model.Email), _model); return(Ok(_auth, HttpMessage.Login_Authorized)); } else { return(Unauthorized("A conta informada é inválida!")); } } else { return(Unauthorized("A conta informada é inválida!")); } } catch (Exception except) { return(await InternalServerError(except.Message)); } }
public ActionResult Editar(FormCollection collection) { var User = new User(); User.Id = new Jwt().ObtenerId(); User.Nombre = collection["Nombre"]; User.Apellido = collection["Apellido"]; User.Contrasena = collection["Contrasena"]; User.Username = collection["Username"]; User.Telefono = int.Parse(collection["Telefono"]); var Direccion = "Perfil/" + new Jwt().ObtenerId(); var Respuesta = Data.Instancia.RocketChat.Cliente.PutAsJsonAsync(Direccion, User); Respuesta.Wait(); var Result = Respuesta.Result; if (Result.StatusCode == HttpStatusCode.OK) { return(RedirectToAction("CerrarSesion")); } TempData["id"] = new Jwt().ObtenerId(); return(RedirectToAction("Editar", "Perfil")); }
public void Write_Valid(string token) { var descriptor = _tokens.Descriptors[token]; JwtWriter writer = new JwtWriter(); var value = writer.WriteToken(descriptor); var policy = new TokenValidationPolicyBuilder() .WithDecryptionKeys(_keys.Jwks) .IgnoreSignatureByDefault() .Build(); var result = Jwt.TryParse(value, policy, out var jwt); Assert.True(result); if (!(descriptor is JwsDescriptor jwsPayload)) { if (!(descriptor is JweDescriptor jwePayload)) { throw new Xunit.Sdk.IsNotTypeException(typeof(JwtDescriptor), descriptor); } jwsPayload = jwePayload.Payload; } Assert.NotNull(jwsPayload); if (jwsPayload.Payload.Count > 0) { Assert.True(jwt.Payload.TryGetClaim("iat", out var iat)); Assert.True(jwt.Payload.TryGetClaim("exp", out var exp)); Assert.True(jwt.Payload.TryGetClaim("iss", out var iss)); Assert.True(jwt.Payload.TryGetClaim("aud", out var aud)); Assert.True(jwt.Payload.TryGetClaim("jti", out var jti)); } }
public bool Parse() { var result = Jwt.TryParse(Token.Data, Token.Policy, out var jwt); jwt.Dispose(); return(result); }
public void Create_DataCorrect_InvoiceCreated() { var user = UserFaker.Create(); var project = ProjectFaker.Create(); var amount = Rand.SmallDecimal(); CurrencyWalletFaker.Create(CurrencyType.BitCoin); var result = new Browser(new DefaultNancyBootstrapper()) .Post("/api/v1/invoice/new", with => { with.HttpRequest(); with.Query("api_token", Jwt.FromUserId(user.id)); with.Query("entity_guid", project.guid); with.Query("entity_type", EntityType.Project.ToString()); with.Query("amount", amount.ToString(CultureInfo.InvariantCulture)); with.Query("currency_type", CurrencyType.BitCoin.ToString()); }).Result; Assert.AreEqual(1, global::App.DL.Model.Funding.Invoice.GetActiveForUser(user).Length); Assert.AreEqual(HttpStatusCode.Created, result.StatusCode); var jsonData = JObject.Parse(result.Body.AsString())["data"]["invoice"]; Assert.AreEqual(project.guid, jsonData.Value <string>("entity_guid") ?? ""); Assert.AreEqual(amount, jsonData.Value <decimal?>("amount") ?? 0); }
public ActionResult UserNameToId(string usernameReceptor) { var idEmisor = new Jwt().ObtenerId(); if (idEmisor != "") { var Direccion = "Perfil/" + idEmisor; var Respuesta = Data.Instancia.RocketChat.Cliente.GetAsync(Direccion); Respuesta.Wait(); var Resultado = Respuesta.Result; var ReadTask = Resultado.Content.ReadAsStringAsync(); ReadTask.Wait(); var user = JsonConvert.DeserializeObject <User>(ReadTask.Result); var idReceptor = ""; foreach (var ItemConversacion in user.Conversaciones) { if (ItemConversacion.Split('.')[0] == usernameReceptor) { idReceptor = ItemConversacion.Split('.')[1]; } } return(RedirectToAction("Mensajes", new { id = idReceptor })); } return(RedirectToAction("Conversaciones", "Conversaciones")); }
public ActionResult MandarMensajes(FormCollection collection) { var idReceptor = TempData["receptor"]; var cuerpoMensaje = collection["Contenido"]; var idEmisor = new Jwt().ObtenerId(); var mensaje = new Msg(); mensaje.Contenido = cuerpoMensaje; TempData.Remove("receptor"); if (idEmisor != "") { var Direccion = "Chat/" + idEmisor + "/" + idReceptor; var Respuesta = Data.Instancia.RocketChat.Cliente.PutAsJsonAsync(Direccion, mensaje); Respuesta.Wait(); var Resultado = Respuesta.Result; if (Resultado.StatusCode == HttpStatusCode.OK) { var readTask = Resultado.Content.ReadAsStringAsync(); readTask.Wait(); return(RedirectToAction("Mensajes", new { id = idReceptor })); } else { return(RedirectToAction("HomePerfil", "Perfil")); } } else { return(RedirectToAction("Index", "Login")); } }
public IActionResult Logar(UsuarioViewModel login) { try { Usuarios usuarioBuscado = _usuarioService.BuscarPorEmailESenha(login.Nif, login.Senha); if (usuarioBuscado == null) { return(NotFound(new { mensagem = "Email ou senha inválidos." })); } //Retorna Ok com o Token return(Ok(new { token = Jwt.GerarToken(usuarioBuscado) })); } catch (Exception ex) { return(BadRequest(new { mensagem = "Ocorreu um erro, contate o administrador.", erro = ex.Message })); } }
public void Create_DataCorrect_CardCreated() { var user = UserFaker.Create(); var column = BoardColumnFaker.Create(user); var browser = new Browser(new DefaultNancyBootstrapper()); var cardTitle = "testCard" + Rand.SmallInt(); var description = "descriptionCard" + Rand.SmallInt(); var columnOrder = Convert.ToString(Rand.IntRange(1, 25)); var result = browser.Post("/api/v1/card/create", with => { with.HttpRequest(); with.Query("api_token", Jwt.FromUserId(user.id)); with.Query("name", cardTitle); with.Query("description", description); with.Query("column_guid", column.guid); with.Query("column_order", columnOrder); with.Query("creator_guid", user.guid); }).Result; Assert.AreEqual(HttpStatusCode.Created, result.StatusCode); var json = JObject.Parse(result.Body.AsString()); var guid = json["data"]["card"].Value <string>("guid") ?? ""; var createdCard = CardRepository.FindByGuid(guid); Assert.NotNull(createdCard); Assert.AreEqual(cardTitle, createdCard.name); Assert.AreEqual(columnOrder, Convert.ToString(createdCard.column_order)); Assert.AreEqual( createdCard.guid, json["data"]["card"].Value <string>("guid") ?? "" ); }
public static IEnumerator GetToken(Action <string> callback) { if (expires > DateTime.Now) { callback(token); yield break; } string jwt = Jwt.GetJwt(Constants.Email, Constants.Keyfile, Constants.Scope); WWWForm form = new WWWForm(); form.AddField("grant_type", Constants.Grant); form.AddField("assertion", jwt); UnityWebRequest request = UnityWebRequest.Post(Constants.Url, form); yield return(request.SendWebRequest()); if (request.isNetworkError || request.isHttpError) { Debug.LogWarning(request.error); callback(null); yield break; } byte[] rawResponse = request.downloadHandler.data; string jsonResponse = Encoding.UTF8.GetString(rawResponse); AuthResponseBody response = Json.FromJson <AuthResponseBody>(jsonResponse); expires = DateTime.Now.AddSeconds(response.expiresIn); token = response.accessToken; callback(response.accessToken); }
static void Main() { // Creates a symmetric key defined for the 'HS256' algorithm var signatureKey = SymmetricJwk.FromBase64Url("R9MyWaEoyiMYViVWo8Fk4TUGWiSoaW6U1nOqXri8_XU"); // Creates a symmetric key for encryption var decryptionKey = SymmetricJwk.FromBase64Url("R9MyWaEoyiMYViVWo8Fk4T"); var policy = new TokenValidationPolicyBuilder() .RequireSignature("https://idp.example.com/", signatureKey, SignatureAlgorithm.HS256) .RequireAudience("636C69656E745F6964") .WithDecryptionKey(decryptionKey) .Build(); var result = Jwt.TryParse("eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Iiwia2lkIjoiZWFOTlpaMXBtREFXSWYzYkg3MFg2V3FfbldzUXhuMjFMUngza1daMG5MYyIsImN0eSI6IkpXVCJ9.PU18XXVByiJLE53zkg1m-SzjZXUdRYkl0X20JtsMKXW54RHn3fcK_w.Bu1SPUTuntwvPfwXTj1OhQ.OuCl09TjUMJk80GdY4n5r6HUnH21dWwT1BAbbvPJg75p_AfMvVNmaQ3dahrSmCkuCI5EF34ynE_qUBAuMH9bcplUWS9GDKJfGugEZgkciWORv5RzXvAAokpElpuaiV09SdBmaepi4FAXvTP4axJUWuOXt2MvjnlwbIXlVqUX9Lha1NnsseBLTjfCclhV0pQEKjnncqjuqTcxmqTqAsxZA1v8RJV_FbzBdVBWwQ-qrjYbsrqtsK13XazZEGwAHU7fJT1vlaBdlni6aTQIlwE7JuLA--6hRM9mr7NZ4SlihCFBLjW-DZ2QoQBd6XeFNGKMnNgUP0t6mYihPlmh1eC0BivPaTtCKf4CH6lrq42_17s.ajGQE7r5eAd9z8a-8mmq2g", policy, out var jwt); if (result) { Console.WriteLine("The token is " + jwt); } else { Console.WriteLine("Failed to read the token. Reason: " + Environment.NewLine + jwt.Error.Status); } jwt.Dispose(); }
public CommonApiResponse <dynamic> Post(Guid roleId, string _permissionId) { jwt = ViewBag.Jwt; Guid permissionId = Guid.Parse(_permissionId); RolePermission rolePermission = new RolePermission(); rolePermission.UserId = jwt.UserId; rolePermission.PermissionId = permissionId; rolePermission.RoleId = roleId; bool result = false; string error = ""; Guid insertId = _rolePermissionService.Save(rolePermission); result = Guid.TryParse(insertId.ToString(), out insertId); if (result) { rolePermission.Id = insertId; var result1 = _rolePermissionService.GetByUserIdAndIdWithJoinPermission(jwt.UserId, roleId, rolePermission.Id); return(CommonApiResponse <dynamic> .Create(Response, System.Net.HttpStatusCode.OK, true, result1, null)); } return(CommonApiResponse <dynamic> .Create(Response, System.Net.HttpStatusCode.BadRequest, false, null, FluentValidationHelper.GenerateErrorList(error))); }
// TODO: should be moved to api project public async Task <Jwt> GenererateJwtFromUser(User user) { return(await Task.Factory.StartNew(() => { var claims = new List <Claim> { new Claim(JwtRegisteredClaimNames.Sub, user.UserName), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()) }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSettings.Key)); var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var expires = DateTime.Now.AddDays(Convert.ToDouble(7)); var securityToken = new JwtSecurityToken( _jwtSettings.Issuer, _jwtSettings.Issuer, claims, expires: expires, signingCredentials: creds ); string tokenString = new JwtSecurityTokenHandler().WriteToken(securityToken); Jwt token = new Jwt(securityToken.ValidTo, tokenString); return token; })); }
public async Task <IActionResult> Login(User user) { _log4net.Info("User Login"); User Item = new User(); using (var httpClient = new HttpClient()) { StringContent content = new StringContent(JsonConvert.SerializeObject(user), Encoding.UTF8, "application/json"); StringContent content1 = new StringContent(JsonConvert.SerializeObject(user), Encoding.UTF8, "application/json"); using (var response1 = await httpClient.PostAsync("https://localhost:44304/api/Auth/Login", content1)) { if (!response1.IsSuccessStatusCode) { return(RedirectToAction("Login")); } string apiResponse1 = await response1.Content.ReadAsStringAsync(); Jwt jwt = JsonConvert.DeserializeObject <Jwt>(apiResponse1); HttpContext.Session.SetString("token", jwt.Token); HttpContext.Session.SetString("user", JsonConvert.SerializeObject(user)); HttpContext.Session.SetInt32("Userid", user.Userid); HttpContext.Session.SetString("Username", user.Username); ViewBag.Message = "User logged in successfully!"; return(RedirectToAction("Index", "MenuItem")); } } }
internal BearerToken CreateAccessToken(ClaimsPrincipal claimsPrincipal, TimeSpan validTime) { byte[] encryptedToken; using (var stream = GlobalVars.RecyclableMemory.GetStream("claims-principal", 32)) { using (var bwriter = new BinaryWriter(stream, Encoding.UTF8, true)) { claimsPrincipal.WriteTo(bwriter); } byte[] serializedClaims = stream.ToArray(); DateTime validity = DateTime.Now + validTime; var serverBearer = new ServerAccessToken(serializedClaims, validity); using (var mem = GlobalVars.RecyclableMemory.GetStream()) { ProtoBuf.Serializer.Serialize(mem, serverBearer); byte[] serializedTmpBuf = mem.GetBuffer(); // Закриптовать. encryptedToken = Jwt.EncryptToBytes(serializedTmpBuf.AsSpan(0, (int)mem.Length)); } var token = new BearerToken(encryptedToken, validity); return(token); } }
public void Patch_DataCorrect_CardUpdated() { var browser = new Browser(new DefaultNancyBootstrapper()); var me = UserFaker.Create(); var card = CardFaker.Create(me); var updatedName = "updatedName_" + Rand.SmallInt(); var updatedDescription = "updatedName_" + Rand.SmallInt(); var updatedColumnOrder = Convert.ToString(Rand.IntRange(0, 40)); var result = browser.Patch("/api/v1/card/edit", with => { with.HttpRequest(); with.Query("api_token", Jwt.FromUserId(me.id)); with.Query("card_guid", card.guid); with.Query("name", updatedName); with.Query("description", updatedDescription); with.Query("column_order", updatedColumnOrder); }).Result; Assert.AreEqual(HttpStatusCode.OK, result.StatusCode); var json = JObject.Parse(result.Body.AsString()); Assert.AreEqual(card.guid, json["data"]["card"].Value <string>("guid")); Assert.AreEqual(updatedName, json["data"]["card"].Value <string>("name")); Assert.AreEqual(updatedColumnOrder, json["data"]["card"].Value <string>("column_order")); }
public async Task <Jwt> LoginWithoutEmailConfirmation(LoginModel model) { Jwt jwt = null; IJWTService jwtService = SecurityServiceFactory.GetService(typeof(IJWTService)) as IJWTService; ApplicationUser user = await UserManager.FindByEmailAsync(model.Email); if (user == null) { throw new InvalidOperationException("Incorrect email or password"); } bool isPasswordCorrect = await UserManager.CheckPasswordAsync(user, model.Password); if (!isPasswordCorrect) { throw new InvalidOperationException("Incorrect email or password"); } if (model.RememberMe) { jwt = await jwtService.GenerateJWtWithRefreshTokenAsync(user); } else { jwt = jwtService.GenerateJwtToken(user); } return(jwt); }
public async Task TestJwtMiddleware() { HttpContext context = new DefaultHttpContext(); JwtMiddleware middleware = new JwtMiddleware(httpContext => Task.CompletedTask); await middleware.Invoke(context); Assert.IsTrue(!context.User.Claims.Any(), "Are there any claims when there's no authentication header?"); Assert.IsNull(context.User.Identity.AuthenticationType, "Is the authenticationtype null when there's no auth header?"); // Create a test user instance User testUser = new User { confirmed = true, date_of_birth = DateTime.Now, email = "*****@*****.**", ID = 0, password = "******", plan = Plans.Basic, registration_timestamp = DateTime.Now, role = Roles.User, username = "******" }; ClaimsPrincipal userPrincipal = testUser.ClaimsPrincipal(TokenScope.UserLogin); context.Request.Headers.Add("Authorization", "Bearer " + Jwt.Sign((ClaimsIdentity)userPrincipal.Identity)); await middleware.Invoke(context); Assert.IsTrue(context.User.Claims.Any(), "Are there any claims when the authentication header is present?"); Assert.IsNotNull(context.User.Identity.AuthenticationType, "Is the authenticationtype no null when the authentication header is present?"); Assert.AreEqual(context.User.Identity.AuthenticationType, TokenScope.UserLogin, "Is the AuthenticationType the same as the one used to sign the Jwt token?"); }
// GET: Conversaciones public ActionResult Conversaciones() { string id = new Jwt().ObtenerId(); if (id != "") { var Direccion = "Conversaciones/" + id; var Respuesta = Data.Instancia.RocketChat.Cliente.GetAsync(Direccion); Respuesta.Wait(); var Resultado = Respuesta.Result; if (Resultado.StatusCode == HttpStatusCode.OK) { var ReadTask = Resultado.Content.ReadAsStringAsync(); ReadTask.Wait(); var ConversacionesUser = JsonConvert.DeserializeObject <List <string> >(ReadTask.Result); var ListaConversaciones = new List <string>(); foreach (var Conversacion in ConversacionesUser) { ListaConversaciones.Add(Conversacion.Split('.')[0]); } return(View(ListaConversaciones)); } else { return(RedirectToAction("HomePerfil", "Perfil")); } } else { return(RedirectToAction("Index", "Login")); } }
public async Task <IActionResult> UploadImage(IFormCollection form) { string storePath = "F:/Licenta/matchbox/matchbox-server/Uploads/"; if (form.Files == null || form.Files[0].Length == 0) { return(BadRequest(new { message = "" })); } var authorizationToken = this.Request.Headers["Authorization"].ToString(); if (authorizationToken == "") { return(Unauthorized()); } int id = Jwt.GetIdFromToken(authorizationToken); if (id == 0) { return(Unauthorized()); } string filename = id.ToString() + ".jpg"; var path = Path.Combine(storePath, filename); using (var stream = new FileStream(path, FileMode.Create)) { await form.Files[0].CopyToAsync(stream); } return(Ok(new { succes = "true" })); }
public ActionResult CrearConversacion() { string id = new Jwt().ObtenerId(); if (id != "") { var Direccion = "AllUsers/" + id; var Respuesta = Data.Instancia.RocketChat.Cliente.GetAsync(Direccion); Respuesta.Wait(); var Resultado = Respuesta.Result; if (Resultado.StatusCode == HttpStatusCode.OK) { var ReadTask = Resultado.Content.ReadAsStringAsync(); ReadTask.Wait(); var ListaUsuariosRegistrados = JsonConvert.DeserializeObject <List <User> >(ReadTask.Result); return(View(ListaUsuariosRegistrados)); } else { return(RedirectToAction("HomePerfil", "Perfil")); } } else { return(RedirectToAction("Index", "Login")); } }
public async Task <IActionResult> DeleteImage() { var authorizationToken = this.Request.Headers["Authorization"].ToString(); if (authorizationToken == "") { return(Unauthorized()); } int id = Jwt.GetIdFromToken(authorizationToken); if (id == 0) { return(Unauthorized()); } string storePath = "F:/Licenta/matchbox/matchbox-server/Uploads/"; var filename = id.ToString() + ".jpg"; var path = Path.Combine(storePath, filename); if (System.IO.File.Exists(path)) { System.IO.File.Delete(path); return(Ok(new { succes = "true" })); } else { return(NotFound(new { message = "File not found" })); } }
public bool TryParse_Dispose() { bool result = Jwt.TryParse(Token, policy, out var jwt); jwt.Dispose(); return(result); }
//***************************************************************AUTENTICACION E INICIO SE SESION********************************************************************************************************************************************************* public Jwt Authenticate(string userName, string password) { var user = _Users.Find(userX => userX.Username == userName && userX.Contraseña == password).FirstOrDefault(); if (user == null) { return(null); } var jwt = new Jwt(); var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.ASCII.GetBytes(_appSettings.Secret); var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(new Claim[] { new Claim(ClaimTypes.Name, user.Id.ToString()) }), Expires = DateTime.UtcNow.AddMinutes(3), SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature) }; var token = tokenHandler.CreateToken(tokenDescriptor); jwt.Token = tokenHandler.WriteToken(token); //jwt.Token = token.ToString(); return(jwt); }
// GET: Perfil public ActionResult HomePerfil() { var id = new Jwt().ObtenerId(); if (id != "") { var Direccion = "Perfil/" + id; var Respuesta = Data.Instancia.RocketChat.Cliente.GetAsync(Direccion); Respuesta.Wait(); var Result = Respuesta.Result; if (Result.StatusCode == HttpStatusCode.OK) { var ReadTask = Result.Content.ReadAsStringAsync(); ReadTask.Wait(); var User = JsonConvert.DeserializeObject <User>(ReadTask.Result); return(View(User)); } else if (Result.StatusCode == HttpStatusCode.Unauthorized) { return(RedirectToAction("Index", "Login")); } else { return(null); } } else { return(RedirectToAction("Index", "Login")); } }
public ExtractControllerTests() { _connection = new SqliteConnection("Data Source=:memory:"); _connection.Open(); var options = new DbContextOptionsBuilder <MobicloneContext>().UseSqlite(_connection).Options; _context = new MobicloneContext(options); _accessor = new HttpContextAccessor { HttpContext = new DefaultHttpContext() }; var hash = new Bcrypt(); var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.Test.json").Build(); var auth = new Jwt(_context, hash, configuration, _accessor); var extract = new DefaultExtract(_connection, auth); _controller = new ExtractController(extract); _context.Database.EnsureCreated(); }
private long GetUserId() { string token = Request.Headers["Authorization"]; int userId = Int16.Parse(Jwt.decryptJSONWebToken(token)["Id"].ToString()); return(userId); }
/// <summary> /// Производит аутентификацию текущего подключения. /// </summary> internal IActionResult SignIn(AccessToken accessToken) { // Расшифрованный токен полученный от пользователя. byte[] decripted; try { // Расшифровать токен. decripted = Jwt.DecryptToBytes(accessToken); } catch (Exception) { return(new BadRequestResult("Токен не валиден")); } ServerAccessToken bearerToken; try { using (var mem = new MemoryStream(decripted, 0, decripted.Length, false, true)) { bearerToken = ProtoBuf.Serializer.Deserialize <ServerAccessToken>(mem); } } catch (Exception) { return(new BadRequestResult("Токен не валиден")); } return(SignIn(bearerToken)); }
public void Encode_Decode(EncryptionAlgorithm enc, KeyManagementAlgorithm alg) { var writer = new JwtWriter(); var encryptionKey = SelectKey(enc.Name.ToString(), alg.Name.ToString()); var descriptor = new JweDescriptor(encryptionKey, alg, enc) { Payload = new JwsDescriptor(_signingKey, SignatureAlgorithm.HS256) { Payload = new JwtPayload { { "sub", "Alice" } } } }; var token = writer.WriteToken(descriptor); var policy = new TokenValidationPolicyBuilder() .RequireSignatureByDefault(_signingKey) .WithDecryptionKey(encryptionKey) .Build(); var result = Jwt.TryParse(token, policy, out var jwt); Assert.True(result); Assert.True(jwt.Payload.TryGetClaim("sub", out var sub)); Assert.Equal("Alice", sub.GetString()); jwt.Dispose(); }
public CommonApiResponse <Role> Get(Guid id) { jwt = ViewBag.Jwt; Role role = _roleService.GetById(jwt.UserId, id); return(CommonApiResponse <Role> .Create(Response, System.Net.HttpStatusCode.OK, true, role, null)); }