tugberkugurlu / modernshopping Goto Github PK
View Code? Open in Web Editor NEWA modern sample software application for online shopping
License: MIT License
A modern sample software application for online shopping
License: MIT License
Is it possible to extend out the original MongoIdentityUser? as per typical Identity framework, for example
`
public class User : MongoIdentityUser
{
public User(string userName) : base(userName)
{
SetDefaults();
}
public User(string userName, string email) : base(userName, email)
{
SetDefaults();
}
public User(string userName, MongoUserEmail email) : base(userName, email)
{
SetDefaults();
}
public void SetDefaults()
{
FirstName = "First";
LastName = "Name";
FullName = $"{FirstName} {LastName}";
}
public string FullName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
`
Have tried doing this and refactored the stores and user managers to use that type, but only registration is successful. Any time the object is deserialised it is unsuccessful, most likely due to the new properties.
It currently gives back 500 when the bearer token is expired:
Possibly, I can get in the middle and convert this to a proper status code.
http://stackoverflow.com/questions/32321526/oauth-token-expiration-in-mvc6-app/32353544
For this registration:
ModernShopping/Auth/src/ModernShopping.Auth.SampleApp/Startup.cs
Lines 184 to 209 in 5ebf9ff
getting this error:
ModernShopping_auth_sampleapp | Application startup exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.TypeLoadException: Could not load type 'Microsoft.Owin.Security.DataProtection.DpapiDataProtector' from assembly 'Microsoft.Owin.Security, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.
ModernShopping_auth_sampleapp | at Microsoft.Owin.Security.DataProtection.AppBuilderExtensions.CreateDataProtector (Owin.IAppBuilder,string[]) <0x00056>
ModernShopping_auth_sampleapp | at Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationMiddleware..ctor (Microsoft.Owin.OwinMiddleware,Owin.IAppBuilder,Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationOptions) <0x0030f>
ModernShopping_auth_sampleapp | at (wrapper dynamic-method) object.lambda_method (System.Runtime.CompilerServices.Closure,Microsoft.Owin.OwinMiddleware,Owin.IAppBuilder,Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationOptions) <0x00052>
ModernShopping_auth_sampleapp | at (wrapper managed-to-native) System.Reflection.MonoMethod.InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&) <0x0006c>
ModernShopping_auth_sampleapp | at System.Reflection.MonoMethod.Invoke (object,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo) <0x000db>
ModernShopping_auth_sampleapp |
ModernShopping_auth_sampleapp | --- End of inner exception stack trace ---
ModernShopping_auth_sampleapp | at System.Reflection.MonoMethod.Invoke (object,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo) <0x00131>
ModernShopping_auth_sampleapp | at System.Reflection.MethodBase.Invoke (object,object[]) <0x0002a>
ModernShopping_auth_sampleapp | at System.Delegate.DynamicInvokeImpl (object[]) <0x00254>
ModernShopping_auth_sampleapp | at System.MulticastDelegate.DynamicInvokeImpl (object[]) <0x0003f>
ModernShopping_auth_sampleapp | at System.Delegate.DynamicInvoke (object[]) <0x00019>
ModernShopping_auth_sampleapp | at Microsoft.Owin.Builder.AppBuilder.BuildInternal (System.Type) <0x0015a>
ModernShopping_auth_sampleapp | at Microsoft.Owin.Builder.AppBuilder.Build (System.Type) <0x00013>
ModernShopping_auth_sampleapp | at Microsoft.Owin.Builder.AppBuilderExtensions.Build<System.Func`2<System.Collections.Generic.IDictionary`2<string, object>, System.Threading.Tasks.Task>> (Owin.IAppBuilder) <0x00039>
ModernShopping_auth_sampleapp | at Microsoft.Owin.Builder.AppBuilderExtensions.Build (Owin.IAppBuilder) <0x0001b>
ModernShopping_auth_sampleapp | at IdentityServer3.AccessTokenValidation.IdentityServerBearerTokenValidationMiddleware..ctor (System.Func`2<System.Collections.Generic.IDictionary`2<string, object>, System.Threading.Tasks.Task>,IdentityServer3.AccessTokenValidation.IdentityServerOAuthBearerAuthenticationOptions,Microsoft.Owin.Logging.ILoggerFactory) <0x00417>
ModernShopping_auth_sampleapp | at (wrapper dynamic-method) object.lambda_method (System.Runtime.CompilerServices.Closure,System.Func`2<System.Collections.Generic.IDictionary`2<string, object>, System.Threading.Tasks.Task>,IdentityServer3.AccessTokenValidation.IdentityServerOAuthBearerAuthenticationOptions,Microsoft.Owin.Logging.ILoggerFactory) <0x00052>
ModernShopping_auth_sampleapp | at (wrapper managed-to-native) System.Reflection.MonoMethod.InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&) <0x0006c>
ModernShopping_auth_sampleapp | at System.Reflection.MonoMethod.Invoke (object,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo) <0x000db>
ModernShopping_auth_sampleapp |
ModernShopping_auth_sampleapp | --- End of inner exception stack trace ---
ModernShopping_auth_sampleapp | at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at System.Delegate.DynamicInvokeImpl (System.Object[] args) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at System.MulticastDelegate.DynamicInvokeImpl (System.Object[] args) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at System.Delegate.DynamicInvoke (System.Object[] args) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at Microsoft.Owin.Builder.AppBuilder.BuildInternal (System.Type signature) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at Microsoft.Owin.Builder.AppBuilder.Build (System.Type returnType) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at ModernShopping.Auth.SampleApp.IApplicationBuilderExtensions+<>c__DisplayClass0_0.<UseIdentityServerBearerTokenAuthentication>b__1 (System.Func`2 next) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at Microsoft.AspNet.Builder.OwinExtensions+<>c__DisplayClass0_1.<UseOwin>b__1 (Microsoft.AspNet.Builder.RequestDelegate next1) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at Microsoft.AspNet.Builder.Internal.ApplicationBuilder.Build () [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at Microsoft.AspNet.Hosting.Internal.HostingEngine.BuildApplication () [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | 11/25/2015 00:48:19 +00:00 [Error] Application startup exception
ModernShopping_auth_sampleapp | System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.TypeLoadException: Could not load type 'Microsoft.Owin.Security.DataProtection.DpapiDataProtector' from assembly 'Microsoft.Owin.Security, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.
ModernShopping_auth_sampleapp | at Microsoft.Owin.Security.DataProtection.AppBuilderExtensions.CreateDataProtector (Owin.IAppBuilder,string[]) <0x00056>
ModernShopping_auth_sampleapp | at Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationMiddleware..ctor (Microsoft.Owin.OwinMiddleware,Owin.IAppBuilder,Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationOptions) <0x0030f>
ModernShopping_auth_sampleapp | at (wrapper dynamic-method) object.lambda_method (System.Runtime.CompilerServices.Closure,Microsoft.Owin.OwinMiddleware,Owin.IAppBuilder,Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationOptions) <0x00052>
ModernShopping_auth_sampleapp | at (wrapper managed-to-native) System.Reflection.MonoMethod.InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&) <0x0006c>
ModernShopping_auth_sampleapp | at System.Reflection.MonoMethod.Invoke (object,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo) <0x000db>
ModernShopping_auth_sampleapp |
ModernShopping_auth_sampleapp | --- End of inner exception stack trace ---
ModernShopping_auth_sampleapp | at System.Reflection.MonoMethod.Invoke (object,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo) <0x00131>
ModernShopping_auth_sampleapp | at System.Reflection.MethodBase.Invoke (object,object[]) <0x0002a>
ModernShopping_auth_sampleapp | at System.Delegate.DynamicInvokeImpl (object[]) <0x00254>
ModernShopping_auth_sampleapp | at System.MulticastDelegate.DynamicInvokeImpl (object[]) <0x0003f>
ModernShopping_auth_sampleapp | at System.Delegate.DynamicInvoke (object[]) <0x00019>
ModernShopping_auth_sampleapp | at Microsoft.Owin.Builder.AppBuilder.BuildInternal (System.Type) <0x0015a>
ModernShopping_auth_sampleapp | at Microsoft.Owin.Builder.AppBuilder.Build (System.Type) <0x00013>
ModernShopping_auth_sampleapp | at Microsoft.Owin.Builder.AppBuilderExtensions.Build<System.Func`2<System.Collections.Generic.IDictionary`2<string, object>, System.Threading.Tasks.Task>> (Owin.IAppBuilder) <0x00039>
ModernShopping_auth_sampleapp | at Microsoft.Owin.Builder.AppBuilderExtensions.Build (Owin.IAppBuilder) <0x0001b>
ModernShopping_auth_sampleapp | at IdentityServer3.AccessTokenValidation.IdentityServerBearerTokenValidationMiddleware..ctor (System.Func`2<System.Collections.Generic.IDictionary`2<string, object>, System.Threading.Tasks.Task>,IdentityServer3.AccessTokenValidation.IdentityServerOAuthBearerAuthenticationOptions,Microsoft.Owin.Logging.ILoggerFactory) <0x00417>
ModernShopping_auth_sampleapp | at (wrapper dynamic-method) object.lambda_method (System.Runtime.CompilerServices.Closure,System.Func`2<System.Collections.Generic.IDictionary`2<string, object>, System.Threading.Tasks.Task>,IdentityServer3.AccessTokenValidation.IdentityServerOAuthBearerAuthenticationOptions,Microsoft.Owin.Logging.ILoggerFactory) <0x00052>
ModernShopping_auth_sampleapp | at (wrapper managed-to-native) System.Reflection.MonoMethod.InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&) <0x0006c>
ModernShopping_auth_sampleapp | at System.Reflection.MonoMethod.Invoke (object,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo) <0x000db>
ModernShopping_auth_sampleapp |
ModernShopping_auth_sampleapp | --- End of inner exception stack trace ---
ModernShopping_auth_sampleapp | at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at System.Delegate.DynamicInvokeImpl (System.Object[] args) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at System.MulticastDelegate.DynamicInvokeImpl (System.Object[] args) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at System.Delegate.DynamicInvoke (System.Object[] args) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at Microsoft.Owin.Builder.AppBuilder.BuildInternal (System.Type signature) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at Microsoft.Owin.Builder.AppBuilder.Build (System.Type returnType) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at ModernShopping.Auth.SampleApp.IApplicationBuilderExtensions+<>c__DisplayClass0_0.<UseIdentityServerBearerTokenAuthentication>b__1 (System.Func`2 next) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at Microsoft.AspNet.Builder.OwinExtensions+<>c__DisplayClass0_1.<UseOwin>b__1 (Microsoft.AspNet.Builder.RequestDelegate next1) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at Microsoft.AspNet.Builder.Internal.ApplicationBuilder.Build () [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at Microsoft.AspNet.Hosting.Internal.HostingEngine.BuildApplication () [0x00000] in <filename unknown>:0
So weird as I provided a data protector provider. Not sure why it's looking for Dpapi thing.
from https://gitter.im/IdentityServer/IdentityServer3:
tugberkugurlu 16:09
getting the below error on this: https://github.com/tugberkugurlu/ModernShopping/blob/12c9fb527e4892abb326b4486e8a92a06ba61db2/Auth/src/ModernShopping.Auth.SampleApp/Startup.cs#L70-L84
ModernShopping_auth_sampleapp | System.IdentityModel.Tokens.SecurityTokenInvalidSignatureException: IDX10503: Signature validation failed. Keys tried: 'System.IdentityModel.Tokens.X509SecurityKey - (thumbprint) : 6B7ACC520305BFDB4F7252DAEB2177CC091FAAE1
ModernShopping_auth_sampleapp | '.
ModernShopping_auth_sampleapp | Exceptions caught:
ModernShopping_auth_sampleapp | 'System.Security.Cryptography.CryptographicException: Keyset does not exist
ModernShopping_auth_sampleapp | at System.Security.Cryptography.RSACryptoServiceProvider.Common (System.Security.Cryptography.CspParameters p) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at System.Security.Cryptography.RSACryptoServiceProvider..ctor (Int32 dwKeySize, System.Security.Cryptography.CspParameters parameters) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at System.Security.Cryptography.RSACryptoServiceProvider..ctor (System.Security.Cryptography.CspParameters parameters) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at System.IdentityModel.Tokens.RSACryptoServiceProviderProxy..ctor (System.Security.Cryptography.RSACryptoServiceProvider rsa) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at System.IdentityModel.Tokens.AsymmetricSignatureProvider..ctor (System.IdentityModel.Tokens.AsymmetricSecurityKey key, System.String algorithm, Boolean willCreateSignatures) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at System.IdentityModel.Tokens.SignatureProviderFactory.CreateProvider (System.IdentityModel.Tokens.SecurityKey key, System.String algorithm, Boolean willCreateSignatures) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at System.IdentityModel.Tokens.SignatureProviderFactory.CreateForVerifying (System.IdentityModel.Tokens.SecurityKey key, System.String algorithm) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at System.IdentityModel.Tokens.X509SecurityKey.GetSignatureProvider (System.String algorithm, Boolean verifyOnly) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature (System.Byte[] encodedBytes, System.Byte[] signature, System.IdentityModel.Tokens.SecurityKey key, System.String algorithm) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature (System.String token, System.IdentityModel.Tokens.TokenValidationParameters validationParameters) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | '.
ModernShopping_auth_sampleapp | token: '{"typ":"JWT","alg":"RS256","x5t":"a3rMUgMFv9tPclLa6yF3zAkfquE","kid":"a3rMUgMFv9tPclLa6yF3zAkfquE"}.{"client_id":"ModernShoppingAuthSampleClient","scope":"write","sub":"0a568dc98b3e47e5a80d8fa6d07d209a","amr":["external"],"auth_time":1448208303,"idp":"Google","iss":"http://auth:44300","aud":"http://auth:44300/resources","exp":1448211907,"nbf":1448208307}'
ModernShopping_auth_sampleapp | at Microsoft.IdentityModel.Logging.LogHelper.Throw (System.String message, System.Type exceptionType, EventLevel logLevel, System.Exception innerException) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature (System.String token, System.IdentityModel.Tokens.TokenValidationParameters validationParameters) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken (System.String securityToken, System.IdentityModel.Tokens.TokenValidationParameters validationParameters, System.IdentityModel.Tokens.SecurityToken& validatedToken) [0x00000] in <filename unknown>:0
ModernShopping_auth_sampleapp | at Microsoft.AspNet.Authentication.JwtBearer.JwtBearerHandler+<HandleAuthenticateAsync>d__1.MoveNext () [0x00000] in <filename unknown>:0
for this request:
curl --header "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6ImEzck1VZ01Gdjl0UGNsTGE2eUYzekFrZnF1RSIsImtpZCI6ImEzck1VZ01Gdjl0UGNsTGE2eUYzekFrZnF1RSJ9.eyJjbGllbnRfaWQiOiJNb2Rlcm5TaG9wcGluZ0F1dGhTYW1wbGVDbGllbnQiLCJzY29wZSI6IndyaXRlIiwic3ViIjoiMGE1NjhkYzk4YjNlNDdlNWE4MGQ4ZmE2ZDA3ZDIwOWEiLCJhbXIiOlsiZXh0ZXJuYWwiXSwiYXV0aF90aW1lIjoxNDQ4MjA4MzAzLCJpZHAiOiJHb29nbGUiLCJpc3MiOiJodHRwOi8vYXV0aDo0NDMwMCIsImF1ZCI6Imh0dHA6Ly9hdXRoOjQ0MzAwL3Jlc291cmNlcyIsImV4cCI6MTQ0ODIxMTkwNywibmJmIjoxNDQ4MjA4MzA3fQ.Vfz6fjwBJ9ArGCDwt4N73KLARTazIffdlO5d9a49F5lKD2FT8ybsprhfZKYwcDEO65s8VrqM1TR64TJ0H645cz66NcaLPkLdrjCPt1eKef8RY9YVqXz8Z-_NRP1asc462gZgbHCcI92YshAdveGeazOaYdjP_0PcWp_aP4YW_b2hm9kQ7pSn_nMyTBeTsZsx-gR_a8_ke1HA9x9YFFRiwJkFmv-baHkd4nfx25lBRXCSN2gZN6KJuGHg38GQvTumubK_THPL_v0xAKuHGI59hFYarmCa3W3CfQtEFdTdJK7L8wLWMpvvUkOUu8r7oQowCHeRVRQgUqWcSC2mOAz48g" http://172.17.0.176:5001/api/values
any ideas on what might be causing it?
tugberkugurlu 16:15
could be a similar to this one: IdentityServer/IdentityServer3#461
tugberkugurlu 16:59
ok, I looked around and asked Kevin, it boiled down to this: AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet#179
it seems they fixed it in CoreCLR: dotnet/corefx#424
but not in mono
so, X509Certificate2 is being a problem.
Is there any other encryption mechanism that I can use in IdentityServer3 rather than X509Certificate2?
leastprivilege 17:06
Buggy bullshit
Signing you mean? Id or access tokens?
Access tokens can be set to reference. But then you need to de-reference them.
Maybe you get our token middleware to work on asp5.
tugberkugurlu 17:10
dunno, I am just assuming this is the problem: https://github.com/tugberkugurlu/ModernShopping/blob/master/Auth/src/ModernShopping.Auth/Startup.cs#L103
leastprivilege 17:10
Yeah fun times
tugberkugurlu 17:10
yeah
I am not sure why this is left unfixed in mono but it seems there is a highly-technical-security-expert-level reason
http://stackoverflow.com/questions/13921207/install-private-key-of-a-pkcs12-into-mono-cert-store-on-linux-programmatically
do I have a way to say "use something else for signing" here? https://github.com/tugberkugurlu/ModernShopping/blob/master/Auth/src/ModernShopping.Auth/Startup.cs#L103
leastprivilege 17:13
It is rather when you receive the token right?
Anyways you can get around the cert by using reference tokens.
tugberkugurlu 17:14
yes, it gives that exception on the JwtBearer auth handler inside the app
what does "reference token" mean?
is this an openid connect thing?
any docs?
leastprivilege 17:24
It means the token contents stay in idsrv. You only pass the reference to the api
We have an access token validation endpoint that you can then use to get the contents
our katana mw does that all automatically
you should get that to work using the owin bridge
tugberkugurlu 17:31
any samples on that one? I understood the concept but cannot visualize how to wire everything up
tugberkugurlu 17:55
OK, found it (I guess): https://github.com/IdentityServer/IdentityServer3.Samples/blob/3a84d4849c8e13dbe12f38628c754d8b6c4fd84c/source/Clients/SampleAspNetWebApi/Startup.cs#L17-L25 replacing this with that https://github.com/tugberkugurlu/ModernShopping/blob/master/Auth/src/ModernShopping.Auth.SampleApp/Startup.cs#L70-L84
am I on the right path?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.