Проверка токена состоит из серии шагов, и если какой-либо из них завершится неудачно, запрос должен быть отклонен. Вот список всех проверок, которые должен выполнить ваш API:
• Проверьте, правильно ли сформирован JWT
• Проверьте подпись
• Подтвердите стандартные утверждения [117 ]
• Проверьте разрешения приложения (области действия)
Для реализации пользовательской проверки вам необходимо выполнить следующее:
1) Разобрать Jwt
Чтобы выполнить разбор JWT вы можете либо вручную выполнить все проверки, как описано в спецификации RFC 7519> 7.2 Проверка JWT, либо использовать одну из библиотек, перечисленных в разделе «Библиотеки для подписи / проверки токенов» в JWT.io.
Например, если ваш API реализован с Node.js и вы хотите использовать библиотеку node-jsonwebtoken, то вы бы вызвали метод jwt.verify (). Если синтаксический анализ завершится неудачно, библиотека вернет ошибку JsonWebTokenError с сообщением jwt неверно сформировано.
2) Проверка алгоритма подписи
API должен проверить, соответствует ли алгоритм, указанный в заголовке JWT (свойство alg), ожидаемому API. Если нет, токен считается недействительным, и запрос должен быть отклонен.
Чтобы проверить, соответствует ли подпись ожиданиям API, необходимо декодировать JWT и извлечь свойство alg заголовка JWT.
В качестве альтернативы, вы можете использовать одну из библиотек, перечисленных в разделе «Библиотеки для подписи / проверки токенов» JWT.io .
3) Проверка утверждений
Как только API проверяет подпись токена, следующим шагом является проверка стандартных утверждений полезной нагрузки токена. Необходимо выполнить следующие проверки:
• Истечение срока действия токена: текущая дата / время должны предшествовать дате / времени истечения срока, указанному в заявке на получение опыта (которая является меткой времени Unix). Если нет, запрос должен быть отклонен.
• Эмитент токена: заявка «Iss» обозначает эмитента JWT. Значение должно соответствовать значению, настроенному в вашем API. Для JWT, выпущенных Auth0, iss содержит ваш домен Auth0 с префиксом https: // и суффиксом /: https: // YOUR_DOMAIN / . Если вы используете функцию пользовательских доменов, вместо этого значение будет иметь следующий формат: https: ///.
• Аудитория токенов: утверждение Audit идентифицирует получателей, для которых предназначен JWT. Для JWT, выпущенных Auth0, Audholds содержит уникальный идентификатор целевого API (поле «Идентификатор» в настройках вашего API). Если API не является целевой аудиторией JWT, он должен отклонить запрос.
Вот библиотека JWT для JAVA, где вы можете использовать метод проверки (токен) для проверки.
I don't know how often you need to poll, or what you mean with "expensive", but with the right options both netstat
and lsof
run a lot faster than in the default configuration.
Examples:
netstat -ltn
shows only listening tcp sockets, and omits the (slow) name resolution that is on by default.
lsof -b -n -i4tcp:80
omits all blocking operations, name resolution, and limits the selection to IPv4 tcp sockets on port 80.
Why don't you look at the source code of netstat and see how it get's the information? It's open source.
For Linux, have a look at the /proc/net
directory
(for example, cat /proc/net/tcp
lists your tcp connections). Not sure about Solaris.
Some more information here.
I guess netstat basically uses this exact same information so i don't know if you will be able to speed it up a whole lot. Be sure to try the netstat '-an' flags to NOT resolve ip-adresses to hostnames realtime (as this can take a lot of time due to dns queries).
Проще всего сделать
strace -f netstat -na
В Linux (я не знаю о Solaris). Это даст вам журнал всех выполненных системных вызовов. Это много результатов, некоторые из которых будут актуальными. Взгляните на файлы в файловой системе / proc, которую он открывает. Это должно привести вас к тому, как это делает netstat. Как ни странно, ltrace позволяет вам делать то же самое через библиотеку c. Бесполезно для вас в данном случае, но может быть полезно в других обстоятельствах.
Если это не ясно из этого, взгляните на источник.
On Solaris you can use pfiles(1)
to do this:
# ps -fp 308
UID PID PPID C STIME TTY TIME CMD
root 308 255 0 22:44:07 ? 0:00 /usr/lib/ssh/sshd
# pfiles 308 | egrep 'S_IFSOCK|sockname: '
6: S_IFSOCK mode:0666 dev:326,0 ino:3255 uid:0 gid:0 size:0
sockname: AF_INET 192.168.1.30 port: 22
For Linux, this is more complex (gruesome):
# pgrep sshd
3155
# ls -l /proc/3155/fd | fgrep socket
lrwx------ 1 root root 64 May 22 23:04 3 -> socket:[7529]
# fgrep 7529 /proc/3155/net/tcp
6: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 7529 1 f5baa8a0 300 0 0 2 -1
00000000:0016
is 0.0.0.0:22
. Here's the equivalent output from netstat -a
:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN