Задать вопрос
Контакты
Местоположение
Россия

Достижения

Все достижения (4)

Наибольший вклад в теги

Все теги (26)

Лучшие ответы пользователя

Все ответы (20)
  • Локальная разработка и Docker?

    @micronull
    Я использую для локальной разработки docker. Это значительно удобнее, чем держать полноценное окружение из зоопарка разных версий php и прочих штук.
    Если сайт старый, под какие-нибудь древние версии apache, php и mysql. Не проблема, - смотрю на hub, если нет, то собираю свой.
    При этом спокойно можно переключить на другой проект, более современный. Например с nginx, php7 и postgresql. Предварительно выключив предыдущий контейнер.

    Далее в перспективе можно спокойно кинуть контейнер на сервер и за пару минут развернуть сервис.

    В общем настоятельно рекомендую попробовать docker при локальной разработке.
    Ответ написан
    9 комментариев
  • Дизайн REST API: Как сейчас принято передавать авторизационный токен?

    @micronull
    Заголовок Authorisation является стандартом. В рамках него уже указывается схема аутентификации.

    Basic — наиболее простая схема, при которой username и password пользователя передаются в заголовке Authorization в незашифрованном виде (base64-encoded). Однако при использовании HTTPS (HTTP over SSL) протокола, является относительно безопасной.
    c27ac06373984352a1ebe2f6424cd9e9.png Пример HTTP аутентификации с использованием Basic схемы.

    Digest — challenge-response-схема, при которой сервер посылает уникальное значение nonce, а браузер передает MD5 хэш пароля пользователя, вычисленный с использованием указанного nonce. Более безопасная альтернативв Basic схемы при незащищенных соединениях, но подвержена man-in-the-middle attacks (с заменой схемы на basic). Кроме того, использование этой схемы не позволяет применить современные хэш-функции для хранения паролей пользователей на сервере.

    NTLM (известная как Windows authentication) — также основана на challenge-response подходе, при котором пароль не передается в чистом виде. Эта схема не является стандартом HTTP, но поддерживается большинством браузеров и веб-серверов. Преимущественно используется для аутентификации пользователей Windows Active Directory в веб-приложениях. Уязвима к pass-the-hash-атакам.

    Negotiate — еще одна схема из семейства Windows authentication, которая позволяет клиенту выбрать между NTLM и Kerberos аутентификацией. Kerberos — более безопасный протокол, основанный на принципе Single Sign-On. Однако он может функционировать, только если и клиент, и сервер находятся в зоне intranet и являются частью домена Windows.
    https://habrahabr.ru/company/dataart/blog/262817/

    Свой заголовок имеет смысл создавать, если ни один из способов не подходит.
    Но как правило Basic более чем достаточно. Мы у себя вместо логина передаем ключ авторизации и пустой пароль. Согласен что коряво.
    Ответ написан
    3 комментария
  • Почему в одном случае интерфейс реализуется, а во втором - нет?

    @micronull
    Go умеет самостоятельно разименовывать указатели при вызове метода.

    Т.е. так как у нас по факту переменная `second` является указателем на структуру `firstStruct`, то мы должны были бы предварительно разименовать, перед вызовом метода `init`:
    var second *firstStruct = &firstStruct{} 
    (*second).init()

    Но Go знает что это указатель и в синтаксисе можно производить вызов метода напрямую, а Go самостоятельно разименует указатель на структуру.
    second.init()

    У конструкции `&secondStruct{}` нет ошибки, так как сигнатура метода описывает работу с указателем на структуру:
    func (f *secondStruct) init() {...}
    Поэтому такая консрукция в данном случае не доступна: var f ifRealization = secondStruct{}
    Ответ написан
    1 комментарий
  • Go. Как у экземпляра структуры получить доступ к методам самой структуры, но не к методам интерфейса?

    @micronull
    У вас изначально не правильно сделано.
    newUser это конструктор и должен возвращать объект структуры User.

    И уже там где вам нужен именно `Jump` метод описывайте тип переменной которая является имплементацией интерфейса `Jumping`.

    Однако проверить что переменная является экземпляром нужной структуры так же можно.

    package main
    
    type Jumping interface {
    	Jump()
    }
    
    type User struct {
    	Name string
    	Surname string
    }
    
    func (user *User) Swim() { }
    
    func (user *User) Jump() { }
    
    func NewUser(name, surname string) *User {
    	return &User{ name, surname }
    }
    
    func main() {
    	u := NewUser("Ivan", "Ivanov")
    
    	FooBar(u)
    }
    
    func FooBar(j Jumping) {
    	j.Jump()
    
    	if u, ok := j.(*User); ok {
    		u.Swim()
    	}
    }
    Ответ написан
    5 комментариев
  • Как лучше реализовать возвращение нескольких ошибок?

    @micronull
    Недавно как раз записал видео на тему обработок ошибок. Включая про возврат нескольких типов.

    Если вкратце.
    До 1.20 можно использовать multierr от uber.
    После 1.20 рекомендую использовать `errors.Join`.
    Ответ написан
    Комментировать

Лучшие вопросы пользователя

Все вопросы (6)