Git Product home page Git Product logo

aurelia-authentication's Introduction

Archived

It was fun while it lasted, but we have to stop maintaining these repositories. We haven't used these projects for quite some time and maintaining them is becoming harder to do.

You deserve better, and for that reason we've decided to archive some repositories, which includes this one.

Feel free to fork and alter the repositories, and go forth making awesome stuff.

aurelia-authentication

Build Status Known Vulnerabilities Gitter

Aurelia-authentication is a token-based authentication plugin for Aurelia with support for popular social authentication providers (Google, Twitter, Facebook, LinkedIn, Windows Live, FourSquare, Yahoo, Github, Instagram) and a local strategy, i.e. simple username / email and password. It developed of a fork of paul van bladel's aurelia-auth which itself is a port of the great Satellizer library.

Aurelia-authentication makes local and third-party authentication easy. Aurelia-authentication does not use any cookies but relies on a token (designed for JWT, but has basic support for others as well) stored in the local storage of the browser. If your server is setup right, it can be a simple as just to select your server endpoint from your aurelia-api setup, add your third-party client ids and you are ready to go.

You have multiple endpoints? No problem! In the recommended setting, aurelia-authentication makes use of aurelia-api which can set up multiple endpoints. Just specify in your aurelia-authentication configuration which endpoint you want to use for your server and which further endpoints you want to be configured and your token will be sent automatically to your protected API when the user is authenticated.

With aurelia-authentication you can:

  • Use local login or third-party providers to authenticate the user
  • Automatically add your token to requests to the specified endpoints
  • Automatically refresh your token
  • Extensively customize the settings
  • Use standalone or in conjunction with aurelia-api
  • Use Auth0 as your only authentication provider (see the relevant section for more info)
  • Update valueConverters using the 'authorization-change' binding signal.
  • Subscribe to the 'authorization-change' event.
  • And more

Documentation

You can find usage examples and the documentation at the aurelia-authentication-docs.

The changelog provides you with information about important changes.

Installation

Aurelia-Cli

Run npm i aurelia-authentication --save from your project root.

Aurelia-authentication needs an installation of aurelia-api. It also has submodules (currently only the authFilter) and makes use of extend and jwt-decode. So, add following to the build.bundles.dependencies section of aurelia-project/aurelia.json.

"dependencies": [
  // ...
  "extend",
  {
    "name": "aurelia-authentication",
    "path": "../node_modules/aurelia-authentication/dist/amd",
    "main": "aurelia-authentication"
  },
  {
    "name": "jwt-decode",
    "path": "../node_modules/jwt-decode/lib",
    "main": "index"
  }
  // ...
],

Jspm

Run jspm i aurelia-authentication

Add aurelia-authentication to the bundles.dist.aurelia.includes section of build/bundles.js.

Aurelia-authentication needs an installation of aurelia-api. It also has submodules. They are imported in it's main file, so no further action is required.

If the installation results in having forks, try resolving them by running:

jspm inspect --forks
jspm resolve --only registry:package-name@version

E.g.

jspm inspect --forks
>     Installed Forks
>         npm:aurelia-dependency-injection 1.0.0-beta.1.2.3 1.0.0-beta.2.1.0

jspm resolve --only npm:[email protected]

Webpack

Run npm i aurelia-authentication --save from your project root.

The authFilter needs to be added to the webpack.config.js.

Run npm i ModuleDependenciesPlugin --save-dev from your root project and include it the webpack.config.js, eg:

const { AureliaPlugin, ModuleDependenciesPlugin  } = require('aurelia-webpack-plugin');`

In the plugins section add the authFilter, eg:

  plugins: [
    new AureliaPlugin(),
    new ModuleDependenciesPlugin({
      "aurelia-authentication": [ "./authFilterValueConverter" ],
    }),

Aurelia-authentication needs an aurelia-api. It also has submodules. They are listed as resources in the package.json. So, no further action is required.

Typescript

Npm-based installations pick up the typings automatically. For Jspm-based installations, add to your typings.json:

"aurelia-authentication": "github:spoonx/aurelia-authentication",

and run typings i

or run

typings i github:spoonx/aurelia-authentication

Usage

Add a configuration file

Set your custom configuration. You can find all options and the default values in the baseConfig.

/* authConfig.js */
var baseConfig = {
    endpoint: 'auth',             // use 'auth' endpoint for the auth server
    configureEndpoints: ['auth'], // add Authorization header to 'auth' endpoint
    facebook: {
        clientId: 'your client id' // set your third-party providers client ids
    }
}

Configure the plugin

Register the plugin and apply your authConfig.

/* main.js */
import authConfig from './authConfig';

aurelia.use
  /* Your other plugins and init code */
  .plugin('aurelia-api', config => {
    // Register an authentication hosts
    config.registerEndpoint('auth');
  })
  /* configure aurelia-authentication */
  .plugin('aurelia-authentication', baseConfig => {
      baseConfig.configure(authConfig);
  });

Use AuthService in a view-model

import {AuthService} from 'aurelia-authentication';
import {inject} from 'aurelia-framework';

@inject(AuthService)
export class Login {
    constructor(authService) {
        this.authService   = authService;
        this.authenticated = false;
    };

    // use authService.login(credentialsObject) to login to your auth server
    // authService.authenticated holds the current status
    // authService.getPayload() gives you the current payload object (for jwt)
    login(credentialsObject) {
      return this.authService.login(credentialsObject)
        .then(() => {
            this.authenticated = this.authService.authenticated;
        });
    };

    // use authService.logout to delete stored data
    // set expiredRedirect in your settings to automatically redirect
    logout() {
      return this.authService.logout()
        .then(() => {
          this.authenticated = this.authService.authenticated;
        });
    }

    // use authService.authenticate(name) to get third-party authentication
    authenticateFacebook() {
      return this.authService.authenticate('facebook')
        .then(() => {
          this.authenticated  = this.authService.authenticated;
        });
    }
}

Quick authService api overview

authService
  // the Rest instance of aurelia-api used for requests. '.client.client' is the used httpClient instance (from aurelia-fetch-client)
  .client
  // the current authentication status
  .authenticated
  // signup into server with credentials and optionally logs in
  signup(displayNameOrCredentials, emailOrOptions, passwordOrRedirectUri, options, redirectUri)
  // log into server with credentials. Stores response if successful
  login(emailOrCredentials, passwordOrOptions, optionsOrRedirectUri, redirectUri)
  // deletes stored response. If configured in the config, sends optionally a logout request. 
  logout(redirectUri, query, name)
  // manually refresh authentication. Needs refreshToken options to be configured
  .updateToken()
  // link third-party account or log into server via third-party authentication. Stores response if successful
  authenticate(name, userData)
  // unlink third-party
  unlink(name, redirectUri)
  // get profile
  .getMe(criteriaOrId)
  // update profile
  .updateMe(body, criteriaOrId)
  // check if token is available and, if applicable, not expired
  .isAuthenticated()
  // get token payload if available
  .getTokenPayload()
  // get the token ttl if available
  .getTtl()
  // get the token exp if available
  .getExp()

Additionally, you can use AuthFilterValueConverter and AuthenticatedStep for UI feedback.

You can find more information in the aurelia-authentication-docs.

Note

Some month ago, we've simplified installation and usage! This plugin should now be installed using jspm i aurelia-authentication or (for webpack) npm i aurelia-authentication --save. Make sure you update all references to spoonx/aurelia-authentication and spoonx/aurelia-api and remove the spoonx/ prefix (don't forget your config.js, package.json, imports and bundles).

aurelia-authentication's People

Contributors

0xsalman avatar adamwillden avatar alfkonee avatar bliu886 avatar bmarotta avatar cb-fred avatar chekkan avatar diegotroitino avatar digizen avatar doktordirk avatar fvdsn avatar indfnzo avatar jawa-the-hutt avatar kellyethridge avatar larserikfinholt avatar lukechilds avatar markoburazer avatar martinmason avatar maximbalaganskiy avatar meash-nrel avatar orenamsalem avatar paulvanbladel avatar perlun avatar pfurini avatar photomoose avatar rwoverdijk avatar slimfit avatar theremix avatar vidaritos avatar wouth avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

aurelia-authentication's Issues

add install test

basics are simple. just delete the config map entry before travis jspm install

Ability to change the login content payload

  • It would be nice if we could specify the payload parameter keys for login authentication with local strategies. As of now the payload sent to the server is always {email: email, password: password}, while my server expects a username key as a parameter for authentication.

Can't set request header to application/x-www-form-urlencoded

I think the OAuth2 spec prefers that login token requests are sent with Content-Type: application/x-www-form-urlencoded - often with a grant_type value as well.

I can't see an easy way to do this with aurelia-auth, but I may be missing something.

I'm trying to call a .Net Web Api with OWIN for all the auth stuff, and I don't have a lot of flexibility on the type of requests that will be accepted.

Fix SPA redirects

We should use import {Redirect} from 'aurelia-router'; instead of using window.location for SPA redirects (as eluded to here). This will:

  • make things consistent (note the loginRoute configuration option)
  • probably be safer by conforming to aurelia's routing methods. I don't know if the current method could break the application's location history in some way.
  • allow new defaults to support pushstate enabled applications (which do not use hashes)

redirect_uri for LinkedIn need to be encoded

Hey guys,

So LinkedIn fails to authorize if redirect_uri value is not encoded. I am getting around it by overriding redirectUri property in the configuration file. For example

redirectUri: encodeURI(window.location.origin || window.location.protocol + '//' + window.location.host)

You guys may want to support it by default

add logoutUrl

send logout to server for those who want that. easy to do and no harm done

GitHub installation with SpoonX aurelia-api breaks tests

Hi guys,

installing aurelia-authentication and aurelia-api breaks my tests (not my app). I think this is somehow related to the dependencies. I have the following in package.json:

      "aurelia-api": "github:SpoonX/aurelia-api@^2.2.0",
      "aurelia-authentication": "github:SpoonX/aurelia-authentication@^2.1.1",

This generates a config.js with three entries:

    "github:SpoonX/[email protected]": {
    "github:SpoonX/[email protected]": {
    "github:spoonx/[email protected]": {

My jspm_packages only has a SpoonX directory. Karma gives me the following error:

15 04 2016 19:51:30.411:WARN [web-server]: 404: /base/jspm_packages/github/spoonx/[email protected]
15 04 2016 19:51:30.433:WARN [web-server]: 404: /base/jspm_packages/github/spoonx/[email protected]/aurelia-api.js
Chrome 49.0.2623 (Windows 8.1 0.0.0) ERROR: 'Potentially unhandled rejection [8] Error: XHR error (404 Not Found) loading http://localhost:9876/base/jspm_packages/github/spoonx/[email protected]
    at error (http://localhost:9876/base/jspm_packages/system.src.js?6536115be64e0ff966e05546f7767676fa7c03d6:1020:16)
    at XMLHttpRequest.xhr.onreadystatechange (http://localhost:9876/base/jspm_packages/system.src.js?6536115be64e0ff966e05546f7767676fa7c03d6:1028:13)'

Any advice? NPM install of auth is not possible at the moment because of some install errors (see #81).

App breaks when bundled (missing authFilter import)

My bundle is missing authFilter:

...
      "github:polymer/[email protected]/MutationObserver.js",
      "github:spoonx/[email protected]",
      "github:spoonx/[email protected]/config.js",
      "github:spoonx/[email protected]/endpoint.js",
      "github:spoonx/[email protected]/index.js",
      "github:spoonx/[email protected]/rest.js",
      "github:spoonx/[email protected]",
      "github:spoonx/[email protected]/app.fetch-httpClient.config.js",
      "github:spoonx/[email protected]/authService.js",
      "github:spoonx/[email protected]/authUtils.js",
      "github:spoonx/[email protected]/authentication.js",
      "github:spoonx/[email protected]/authorizeStep.js",
      "github:spoonx/[email protected]/baseConfig.js",
      "github:spoonx/[email protected]/index.js",
      "github:spoonx/[email protected]/oAuth1.js",
      "github:spoonx/[email protected]/oAuth2.js",
      "github:spoonx/[email protected]/popup.js",
      "github:spoonx/[email protected]/storage.js",
      "npm:[email protected]",
...

authFilter is required here: https://github.com/SpoonX/aurelia-auth/blob/e62c9eb9d39d674cc218ea390fa87600b7346c9f/src/index.js#L16

But is not imported, thus not bundled and so results in a 404.

I assume you just need to add import './authFilter'; to fix this.

Optional link with orm

Perhaps allow authentication to be linked up with ORM?

.getMe() could return a User entity (for instance).

Missing dependency

spoonx/aurelia-api is injected in several files, but is not a listed JSPM dependency in package.json.

separately installing it is required.

Also you can remove the legacy "aurelia-http-client" dependency while you are in there, as I believe you solely rely on fetch client now.

jspm install aurelia-authentication Fails

when installing aurelia-authentication from jspm it fails with this log

C:\Users\Alfred\Source\Projects\ElyfeASP4\ElyfeGh\src\Elyfe.Web> jspm install aurelia-authentication
     Updating registry cache...
     Looking up npm:aurelia-authentication
     Downloading npm:[email protected]

warn Error on processPackageConfig
     Package.json dependency aurelia-dependency-injection set to npm:aurelia-dependency-injection@^1.0.0-beta.1.2.0, whi
ch is not a valid dependency format for npm.
     It's advisable to publish jspm-style packages to GitHub or another registry so conventions are clear.

err  Error: Error processing package config for npm:aurelia-authentication.
         at C:\Users\Alfred\Source\Projects\ElyfeASP4\ElyfeGh\src\Elyfe.Web\node_modules\jspm\node_modules\systemjs-builder\lib\builder.js:27:9
         at Object.lib$rsvp$events$$default.trigger (C:\Users\Alfred\Source\Projects\ElyfeASP4\ElyfeGh\src\Elyfe.Web\node_modules\rsvp\dist\rsvp.js:245:13)
         at null._onTimeout (C:\Users\Alfred\Source\Projects\ElyfeASP4\ElyfeGh\src\Elyfe.Web\node_modules\rsvp\dist\rsvp.js:779:47)
         at Timer.listOnTimeout (timers.js:92:15)

err  Error processing package config for npm:aurelia-authentication.

Azure Active Directory / ADAL.js

Given that Satellizer didn't support Azure AD, does your library inherit this limitation?

sahat/satellizer#433
sahat/satellizer#453

From: Sahat Yalkabov [mailto:[email protected]]
Sent: Friday, 10 July 2015 2:37 PM
To: sahat/satellizer
Cc: nigel-dewar
Subject: Re: [satellizer] Azure AD ? (#453)

I have decided not to add Azure AD authentication after all. It was the most frustrating experience. Their single sign-on process is either broken or just so horribly unintuitive. I couldn't even get past sign in popup to get authorization code. The page kept redirecting back after clicking on my account to https://login.microsoftonline.com/common/reprocess?sessionId=....... And if I were to log out I couldn't get to sign-in at all. When I enter an email and press TAB to enter a password, it automatically tries to sign you in, it then redirects to microsoft login, after logging in there, it redirects me back to Azure login. And the cycle repeats.

Feature Request: Redirect to original page after successful login

So the gist here is if I click a link, and it turns out for whatever reason I'm not/no longer authenticated, I get redirected to the login... fine. But when I login, I get redirected back to home or wherever that is statically configured in my authentication settings. It would be good if we could support redirecting back to the original page I wanted to reach.

I actually wanted to submit a PR for this, I started fiddling, and essentially I can make it work... but to make it right, I need to understand a little more about the getAllInstructions() method. How/why would there be multiple instructions in one navigation? If you guys can give the help with this context, I'll happily submit my PR for this.

legacy references still

Across spoonx libraries you have changed lib references from github:/spoonx/* to just npm:*

There are still references in /dist/* sources to 'spoonx/aurelia-api' in this project so it's still loading that old reference as a dependency.

Change how Access/Refresh token nesting works

Following #93 I wonder if we could change something else. The whole token nesting by using Prop => Root => Name is more than a bit sucky. Without reading the comments the options are unclear and the names don't flow Root isn't the root.

Anyone have a better solution? I considered a single property that represents the path some.pathTo.theToken but I'm not sure how easy that is to unwrap or if that is less flexible for some reason.

Installing with JSPM throws errors.

ProjectRoot> jspm install aurelia-authentication
     Updating registry cache...
     Looking up npm:aurelia-authentication
     Downloading npm:[email protected]

warn Error on processPackageConfig
     Package.json dependency aurelia-dependency-injection set to npm:aurelia-dependency-injection@^1.0.0-beta.1.2.0, which is not a valid dependency format for npm.
     It's advisable to publish jspm-style packages to GitHub or another registry so conventions are clear.

err  Error: Error processing package config for npm:aurelia-authentication.
         at ProjectRoot\node_modules\jspm\node_modules\systemjs-builder\lib\builder.js:27:9
         at Object.lib$rsvp$events$$default.trigger (ProjectRoot\node_modules\rsvp\dist\rsvp.js:245:13)
         at null._onTimeout (ProjectRoot\node_modules\rsvp\dist\rsvp.js:568:47)
         at Timer.listOnTimeout (timers.js:92:15)

err  Error processing package config for npm:aurelia-authentication.

warn Installation changes not saved.

auth vs settings.auth

i don't like that auth is added to the route instead of config.auth as i think it's supposed to be. breaking change, i know, but i'd still like it changed. could support both for some time

npm install for webpack fails

I have a webpack-based aurelia project. I installed aurelia-authentication using npm i aurelia-authentication.

WebPack (via npm run dev) complains about not being able to find spoonx/aurelia-api:

ERROR in ./~/aurelia-authentication/dist/commonjs/aurelia-authentication.js
Module not found: Error: Cannot resolve module 'spoonx/aurelia-api' in /Users/mspencer/Developer/Lelander/skills/webapp/node_modules/aurelia-authentication/dist/commonjs
 @ ./~/aurelia-authentication/dist/commonjs/aurelia-authentication.js 12:18-47

ERROR in ./~/aurelia-authentication/dist/commonjs/app.fetch-httpClient.config.js
Module not found: Error: Cannot resolve module 'spoonx/aurelia-api' in /Users/mspencer/Developer/Lelander/skills/webapp/node_modules/aurelia-authentication/dist/commonjs
 @ ./~/aurelia-authentication/dist/commonjs/app.fetch-httpClient.config.js 22:18-47

Unhandled promise rejection TypeError: Cannot read property 'filter' of undefined

Since the Aurelia team updated some packages, my aurelia-auth has broken, and I can't figure out if it's me doing things wrong, or if there's a bug in aurelia-auth or the aurelia code base..

Any clues would be very much appreciated!

This happens on page loading, just after loading the nav-bar.html (DEBUG [templating] importing resources for http://localhost:9000/dist/nav-bar.html []):

Unhandled promise rejection TypeError: Cannot read property 'filter' of undefined
    at AuthFilterValueConverter.toView (http://localhost:9000/jspm_packages/github/spoonx/aurelia-auth@master/authFilter.js:22:26)
    at ValueConverter.evaluate (http://localhost:9000/jspm_packages/npm/[email protected]/aurelia-binding.js:1121:33)
    at Binding.bind (http://localhost:9000/jspm_packages/npm/[email protected]/aurelia-binding.js:4600:36)
    at Controller.bind (http://localhost:9000/jspm_packages/npm/[email protected]/aurelia-templating.js:2745:19)
    at View.bind (http://localhost:9000/jspm_packages/npm/[email protected]/aurelia-templating.js:847:24)
    at Controller.bind (http://localhost:9000/jspm_packages/npm/[email protected]/aurelia-templating.js:2766:19)
    at View.bind (http://localhost:9000/jspm_packages/npm/[email protected]/aurelia-templating.js:847:24)
    at Controller.bind (http://localhost:9000/jspm_packages/npm/[email protected]/aurelia-templating.js:2766:19)
    at Controller.automate (http://localhost:9000/jspm_packages/npm/[email protected]/aurelia-templating.js:2712:12)
    at http://localhost:9000/jspm_packages/npm/[email protected]/aurelia-templating.js:3733:22
(anonymous function) @ es6.promise.js:151
module.exports @ _invoke.js:5queue.
(anonymous function) @ _task.js:36
run @ _task.js:23
listner @ _task.js:27

The es6.promise.js and associated stuff is all from core-js v 2.0.3, which it seems the Aurelia team is moving to..

I'm stumped, so hope you have some clues..

Break apart readme

The readme is waaaaay way too long. For a module of this size, I think it's best to break it up into smaller documents. I have two suggestions:

  1. Put it in separate markdown files in the doc/ dir
  2. Put it in the wiki (which can also be managed through version control)

My preference is option 2, because the wiki is a decent place to put this.

Add to REAMDE how this differs from paulvanbladel/aurelia-auth

I've asked the question myself and I've seen it asked at least twice since. Save yourselves some time and stick it in the README!

See here for comments: https://gitter.im/SpoonX/Dev?at=56e7dd5e618c335373ebf2dc


How this differs from 'paulvanbladel/aurelia-auth'

This repository was originally a fork of paulvanbladel/aurealia-auth. It was forked when the original repository was in a period of inactivity, and later made into a repository of it's own. As such we often get asked how this repository differs from the original. So, at the time of writing the differences are as follows:

  • Provides the option to use endpoints, introduced by spoonx/aurelia-api, which simplifies API access.
    • By using aurelia-api the developer can specify which endpoints require the authentication patch.
  • TypeScript support added through the addition of d.ts (typescript definition) files
  • Lots of bug fixes
  • Refactored code to be more readable and performant

Aside: Public SpoonX repositories are open to the community and actively maintained and used by the SpoonX company. They follow a strict deploy cycle with reviews and follow semantic versioning. This ensures code quality control and long term commitment.

REQ: skipAuthorization

I saw on the sahat/satlelizer repo that they have the ability to prevent the authorization token on a per request basis like so:

How can I avoid sending Authorization header on all HTTP requests?

By default, once user is authenticated, JWT will be sent on every request. If you would like to prevent > that, you could use skipAuthorization option in your $http request. For example:

$http({
  method: 'GET',
  url: '/api/endpoint',
  skipAuthorization: true  // `Authorization: Bearer <token>` will not be sent on this request.
});

Is this something that could be added to aurelia-auth?

Feature Request: add support for auth0-lock authentication

Hi
I just implemented auth0-lock integration in my fork, to use in my latest app. This is the commit:
pfurini@17ed43a

It is a bit rough, and I don't know how to implement proper testing for this, but at least it works..

Key points:

  • It predates the oauthType config property, checking if it is equal to auth0-lock to use the auth0Lock.js provider. It's a bit hacky, but it'd be better if that property was named type like it used to be in the past..
  • It expects a global Auth0Lock class defined. One should load the lock-9.1.min.js script directly in index.html
  • It supports only the token responseType
  • Only tested in popup mode (speaking of lock options), probably not working in redirect mode, but it should be trivial to adjust

Let me know if anyone is interested in merging this, and what can be done to improve it (especially how to implement tests).

Thx

UPDATE: I changed the commit, the old one was wrong. The relevant files are only auth0Lock.js (added) and authentication.js (changed).

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.