Set WARP License key in warp-cli
warp-cli account
warp-cli set-license <your-warp-plus-license-key>
References
https://community.cloudflare.com/t/how-to-use-warp-with-linux-cli/400952
warp-cli account
warp-cli set-license <your-warp-plus-license-key>
References
https://community.cloudflare.com/t/how-to-use-warp-with-linux-cli/400952
Implementing RTL in Ionic 5 apps is very easy. It can be done in two ways
dir="rtl"
attribute in HTML tagsdirection= rtl
in cssUsing HTML tag
If you want to convert the complete app into RTL layout, then use dir="rtl"
on <html>
tag itself.
Using CSS at global level
You can also convert the complete app to RTL using CSS in global.scss
:root { direction: rtl; }
References
https://enappd.com/blog/how-to-use-rtl-right-to-left-in-ionic-apps-pwa/152/
Install warp-cli
curl https://pkg.cloudflareclient.com/pubkey.gpg | sudo gpg --yes --dearmor --output /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflare-client.list
sudo apt update
sudo apt install cloudflare-warp
Run warp-cli in proxy mode
warp-cli --accept-tos register warp-cli --accept-tos set-mode proxy warp-cli --accept-tos set-proxy-port 40040 warp-cli --accept-tos connect warp-cli --accept-tos enable-always-on
Configure xray
nano /usr/local/etc/xray/config.json
"outbounds": [ { "protocol": "socks", "settings": { "servers":[ { "address":"127.0.0.1", "port":40040 } ] }, "tag": "warp" } ],
"routing": { "domainStrategy": "AsIs", "rules": [ { "type":"field", "domain":[ "domain:google.com" ], "outboundTag": "warp" } ] },
References
https://developers.cloudflare.com/warp-client/get-started/linux
https://pkg.cloudflareclient.com/install
DateTime.UtcNow.ToString("o", CultureInfo.InvariantCulture);
To get the specified format, you can use:
DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ", CultureInfo.InvariantCulture)
Chrony is an implementation of the Network Time Protocol (NTP) that runs on Unix-like operating systems (including Linux and macOS) and is released under the GNU GPL v2. It can synchronize the system clock with NTP servers, reference clocks (e.g. GPS receiver), and manual input using wristwatch and keyboard. It can also operate as an NTPv4 (RFC 5905) server and peer to provide a time service to other computers in the network.
apt install -y chrony timedatectl set-ntp true systemctl enable chrony && systemctl restart chrony timedatectl set-timezone Asia/Tehran chronyc sourcestats -v chronyc tracking -v date
References
https://installati.one/install-chrony-ubuntu-22-04/
services.AddCors(options => { options.AddDefaultPolicy(builder => { builder.AllowAnyOrigin() .AllowAnyHeader() .AllowAnyMethod(); }); });
app.UseCors();
References
https://stacktuts.com/how-to-enable-cors-in-asp-net-core-6-0-web-api-project
https://learn.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-7.0
[HttpPost("refresh-token")] public async Task<ActionResult<string>> RefreshToken() { var refreshToken = Request.Cookies["refreshToken"]; if (!user.RefreshToken.Equals(refreshToken)) { return Unauthorized("Invalid Refresh Token."); } else if(user.TokenExpires < DateTime.Now) { return Unauthorized("Token expired."); } string token = CreateToken(user); var newRefreshToken = GenerateRefreshToken(); SetRefreshToken(newRefreshToken); return Ok(token); } private RefreshToken GenerateRefreshToken() { var refreshToken = new RefreshToken { Token = Convert.ToBase64String(RandomNumberGenerator.GetBytes(64)), Expires = DateTime.Now.AddDays(7), Created = DateTime.Now }; return refreshToken; } private void SetRefreshToken(RefreshToken newRefreshToken) { var cookieOptions = new CookieOptions { HttpOnly = true, Expires = newRefreshToken.Expires }; Response.Cookies.Append("refreshToken", newRefreshToken.Token, cookieOptions); user.RefreshToken = newRefreshToken.Token; user.TokenCreated = newRefreshToken.Created; user.TokenExpires = newRefreshToken.Expires; }
References
https://www.youtube.com/watch?v=HGIdAn2h8BA
https://www.youtube.com/watch?v=LowJMwa7LCU
https://passage.id/post/how-refresh-tokens-work-a-complete-guide-for-beginners?utm_source=pocket_reader
https://auth0.com/blog/refresh-tokens-what-are-they-and-when-to-use-them/?utm_source=pocket_reader
var stream = "[encoded jwt]"; var handler = new JwtSecurityTokenHandler(); var jsonToken = handler.ReadToken(stream); var tokenS = jsonToken as JwtSecurityToken;
Or, without the cast:
var token = "[encoded jwt]"; var handler = new JwtSecurityTokenHandler(); var jwtSecurityToken = handler.ReadJwtToken(token);
I can get Claims using:
var jti = tokenS.Claims.First(claim => claim.Type == "jti").Value;
References
https://stackoverflow.com/questions/38340078/how-to-decode-jwt-token?utm_source=pocket_reader
ASP.NET Core interface IHostApplicationLifetime
allows developers to subscribe their handlers to ApplicationStarted, ApplicationStopping and ApplicationStopped events
ASP.NET Core provides developers with an IHostedService
interface that has StartAsync
and StopAsync
methods that are executed when the application starts and stops. This interface is typically used to trigger long running background tasks, but StartAsync
itself must return quickly so as not to block other hosted services, if any.
public class EInvoiceSenderService: IHostedService { private readonly ILogger logger; private readonly IHostApplicationLifetime appLifetime; public EInvoiceSenderService( ILogger<LifetimeEventsHostedService> logger, IHostApplicationLifetime appLifetime) { //<--- INJECTED DEPENDENCY this.logger = logger; this.appLifetime = appLifetime; } public Task StartAsync(CancellationToken cancellationToken) { appLifetime.ApplicationStarted.Register(OnStarted); appLifetime.ApplicationStopping.Register(OnStopping); appLifetime.ApplicationStopped.Register(OnStopped); return Task.CompletedTask; } public Task StopAsync(CancellationToken cancellationToken) { return Task.CompletedTask; } private void OnStarted() { logger.LogInformation("OnStarted has been called."); // Perform post-startup activities here } private void OnStopping() { logger.LogInformation("OnStopping has been called."); // Perform on-stopping activities here } private void OnStopped() { logger.LogInformation("OnStopped has been called."); // Perform post-stopped activities here } }
Program.cs
builder.Services.AddHostedService<EInvoiceSenderService>();
References
https://levelup.gitconnected.com/3-ways-to-run-code-once-at-application-startup-in-asp-net-core-bcf45a6b6605
https://stackoverflow.com/questions/59650230/how-to-get-and-inject-the-ihostapplicationlifetime-in-my-service-to-the-containe
[HttpGet] [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] public async Task<ActionResult<string>> Get() { var token = await HttpContext.GetTokenAsync("access_token"); return token; }
var token = Request.Headers["Authorization"];
var token2 = await HttpContext.GetTokenAsync(JwtBearerDefaults.AuthenticationScheme, "access_token");
References
https://stackoverflow.com/questions/58887151/how-to-access-token-data-from-controller-method
https://stackoverflow.com/questions/52793488/jwt-cannot-be-retrieved-by-httpcontext-gettokenasync-in-net-core-2-1