{"activeVersionTag":"latest","latestAvailableVersionTag":"latest","collection":{"info":{"_postman_id":"b94f1a68-75c4-40cf-8910-8de6f90e8ece","name":"Identifo","description":"# Identifo framework\n\nIdentifo is tiny, fast and configurable Identity Service for your project. \n\nThere is a lot of Authorization and Authentication services on the market now.\n\nSome of them are commercial SaaS systems with one click integration like [Auth0](https://auth0.com), [AWS Cognito](https://aws.amazon.com/cognito/), [Firebase auth](https://firebase.google.com/docs/auth/).\n\nSome of them are self-hosted and open-sourced, like [OauthD](https://github.com/oauth-io/oauthd), [Gluu Server](https://www.gluu.org/),\n[Anvil](http://anvil.io/#features).\n\nAlmost all of them provides OpenID Connect and Oauth2 login flow. It makes an excellent sense for expected use cases. The service is external to your servers, and OpenID Connect is one of the most secure ways to provide auth service in this architecture solution.\n\nSomeday we have started to implement Strongbox project. It's highly secure team messenger.  We are unable to use external services in this case, because it decreases the security level by storing user data and credentials on 3rd party services somewhere in the cloud. Also, it makes impossible to host this solution on premises, creating external dependency.\n\nWe could use a self-hosted solution. However, we had to keep all our codebase with Go. All of the current candidates provided OpenID Connect, OAuth2 login flow. It's overcomplicated for single app solution. If you have one backend, that host's your web app and provide REST API for native clients - you own users password. So there no any sense for OIDC.\n\nSo we decided to implement Identity Provider with these key features:\n\n- easy to integrate into any infrastructure\n- fast, small and binary distributed\n- uses JWT and other OIDC principles, avoid all levels of redirections\n- provide default user persistent storage service\n- provide an easy way to integrate any other user persistent layer\n- provide default login/register/reset password forms \n- provide the way to  restyle login/register/reset form\n- implement token introspection\n- implement machine-machine tokens (analog to Oauth2 Client Credentials Grant)\n- optional management console to set up, monitor and configure the service\n\nAlthough Identifo is not intended to implement OpenID Connect flow, you could easily integrate it with [Ory Hydra](https://www.ory.sh). Just with a couple of minutes, you able to get the complete OIDC support. The tutorial and instructions TBA.\n\n# Quickstart\n\nFirstly, build static files of the admin panel. Make sure that you have `npm` installed.\n```bash\ncd static/admin_panel\n./update_static.sh\n```\nAfter all files are successfully built, return to project's root and start the container with `docker-compose`:\n```bash\ncd ../..\ndocker-compose up\n```\nMake sure to supply `.env` file with `IDENTIFO_ADMIN_LOGIN` and `IDENTIFO_ADMIN_PASSWORD` variables which contain admin login information. If these environment variables are not specified, the default values will be used, which can be unsafe.<br/>\n\n\nIf you do not want to use `docker-compose`, you can start the server with `docker run`:<br/>\n```bash\ndocker run --env-file .env -p 8081:8081 -v $(pwd)/server-config.yaml:/root/server-config.yaml -v $(pwd)/jwt/:/root/jwt/ -v $(pwd)/email_templates/:/root/email_templates/ -v $(pwd)/web/static/:/root/web/static/ -v $(pwd)/admin_panel/build/:/root/admin_panel/build identifo\n```\n\n<br/>\nNow you have the Identifo server running on port 8081.\nPing server: `curl http://localhost:8081/ping` and go to `http://localhost:8081/adminpanel` to make sure it is all good.","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","isPublicCollection":false,"owner":"1356280","team":84892,"collectionId":"b94f1a68-75c4-40cf-8910-8de6f90e8ece","publishedId":"RWaGUpet","public":true,"publicUrl":"https://identifo.madappgang.com","privateUrl":"https://go.postman.co/documentation/1356280-b94f1a68-75c4-40cf-8910-8de6f90e8ece","customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"EF5B25"},"documentationLayout":"classic-double-column","version":"8.11.6","publishDate":"2018-09-08T09:57:48.000Z","activeVersionTag":"latest","documentationTheme":"light","metaTags":{},"logos":{}},"statusCode":200},"environments":[{"name":"Local","id":"8627c658-862c-4b5c-80f8-b76d2a64ca36","owner":"1356280","values":[{"key":"server","value":"http://127.0.0.1:8081","enabled":true},{"key":"APP_SECRET","value":"secret","enabled":true},{"key":"hmacAuthHeader","value":"SHA-256=yDLyLHBQ/p3+J9QrJoG2O+kxjwNGHik9pjPmyqLbAxo=","enabled":true},{"key":"X-Identifo-Timestamp","value":"1537972893","enabled":true},{"key":"timestamp_header","value":"1537972912","enabled":true},{"key":"AppID","value":"59fd884d8f6b180001f5b4e2","enabled":true},{"key":"auth_server","value":"http://127.0.0.1:8111","enabled":true},{"key":"api_server","value":"http://127.0.0.1:8091","enabled":true},{"key":"UserID","value":"5cdd0f624f6acb18c9ca22f2","enabled":true},{"key":"smartrun_access_token","value":"eyJhbGciOiJFUzI1NiIsImtpZCI6ImZ2T2h1dTdPMXRqbmIwaTA5OUxNU21HemowRSIsInR5cCI6IkpXVCJ9.eyJ0eXBlIjoiYWNjZXNzIiwiYXVkIjoiNTlmZDg4NGQ4ZjZiMTgwMDAxZjViNGUyIiwiZXhwIjoxNTcxMzE1NTgyLCJpYXQiOjE1NzEzMDY1ODIsImlzcyI6ImF1dGguc21hcnRydW4uYXBwIiwic3ViIjoiNWRhODNjNTY1YTBjNTQwMDAxNjk0NDEyIn0.KUhH9CoF5hqRiqa_Y6D-r0CqSXQXpwbeYsdSSNIFQmBqo9CQNOUl-ANZ0ONB-mbOxbsL5ZHeGmBwK9dXec1rsg","enabled":true},{"key":"DigestHeader","value":"","enabled":true}],"published":true}],"user":{"authenticated":false,"permissions":{"publish":false}},"run":{"button":{"js":"https://run.pstmn.io/button.js","css":"https://run.pstmn.io/button.css"}},"web":"https://www.getpostman.com/","team":{"logo":"https://res.cloudinary.com/postman/image/upload/t_team_logo_pubdoc/v1/team/a1e7bd523b0cb488f73ccc581cb1d3838f264478bcd1cee1c33484ad490ad293","favicon":"https://madappgang.com/favicon.ico"},"isEnvFetchError":false,"languages":"[{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"HttpClient\"},{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"RestSharp\"},{\"key\":\"curl\",\"label\":\"cURL\",\"variant\":\"cURL\"},{\"key\":\"dart\",\"label\":\"Dart\",\"variant\":\"http\"},{\"key\":\"go\",\"label\":\"Go\",\"variant\":\"Native\"},{\"key\":\"http\",\"label\":\"HTTP\",\"variant\":\"HTTP\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"OkHttp\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"Unirest\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"Fetch\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"jQuery\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"XHR\"},{\"key\":\"c\",\"label\":\"C\",\"variant\":\"libcurl\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Axios\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Native\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Request\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Unirest\"},{\"key\":\"objective-c\",\"label\":\"Objective-C\",\"variant\":\"NSURLSession\"},{\"key\":\"ocaml\",\"label\":\"OCaml\",\"variant\":\"Cohttp\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"cURL\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"Guzzle\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"HTTP_Request2\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"pecl_http\"},{\"key\":\"powershell\",\"label\":\"PowerShell\",\"variant\":\"RestMethod\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"http.client\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"Requests\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"httr\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"RCurl\"},{\"key\":\"ruby\",\"label\":\"Ruby\",\"variant\":\"Net::HTTP\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"Httpie\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"wget\"},{\"key\":\"swift\",\"label\":\"Swift\",\"variant\":\"URLSession\"}]","languageSettings":[{"key":"csharp","label":"C#","variant":"HttpClient"},{"key":"csharp","label":"C#","variant":"RestSharp"},{"key":"curl","label":"cURL","variant":"cURL"},{"key":"dart","label":"Dart","variant":"http"},{"key":"go","label":"Go","variant":"Native"},{"key":"http","label":"HTTP","variant":"HTTP"},{"key":"java","label":"Java","variant":"OkHttp"},{"key":"java","label":"Java","variant":"Unirest"},{"key":"javascript","label":"JavaScript","variant":"Fetch"},{"key":"javascript","label":"JavaScript","variant":"jQuery"},{"key":"javascript","label":"JavaScript","variant":"XHR"},{"key":"c","label":"C","variant":"libcurl"},{"key":"nodejs","label":"NodeJs","variant":"Axios"},{"key":"nodejs","label":"NodeJs","variant":"Native"},{"key":"nodejs","label":"NodeJs","variant":"Request"},{"key":"nodejs","label":"NodeJs","variant":"Unirest"},{"key":"objective-c","label":"Objective-C","variant":"NSURLSession"},{"key":"ocaml","label":"OCaml","variant":"Cohttp"},{"key":"php","label":"PHP","variant":"cURL"},{"key":"php","label":"PHP","variant":"Guzzle"},{"key":"php","label":"PHP","variant":"HTTP_Request2"},{"key":"php","label":"PHP","variant":"pecl_http"},{"key":"powershell","label":"PowerShell","variant":"RestMethod"},{"key":"python","label":"Python","variant":"http.client"},{"key":"python","label":"Python","variant":"Requests"},{"key":"r","label":"R","variant":"httr"},{"key":"r","label":"R","variant":"RCurl"},{"key":"ruby","label":"Ruby","variant":"Net::HTTP"},{"key":"shell","label":"Shell","variant":"Httpie"},{"key":"shell","label":"Shell","variant":"wget"},{"key":"swift","label":"Swift","variant":"URLSession"}],"languageOptions":[{"label":"C# - HttpClient","value":"csharp - HttpClient - C#"},{"label":"C# - RestSharp","value":"csharp - RestSharp - C#"},{"label":"cURL - cURL","value":"curl - cURL - cURL"},{"label":"Dart - http","value":"dart - http - Dart"},{"label":"Go - Native","value":"go - Native - Go"},{"label":"HTTP - HTTP","value":"http - HTTP - HTTP"},{"label":"Java - OkHttp","value":"java - OkHttp - Java"},{"label":"Java - Unirest","value":"java - Unirest - Java"},{"label":"JavaScript - Fetch","value":"javascript - Fetch - JavaScript"},{"label":"JavaScript - jQuery","value":"javascript - jQuery - JavaScript"},{"label":"JavaScript - XHR","value":"javascript - XHR - JavaScript"},{"label":"C - libcurl","value":"c - libcurl - C"},{"label":"NodeJs - Axios","value":"nodejs - Axios - NodeJs"},{"label":"NodeJs - Native","value":"nodejs - Native - NodeJs"},{"label":"NodeJs - Request","value":"nodejs - Request - NodeJs"},{"label":"NodeJs - Unirest","value":"nodejs - Unirest - NodeJs"},{"label":"Objective-C - NSURLSession","value":"objective-c - NSURLSession - Objective-C"},{"label":"OCaml - Cohttp","value":"ocaml - Cohttp - OCaml"},{"label":"PHP - cURL","value":"php - cURL - PHP"},{"label":"PHP - Guzzle","value":"php - Guzzle - PHP"},{"label":"PHP - HTTP_Request2","value":"php - HTTP_Request2 - PHP"},{"label":"PHP - pecl_http","value":"php - pecl_http - PHP"},{"label":"PowerShell - RestMethod","value":"powershell - RestMethod - PowerShell"},{"label":"Python - http.client","value":"python - http.client - Python"},{"label":"Python - Requests","value":"python - Requests - Python"},{"label":"R - httr","value":"r - httr - R"},{"label":"R - RCurl","value":"r - RCurl - R"},{"label":"Ruby - Net::HTTP","value":"ruby - Net::HTTP - Ruby"},{"label":"Shell - Httpie","value":"shell - Httpie - Shell"},{"label":"Shell - wget","value":"shell - wget - Shell"},{"label":"Swift - URLSession","value":"swift - URLSession - Swift"}],"layoutOptions":[{"value":"classic-single-column","label":"Single Column"},{"value":"classic-double-column","label":"Double Column"}],"versionOptions":[],"environmentOptions":[{"value":"0","label":"No Environment"},{"label":"Local","value":"1356280-8627c658-862c-4b5c-80f8-b76d2a64ca36"}],"canonicalUrl":"https://identifo.madappgang.com/view/metadata/RWaGUpet"}