Вышел Passport

Вышел Passport

Первый стабильный релиз

Знать своих пользователей очень важно, особенно, если вы хотите выстроить с ними долгосрочные отношения. Я начал разрабатывать Passport не только с целью создания собственного трекера, но и в перспективе сделать аналог Auth0.

Что сделано

Архитектура трекера

Схематично, взаимодействие пользователя с трекером можно изобразить следующим образом:

Passport Tracker

На сайте обязательно нужно разместить fingerprint2, который непосредственно отвечает за вычисление уникального идентификатора браузера пользователя и instruction - скрипт, который будет делать всю необходимую работу.

<script>
    window.Passport = {debug: true} // опциональная возможность переопределить поведение трекера
</script>
<script src="https://id.octolab.net/vendor/jquery.min.js">// опционально, если нет транспорта</script>
<script src="https://id.octolab.net/vendor/fingerprint2.min.js"></script>
<script src="https://id.octolab.net/api/v1/tracker/instruction"></script>

Проблемы

К сожалению, я обнаружил различия в поведении браузера Safari на локальном окружении с CORS http://demo.local <-> http://passport.local и в production. Это сильно затрудняет разработку. Суть проблемы в их более жёсткой политике к так называемому cross-site tracking, которая подробно описана здесь. Решение этой проблемы запланировано на ближайшие релизы 1.1.x. В Chrome и Firefox при этом всё 👌

Быстрый старт

Локальная сборка

$ egg github.com/kamilsk/passport@^1.0.0 -- make up status

    Name                   Command               State                        Ports
---------------------------------------------------------------------------------------------------------
env_db_1        docker-entrypoint.sh postgres    Up      0.0.0.0:5432->5432/tcp
env_server_1    /bin/sh -c envsubst '$SERV ...   Up      80/tcp, 0.0.0.0:80->8080/tcp
env_service_1   click run --with-profile - ...   Up      0.0.0.0:8080->80/tcp, 0.0.0.0:8090->8090/tcp ...
$

Используя готовый Docker-образ

$ docker network create -d bridge passport
$ docker run --rm -d \
             --env-file .env \
             --network passport \
             --name passport-db \
             -h db \
             -p 5432:5432 \
             postgres:10-alpine
$ docker run --rm -it \
             --env-file .env \
             --network passport \
             --name passport-migration \
             --link passport-db:db \
             -h migration \
             kamilsk/passport:latest migrate up
$ docker run --rm -d \
             --env-file .env \
             --network passport \
             --name passport-service \
             --link passport-db:db \
             -h service \
             -p 8080:80 \
             kamilsk/passport:latest
$ docker ps -f name=passport
# IMAGE                     COMMAND                  PORTS                       NAMES
# kamilsk/passport:latest   "passport run"           0.0.0.0:8080->80/tcp, ...   passport-service
# postgres:10-alpine        "docker-entrypoint.s…"   0.0.0.0:5432->5432/tcp      passport-db
$

API

$ curl -v --cookie "marker=41ca5e09-3ce2-4094-b108-3ecc257c6fa4" http://localhost:8080/api/v1/tracker/instruction
# > GET /api/v1/tracker/instruction HTTP/1.1
# > Host: localhost:8080
# > User-Agent: curl/7.54.0
# > Accept: */*
# > Cookie: marker=41ca5e09-3ce2-4094-b108-3ecc257c6fa4
# >
# < HTTP/1.1 200 OK
# < Cache-Control: no-cache, no-store, must-revalidate, private, max-age=0
# < Content-Type: application/javascript
# < Expires: Thu, 01 Jan 1970 00:00:00 UTC
# < Pragma: no-cache
# < Set-Cookie: marker=41ca5e09-3ce2-4094-b108-3ecc257c6fa4; Path=/; HttpOnly; Secure
# < Vary: Origin
# < X-Accel-Expires: 0
# < Date: Tue, 10 Apr 2018 16:07:56 GMT
# < Content-Length: 1146
# <
# !function(t,n,e,i,r){"use strict";var a=t.Passport=t.Passport||{debug:r.debug}...
$ curl -v -X POST \
       -H "Content-Type: application/json" \
       -d '{"fingerprint": "ee657834d1ff745af85141252ee0e435", "metadata": [{"key": "value"}]}' \
       --cookie "marker=41ca5e09-3ce2-4094-b108-3ecc257c6fa4" \
       http://localhost:8080/api/v1/tracker/fingerprint
# > POST /api/v1/tracker/fingerprint HTTP/1.1
# > Host: localhost:8080
# > User-Agent: curl/7.54.0
# > Accept: */*
# > Cookie: marker=41ca5e09-3ce2-4094-b108-3ecc257c6fa4
# > Content-Type: application/json
# > Content-Length: 83
# >
# * upload completely sent off: 83 out of 83 bytes
# < HTTP/1.1 201 Created
# < Vary: Origin
# < Date: Tue, 10 Apr 2018 16:12:50 GMT
# < Content-Length: 0
# <
$

Теги

go passport

Автор

Камиль Самигуллин
Камиль Самигуллин

Разработчик

Кто мои пользователи? Как часто они заходят на мои ресурсы и, главное, на какие? Для ответа на эти вопросы я написал свой собственный трекер Passport.

Спонсоры

Опубликовано

10.04.2018