‘r’ | Открывает файл только для чтения; помещает указатель в начало файла. |
‘r+’ | Открывает файл для чтения и записи; помещает указатель в начало файла. |
‘w’ | Открывает файл только для записи; помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует — пробует его создать. |
‘w+’ | Открывает файл для чтения и записи; помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует — пытается его создать. |
‘a’ | Открывает файл только для записи; помещает указатель в конец
файла. |
‘a+’ | Открывает файл для чтения и записи; помещает указатель в конец файла. Если файл не существует — пытается его создать. |
‘x’ | Создаёт и открывает только для записи; помещает указатель в
начало файла. Если файл уже существует, вызов fopen() закончится неудачей, вернёт FALSE и
выдаст ошибку уровня .
Если файл не существует, попытается его создать. Это эквивалентно
указанию флагов O_EXCL|O_CREAT для внутреннего
системного вызова open(2). |
‘x+’ | Создаёт и открывает для чтения и записи; иначе имеет то же поведение что и‘x’. |
‘c’ | Открывает файл только для записи. Если файл не существует, то он создается.
Если же файл существует, то он не обрезается (в отличии от |
‘c+’ | Открывает файл для чтения и записи; иначе имеет то же поведение, что и |
Cross-Origin Resource Sharing (CORS) — HTTP
Cross-Origin Resource Sharing (CORS) — механизм, использующий дополнительные HTTP-заголовки, чтобы дать возможность агенту пользователя получать разрешения на доступ к выбранным ресурсам с сервера на источнике (домене), отличном от того, что сайт использует в данный момент. Говорят, что агент пользователя делает запрос с другого источника (cross-origin HTTP request), если источник текущего документа отличается от запрашиваемого ресурса доменом, протоколом или портом.
Пример cross-origin запроса: HTML страница, обслуживаемая сервером с http://domain-a.com
, запрашивает <img> src
по адресу http://domain-b.com/image.jpg
. Сегодня многие страницы загружают ресурсы вроде CSS-стилей, изображений и скриптов с разных доменов, соответствующих разным сетям доставки контента (Content delivery networks, CDNs).
В целях безопасности браузеры ограничивают cross-origin запросы, инициируемые скриптами. Например, XMLHttpRequest
и Fetch API следуют политике одного источника (same-origin policy). Это значит, что web-приложения, использующие такие API, могут запрашивать HTTP-ресурсы только с того домена, с которого были загружены, пока не будут использованы CORS-заголовки.
Механизм CORS поддерживает кросс-доменные запросы и передачу данных между браузером и web-серверами по защищенному соединению. Современные браузеры используют CORS в API-контейнерах, таких как XMLHttpRequest
или Fetch, чтобы снизить риски, присущие запросам с других источников.
На самом деле, все.
Конкретнее, эта статья для web-администраторов, разработчиков серверной стороны и front-end разработчиков. Современные браузеры поддерживают клиентские компоненты cross-origin обмена, включая заголовки и соблюдение правил политики. Но этот новый стандарт означает, что сервера также должны поддерживать новые заголовки запросов и ответов. Другая статья для разработчиков серверной части, описывающая перспективы сross-origin обмена на стороне сервера (с примерами кода на PHP), к дополнительному прочтению.
Этот cтандарт сross-origin обмена используется для разрешения кросс-сайтовых HTTP запросов для:
Эта статья описывает общие понятия Cross-Origin Resource Sharing и включает обсуждение необходимых HTTP заголовков.
Стандарт Cross-Origin Resource Sharing работает с помощью добавления новых HTTP-заголовков, которые позволяют серверам описывать набор источников, которым разрешено читать информацию, запрашиваемую web-браузером.
GET
или для POST
запросов, использующих определнные MIME-типы), спецификация требует, чтобы браузеры «предпроверяли» запрос, запрашивая поддерживающие методы с сервера с помощью метода HTTP-запроса OPTIONS
и затем, поверх «подтверждения» с сервера, отсылали фактический запрос с фактическим методом HTTP-запроса. Сервера также могут оповещать клиентов должны ли «полномочия» (включая Cookies и HTTP Authentication данные) быть отправлены с запросом.Следующая секция описывает сценарии, а также предоставляет анализ использования HTTP-заголовков.
Здесь мы рассмотрим три сценария, которые иллюстрируют как Cross-Origin Resource Sharing работает. Каждый сценарий использует объект XMLHttpRequest
, который может быть использован для межсайтового взаимодействия, в любом, поддерживающем данный объект, браузере.
Фрагменты JavaScript кода, включенные в эти секции (а также фрагменты кода, отвечающие за корректную обработку межсерверных запросов, которые запускаются на сервере) могут быть испытаны «в действии» на http://arunranga.com/examples/access-control/, и будут работать в браузерах, которые поддерживают
.
Обсуждение Cross-Origin Resource Sharing с точки зрения сервера (включая фрагменты кода на PHP) может быть найдено в статье Server-Side Access Control (CORS).
Простые запросы
Некоторые запросы не заставляют срабатывать CORS preflight. Они называются “простыми запросами” в данной статье, хотя Fetch спецификация, определяющая CORS, не использует этот термин. Запрос, для которого не срабатывает CORS preflight— так называемый “простой запросы”—это запрос, удовлетворяющий следующим условиям:
- Допустимые методы для запроса:
- Кроме заголовков, которые автоматические проставляются user-agent’ом (например,
Connection
,User-Agent
, или любой другой заголовок с именем, определенным в спецификации метода Fetch в секции “Запрещенные имена заголовков (которые нельзя изменить программно)”), допустимыми заголовками, которые могут быть проставлены вручную, являются те заголовки, которые определены спецификацией метода Fetch как “CORS-безопасные заголовки запроса”, такие как: - Допустимыми значениями заголовка
Content-Type
являются:application/x-www-form-urlencoded
multipart/form-data
text/plain
- Не должны быть зарегистрированы обработчики событий на любой объект
XMLHttpRequestUpload
используемый в запросе; это достигается использованием свойстваXMLHttpRequest. upload
. - В запросе не должен использоваться объект типа
ReadableStream
.
Замечание: These are the same kinds of cross-site requests that web content can already issue, and no response data is released to the requester unless the server sends an appropriate header. Therefore, sites that prevent cross-site request forgery have nothing new to fear from HTTP access control.
Accept
, Accept-Language
, и Content-Language
. Если любой из этих заголовков имеет «нестандартное» значение, WebKit/Safari используют предварительный запрос. Значения, которые WebKit/Safari считают «нестандартными» для этих заголовков, перечислены только в следующих проблемах WebKit: Require preflight for non-standard CORS-safelisted request headers Accept, Accept-Language, and Content-Language, Allow commas in Accept, Accept-Language, and Content-Language request headers for simple CORS, и Switch to a blacklist model for restricted Accept headers in simple CORS requests. Во всех других браузерах подобных дополнительных ограничений нет, потому что они не являются частью спецификации.Например, представьте, что содержимое домена http://foo.example
хочет обратиться к содержимому http://bar.other
. На домене foo.example может использоваться следующий Javascript код:
var invocation = new XMLHttpRequest();
var url = 'http://bar.other/resources/public-data/';
function callOtherDomain() {
if(invocation) {
invocation.open('GET', url, true);
invocation.onreadystatechange = handler;
invocation.send();
}
}
Это приведет к простому обмену запросами между клиентом и сервером, используя CORS заголовки для обработки привилегий:
Посмотрим, что браузер отправит в таком случае на сервер, а также проверим ответ сервера:
GET /resources/public-data/ HTTP/1.1
Host: bar.other
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3. 1b3pre
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Referer: http://foo.example/examples/access-control/simpleXSInvocation.html
Origin: http://foo.example
HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 00:23:53 GMT
Server: Apache/2.0.61
Access-Control-Allow-Origin: *
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/xml
[XML Data]
Строчки 1 — 10 это заголовки отправленного запроса. Самим интересующим здесь для нас заголовком является Origin
, указанный на 10 строке. Данный заголовок указывает, что запрос пришел из содержимого домена http://foo.example
.
Строчки 13 — 22 показывают HTTP-ответ от сервера на домен http://bar.other
. В ответ сервер возвращает Access-Control-Allow-Origin
заголовок, указанный на 16 строке. Использование заголовков Origin
header и Access-Control-Allow-Origin
показывает протокол контроля доступа в простейшем виде. В этом случае, сервер отвечает с Access-Control-Allow-Origin: *
что означает, что к ресурсу может получить доступ с любого домена кросс-сайтовым способом. Если владелец ресурса http://bar.other
пожелал ограничить доступ к ресурсу для запросов только с http://foo.example
, они отправят обратно:
Access-Control-Allow-Origin: http://foo.example
Отметьте, никакой домен, кроме http://foo.example
(определен ORIGIN: заголовок в запросе, как в 10 строке выше), не может получить доступ к ресурсу кросс-сайтовым способом. Заголовок Access-Control-Allow-Origin
должен содержать значение, которое было отправлено в заголовке Origin
запроса.
Предварительные запросы
В отличии от “простых запросов” (обсуждено выше), «предварительные» запросы сначала отправляют HTTP-запрос методом OPTIONS
к ресурсу на другом домене, чтобы определить, является ли фактический запрос безопасным для отправки. Кросс-сайтовые запросы предварительно просматриваются таким образом, так как они могут быть причастны к пользовательским данным.
В частности, запрос предварительно просматривается, если выполняется любое из следующих условий:
- Если в запросе используется любой из следующих методов:
- Или если, кроме заголовков, автоматически устанавливаемых пользовательским агентом (например,
Connection
,User-Agent
, или любым другим заголовком с именем, определенным в спецификации Fetch как «имя запрещенного заголовка»), запрос включает любые заголовки, отличные от тех, которые спецификация Fetch определяет как «заголовок запроса CORS-безопасный заголовок запроса», а именно: - Или если заголовок
Content-Type
содержит значение, отличное от следующих:application/x-www-form-urlencoded
multipart/form-data
text/plain
- Или если один или больше слушателей событий зарегистрированы на объекте
XMLHttpRequestUpload
, который используется в запросе. - Или если объект
ReadableStream
используется в запросе.
Ниже приведен пример запроса, который будет предварительно просмотрен.
var invocation = new XMLHttpRequest();
var url = 'http://bar.other/resources/post-here/';
var body = '<?xml version="1.0"?><person><name>Arun</name></person>';
function callOtherDomain(){
if(invocation)
{
invocation.open('POST', url, true);
invocation.setRequestHeader('X-PINGOTHER', 'pingpong');
invocation.setRequestHeader('Content-Type', 'application/xml');
invocation.onreadystatechange = handler;
invocation.send(body);
}
}
......
В примере выше, 3 строка создает XML тело, чтобы отправить POST
запросом на строке 8. Также, на строке 9, «кастомизированный» (не стандартный) заголовок HTTP запроса установлен (X-PINGOTHER: pingpong
). Такие заголовки не являются частью протокола HTTP/1. 1, но, как правило, полезны для веб-приложений. Так как запрос использует Content-Type application/xml
, и так как установлен кастомизированный заголовок, этот запрос просматривается.
Замечнаие: как описано ниже, фактический POST
запрос не включает Access-Control-Request-*
заголовки; они нужны только для OPTIONS
запроса.
Давайте посмотрим на полный обмен между клиентом и сервером. Первый обмен — это предварительный запрос/ответ:
OPTIONS /resources/post-here/ HTTP/1.1 Host: bar.other User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Connection: keep-alive Origin: http://foo.example Access-Control-Request-Method: POST Access-Control-Request-Headers: X-PINGOTHER, Content-Type HTTP/1. 1 200 OK Date: Mon, 01 Dec 2008 01:15:39 GMT Server: Apache/2.0.61 (Unix) Access-Control-Allow-Origin: http://foo.example Access-Control-Allow-Methods: POST, GET, OPTIONS Access-Control-Allow-Headers: X-PINGOTHER, Content-Type Access-Control-Max-Age: 86400 Vary: Accept-Encoding, Origin Content-Encoding: gzip Content-Length: 0 Keep-Alive: timeout=2, max=100 Connection: Keep-Alive Content-Type: text/plain
Как только предварительный запрос завершен, отправляется настоящий запрос:
POST /resources/post-here/ HTTP/1.1 Host: bar.other User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Connection: keep-alive X-PINGOTHER: pingpong Content-Type: text/xml; charset=UTF-8 Referer: http://foo.example/examples/preflightInvocation.html Content-Length: 55 Origin: http://foo. example Pragma: no-cache Cache-Control: no-cache <?xml version="1.0"?><person><name>Arun</name></person> HTTP/1.1 200 OK Date: Mon, 01 Dec 2008 01:15:40 GMT Server: Apache/2.0.61 (Unix) Access-Control-Allow-Origin: http://foo.example Vary: Accept-Encoding, Origin Content-Encoding: gzip Content-Length: 235 Keep-Alive: timeout=2, max=99 Connection: Keep-Alive Content-Type: text/plain [Some GZIP'd payload]
Строки 1 — 12 выше представляют предварительный запрос с OPTIONS
методом. Браузер определяет, что ему нужно отправить это, основываясь на параметрах запроса, которые использовались во фрагменте кода JavaScript выше, чтобы сервер мог ответить, допустимо ли отправить запрос с фактическими параметрами запроса. OPTIONS — это метод HTTP/1.1, который используется для определения дополнительной информации от серверов, и является safe методом, что означает, что его нельзя использовать для изменения ресурса. Обратите внимание, что вместе с запросом OPTIONS отправляются два других заголовка запроса (строки 10 и 11 соответственно):
Access-Control-Request-Method: POST Access-Control-Request-Headers: X-PINGOTHER, Content-Type
Заголовок Access-Control-Request-Method
уведомляет сервер как часть предварительного запроса о том, что при отправке фактического запроса он будет отправлен методом запроса POST
. Заголовок Access-Control-Request-Headers
уведомляет сервер о том, что при отправке фактического запроса он будет отправлен с пользовательскими заголовками X-PINGOTHER
и Content-Type. Теперь у сервера есть возможность определить, хочет ли он принять запрос в этих обстоятельствах.
Строки 14 — 26 выше — это ответ, который сервер отправляет обратно, указывая, что метод запроса (POST
) и заголовки запроса (X-PINGOTHER
) являются приемлемыми. В частности, давайте посмотрим на строки 17-20:
Access-Control-Allow-Origin: http://foo.example Access-Control-Allow-Methods: POST, GET, OPTIONS Access-Control-Allow-Headers: X-PINGOTHER, Content-Type Access-Control-Max-Age: 86400
Сервер отвечает с Access-Control-Allow-Methods
и сообщает, что POST
, GET
, и OPTIONS
являются жизнеспособными методами для запроса соответствующего ресурса. Обратите внимание, что этот заголовок похож на заголовок ответа Allow
, но используется строго в контексте контроля доступа.
Сервер также отправляет Access-Control-Allow-Headers
со значением «X-PINGOTHER, Content-Type
«, подтверждая, что это разрешенные заголовки, которые будут использоваться с фактическим запросом. Как и Access-Control-Allow-Methods
, Access-Control-Allow-Headers
представляет собой список допустимых заголовков через запятую.
Наконец, Access-Control-Max-Age
дает значение в секундах, в течение которого можно кэшировать ответ на предварительный запрос без отправки другого предварительного запроса. В этом случае, 86400 секунды — это 24 часа. Обратите внимание, что каждый браузер имеет максимальное внутреннее значение, которое имеет приоритет, когда Access-Control-Max-Age
больше.
Предварительные запросы и переадресации
Большинство браузеров в настоящее время не поддерживают следующие переадресации для предварительных запросов. Если переадресация происходит для предварительного запроса, большинство современных браузеров сообщат об ошибке, такой как следующее.
Запрос был перенаправлен на ‘https://example.com/foo’, который запрещен для запросов из разных источников, требующих предварительной проверки
Запрос требует предварительной проверки, которая запрещена для перенаправления между источниками
Протокол CORS изначально требовал такого поведения, но впоследствии был изменен, чтобы больше не требовать его. Однако большинство браузеров еще не реализовали это изменение и все еще демонстрируют поведение, которое требовалось изначально.
Поэтому, пока браузеры не догонят спецификацию, вы можете обойти это ограничение, выполнив одно или оба из следующих действий:
- изменить поведение на стороне сервера, чтобы избежать предварительной проверки и/или избежать переадресации — если у вас есть контроль над сервером, к которому делается запрос
- изменить запрос так, чтобы это был простой запрос, который не вызывает предварительную проверку
Но если невозможно внести эти изменения, то возможен другой способ:
- Сделайте простой запрос для определения (используя Response. url для Fetch API, или XHR.responseURL, чтобы определить, на каком URL завершится настоящий предварительный запрос).
- Сделайте другой запрос (“настоящий” запрос), используя URL адрес, полученный вами из Response.url или XMLHttpRequest.responseURL на первом этапе.
Однако, если запрос инициирует предварительную проверку из-за наличия в запросе заголовка `Authorization`, вы не сможете обойти ограничение, используя описанные выше шаги. И вы вообще не сможете обойти это, если у вас нет контроля над сервером, на который делается запрос.
Запросы с учетными данными
Наиболее интересная возможность, предоставляемая как XMLHttpRequest
, так и Fetch и CORS — это возможность делать «проверенные» запросы, которые осведомленны о файлах HTTP cookie и информации HTTP аутентификаци. По умолчанию, в кросс-сайтовых XMLHttpRequest
или Fetch вызовах, браузеры не отправляют учетные данные. Конкретный флаг должен быть установлен для объекта XMLHttpRequest
или конструктора Request
при его вызове.
В этом примере контент, изначально загруженный из http://foo.example,
выполняет простой GET запрос к ресурсу http://bar.other,
который устанавливает файлы сookie. Содержимое на foo.example может содержать такой JavaScript:
var invocation = new XMLHttpRequest();
var url = 'http://bar.other/resources/credentialed-content/';
function callOtherDomain(){
if(invocation) {
invocation.open('GET', url, true);
invocation.withCredentials = true;
invocation.onreadystatechange = handler;
invocation.send();
}
}
В строке 7 показан флаг XMLHttpRequest
, который должен быть установлен для выполнения вызова с помощью файлов cookie, а именно логическое значение withCredentials
. По умолчанию вызов выполняется без файлов cookie. Поскольку это простой запрос GET,
он не является предварительным, но браузер отклоняет любой ответ, который не имеет заголовка Access-Control-Allow-Credentials
: true
, и не создает ответ, доступный для вызова веб-контента.
Вот пример обмена между клентом и сервером:
GET /resources/access-control-with-credentials/ HTTP/1.1 Host: bar.other User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Connection: keep-alive Referer: http://foo.example/examples/credential.html Origin: http://foo.example Cookie: pageAccess=2 HTTP/1.1 200 OK Date: Mon, 01 Dec 2008 01:34:52 GMT Server: Apache/2.0.61 (Unix) PHP/4.4.7 mod_ssl/2.0.61 OpenSSL/0.9.7e mod_fastcgi/2.4.2 DAV/2 SVN/1.4.2 X-Powered-By: PHP/5.2.6 Access-Control-Allow-Origin: http://foo.example Access-Control-Allow-Credentials: true Cache-Control: no-cache Pragma: no-cache Set-Cookie: pageAccess=3; expires=Wed, 31-Dec-2008 01:34:53 GMT Vary: Accept-Encoding, Origin Content-Encoding: gzip Content-Length: 106 Keep-Alive: timeout=2, max=100 Connection: Keep-Alive Content-Type: text/plain [text/plain payload]
Также в строке 11 содержится Cookie, предназначенный для контента ресурса http://bar. other
. В случае если http://bar.other
не ответит полем Access-Control-Allow-Credentials
: true
(строка 19), то ответ от сервера будет проигнорирован и не станет доступным для веб-контента.
Запросы с учетными данными и wildcards
В процессе ответа на запрос с учетными данными сервер обязан указать точный источник в поле заголовка Access-Control-Allow-Origin
вместо спецсимвола «*
«.
Из-за того что заголовки запроса в примере выше включают заголовок Cookie
, запрос провалился бы, если бы значение заголовка Control-Allow-Origin
было «*». Но он не провалился: потому что значение заголовка Access-Control-Allow-Origin
— «http://foo.example
» (действительный источник), а не спецсимвол «*
«, контент, удостоверяющий полномочия, возвращается в вызывающий веб-контент.
Отметьте, что заголовок ответа Set-Cookie
в примере выше также устанавливает дополнительные куки. В случае неудачи, возникает исключение, в зависимости от используемого API.
Эта секция содержит список заголовков HTTP ответов, которые сервер шлет в ответ на запрос доступа, как описано в спецификации совместного использования ресурсов между разными источниками. В предыдущей секции это описано в действии.
Access-Control-Allow-Origin
Возвращаемый ресурс может иметь один заголовок Access-Control-Allow-Origin
, синтаксис которого:
Access-Control-Allow-Origin: <origin> | *
Access-Control-Allow-Origin
определяет либо один источник, что указывает браузеру разрешить этому источнику доступ к ресурсу; либо — для запросов без учетных данных — значение «*
«, которое говорит браузеру разрешить запросы из любых источников.
Например, чтобы разрешить http://mozilla.org доступ к ресурсу, можно указать:
Access-Control-Allow-Origin: http://mozilla.org
Если сервер возвращает название хоста, вместо «*», также может быть указан заголовок Vary со значением Origin, чтобы показать клиентам, что ответы с сервера будут отличаться в зависимости от значения заголовка запроса Origin.
The Access-Control-Expose-Headers
header lets a server whitelist headers that browsers are allowed to access. For example:
Access-Control-Expose-Headers: X-My-Custom-Header, X-Another-Custom-Header
This allows the X-My-Custom-Header
and X-Another-Custom-Header
headers to be exposed to the browser.
Access-Control-Max-Age
The Access-Control-Max-Age
header indicates how long the results of a preflight request can be cached. For an example of a preflight request, see the above examples.
Access-Control-Max-Age: <delta-seconds>
The delta-seconds
parameter indicates the number of seconds the results can be cached.
Access-Control-Allow-Credentials
The Access-Control-Allow-Credentials
header Indicates whether or not the response to the request can be exposed when the credentials
flag is true. When used as part of a response to a preflight request, this indicates whether or not the actual request can be made using credentials. Note that simple GET
requests are not preflighted, and so if a request is made for a resource with credentials, if this header is not returned with the resource, the response is ignored by the browser and not returned to web content.
Access-Control-Allow-Credentials: true
Credentialed requests are discussed above.
Access-Control-Allow-Methods
The Access-Control-Allow-Methods
header specifies the method or methods allowed when accessing the resource. This is used in response to a preflight request. The conditions under which a request is preflighted are discussed above.
Access-Control-Allow-Methods: <method>[, <method>]*
An example of a preflight request is given above, including an example which sends this header to the browser.
This section lists headers that clients may use when issuing HTTP requests in order to make use of the cross-origin sharing feature. Note that these headers are set for you when making invocations to servers. Developers using cross-site XMLHttpRequest
capability do not have to set any cross-origin sharing request headers programmatically.
Origin
The Origin
header indicates the origin of the cross-site access request or preflight request.
Origin: <origin>
The origin is a URI indicating the server from which the request initiated. It does not include any path information, but only the server name.
Note: The origin
can be the empty string; this is useful, for example, if the source is a data
URL.
Note that in any access control request, the Origin
header is always sent.
Access-Control-Request-Method
The Access-Control-Request-Method
is used when issuing a preflight request to let the server know what HTTP method will be used when the actual request is made.
Access-Control-Request-Method: <method>
Examples of this usage can be found above.
The Access-Control-Request-Headers
header is used when issuing a preflight request to let the server know what HTTP headers will be used when the actual request is made.
Access-Control-Request-Headers: <field-name>[, <field-name>]*
Examples of this usage can be found above.
BCD tables only load in the browser
Compatibility notes
- Internet Explorer 8 and 9 expose CORS via the
XDomainRequest
object, but have a full implementation in IE 10. - While Firefox 3.5 introduced support for cross-site XMLHttpRequests and Web Fonts, certain requests were limited until later versions. Specifically, Firefox 7 introduced the ability for cross-site HTTP requests for WebGL Textures, and Firefox 9 added support for Images drawn on a canvas using
drawImage
.
10 способов как повысить безопасность сайта на Joomla — студия Палыча
Давно хотел написать статью, посвященную безопасности сайтов на Joomla. В последнее время участились взломы сайтов на Joomla, и не только на ней. Взлому подвергаются любые CMS (например: Обнаружена опасная уязвимость в кеширующих плагинах для WordPress). Методы заражения всегда однотипные: это заражения сайтов вирусами-троянцами, установка бекдоров (backdoor). С этим бороться можно, и довольно просто. Есть ряд решений по безопасности для сайтов на Joomla. Итак, обсудим.
Безопасность сайта на Joomla стоит разделить на части:
- Настройка .htaccess.
- Настройка веб-сервера Apache.
- Права файловой системы.
- Обновление CMS Joomla.
- Удаление неиспользуемых расширений Joomla.
- Обновление расширений Joomla.
- Не используйте варезные расширения.
- Установка расширений безопасности.
- Сложные пароли к учетной записи администраторов.
- Создание страницы 404.
Безопасная настройка сервера/хостинга
Это самая важная часть, Многие сайтостроители не задаются вопросом безопасности самого хостинга, где размещаются сайты. А это распространенное заблуждение. Это надо делать в первую очередь. Все хостинги предоставляют услугу, как есть. Только на некоторых площадках уже сделана тонкая настройка хостинга/сервера.
Используйте .htaccess
Блокировать типичные попытки эксплоита можно с помощью файла .htaccess, который должен находится в корне сайта. По умолчанию эта функция не включена на всех серверах. Используя файл .htaccess, вы сможете защитить с его помощью важные директории, например, такие, как administrator, можно блокировать доступ на сайт с определенных IP-адресов. И еще много чего можно сделать, об этом напишем чуть ниже.
Сам дистрибутив Joomla уже идет в комплекте с настроенным файлом . index2.php»>
order deny,allow
allow from all
</Filesmatch>
## Конец — Запрет на выполнение php-скриптов в корне сайта
Запрет доступа к xml-файлам расширений
## Код запрета доступа к xml-файлам расширений (раскомментируйте для активации)
<Files ~ "\.xml$">
Order allow,deny
Deny from all
Satisfy all
</Files>
## Конец кода запрета доступа к xml-файлам
Блокирование прямого доступа к ядру
Данное решение закроет доступ к бекдорам, тем самым увеличивая безопасность сайта на Joomla. По личному опыту, часто сайт заражается бекдором под названием FileMan. При удаленном вызове вы получаете полный доступ к файловой системе, вы можете изменять любые файлы, при этом оставляя дату последнего изменения, а не текущих. Нашли такие бекдоры в папке modules. Примеры:
- /modules/mod_system/mod_system.php
- /modules/mod_systems/mod_system. php
- /modules/mod_article/mod_system.php
- /modules/mod_articles/mod_system.php
- /modules/mod_articless/mod_system.php
Создать новый файл .htaccess. Добавить инструкцию, которая указана нижне. Она запрещает выполнение скриптов. Добавить его во все папки корня сайта.
## Блокирование прямого доступа к ядру
<Files ~ ".(php)$">
Deny from all
</Files>
Настройка Apache
Теперь перейдем к настройке безопасности веб-сервера Apache, он обрабатывает PHP-код и возвращает браузеру HTML-код. Его тоже надо настроить. Тут может возникнуть ряд трудностей, так как не на всех серверах есть доступ к файлу php.ini (в нем хранится конфигурация Apache). Можно попробовать сконфигурировать через .htaccess.
Повышаем безопасность сайта
Для более тонкой настройки безопасности сайта и защиты от фишинга, вставляем следующий код в . htaccess или в конфигурацию Apache:
<IfModule mod_headers.c>
#Запрещаем встраивать сайт во iframe
Header always append X-Frame-Options SAMEORIGIN
#Защищаем сайт от межсайтового скриптинга
Header set X-XSS-Protection "1; mode=block"
#Заголовок предотвращает атаки на основе mime
Header set X-Content-Type-Options nosniff
#Браузер отправляет полный URL на тот же сайт, и неполный (только название) на все остальные
Header set Referrer-Policy origin-when-cross-origin
</IfModule>
Установите модуль mod_security
ModSecurity — модуль Apache, добавляющий возможности обнаружения и предотвращения вторжения на Web-сервер.
К сожалению вы сами не сможете этого сделать, советуем обратиться к администрации хостинга или к администратору выделенного/виртуального сервера. Они должны установить и сконфигурировать этот модуль.
Используйте PHP версии 5.0 и выше.
Версия 4.0 уже считается устаревшей, и некоторые функции считаются небезопасными.
Не стоит бояться включить, например, версию 5.3 для Joomla ветки 1.5. CMS будет превосходно работать.
Используйте локальный php.ini
Некоторые хостинги позволяют использовать собственный файл конфигурации Apache, который находится в корне сайта. Если такая возможность есть, не упустите ее.
Настройка php.ini
Настройка простая. Вот рекомендуемые настройки безопасности Apache. Все описывать детально не буду, более подробную документацию сможете найти на сайте docs.joomla.org.
disable_functions = show_source, system, shell_exec, passthru, exec, phpinfo, popen, proc_open
open_basedir = /home/users/you/public_html:/tmp
magic_quotes_gpc = 0
safe_mode = 0
register_globals = 0
allow_url_fopen = 0
allow_url_include = 0
mail. add_x_header = 0
error_reporting = E_ERROR
Если нет возможности настроить php.ini, то можно попробовать прописать в .htaccess.
php_flag register_globals Off
php_flag file_uploads On
php_flag allow_url_fopen Off
php_flag magic_quotes_gpc On
php_flag magic_quotes_runtime Off
php_flag mail.add_x_header Off
php_flag error_reporting E_ERROR
Директива mail.add_x_header в каждом отправляемом письме добавляет заголовок X-PHP-Originating-Script, который содержит UID и имя скрипта отправляющего письмо. Это позволяет злоумышленнику узнать от какого пользователя работает PHP. Лучше отключим.
Директива error_reporting сообщает PHP, что в логи писать информацию только об ошибках. В некоторых CMS и расширениях для них имеют кучу notice и warning, что может привести к росту файлов логов и место на винчестере просто закончится. Это закончится тем, что сайт будет не доступен.
Права в файловой системе
Если дистрибутив Joomla установлен на веб-сервере Apache с mod_php, то все виртуальные хосты на этом сервере работают в том же контексте, что и Joomla. Если файлы принадлежат другим пользователем, например «nobody» или «wwwrun», самым безопасным решением будет сменить владельца, используя FTP-клиенты (FilleZill, Total Commander и etc) и установить правильные права доступа. Они такие:
- Корневая директория 750 (например public_html)
- Файлы 644
- Директории 755 (711 если вы параноик, но не для директорий, которые должны быть перечислены, например images)
Обновление CMS Joomla
Очень важный шаг. Обновить систему надо, так как разработчики периодически закрывают дырки в ядре. Например, последний билд для 1.5 является 1.5.26. Скачать релизы обновлений можно на сайте joomla.org. Там же найдете пакеты обновления и для более новых версий.
Перед обновлением обязательно создайте резервную копию всего сайта, используя инструменты, которые предоставляет хостинг или воспользуйтесь компонентом Akeeba Backup.
Удаление неиспользуемых расширений Joomla
Многие сайтостроители ставят подряд все расширения, которые находят. По большей части все они бесполезны и имеют кучу дыр, через которые злоумышленник может получить полный доступ к сайту или заразить сайт на Joomla вирусом. Так что надо определиться, нужен ли вам виджет часов на сайте? Лучше удалить неиспользуемые расширения и оставить только действительно полезные.
Обновление расширений Joomla
Обязательно следить за релизами, особенно актуально для Joomla 3. В версии 1.6 и выше уже создана система репозиториев, которые позволят автоматически обновлять расширения. Одно из часто взламываемых расширений — это устаревший визуальный редактор. Есть более современный, удобный и бесплатный редактор JCE для всех версий Joomla.
Не используйте варезные расширения
Часто заражения сайта на Joomla происходит через расширения, скачанные с варезных сайтов. В 100% случаев вы уже там найдете вирус. Так что ищите бесплатные аналоги у авторов, либо покупайте. Расширения не всегда дорого стоят. 10-15$ вас не разорят, зато это сделает ваш сайт более безопасным, заодно получите самую последнюю версию.
Установка расширений безопасности
Есть ряд полезных расширений для Joomla, который значительно повысит безопасность вашего сайта. Приведу их список.
- Admin Tools — шикарный инструмент реальной безопасности. При этом я рекомендую купить профессиональную версию (она стоит всего 20 Евро), зато вы получите почти максимальную безопасность. Сравнение версий
- jHackGuard — интересный плагин от SiteGround, позволяющий существенно повысить безопасность сайта. HackGuard обеспечивает защиту от таких видов взлома, как: SQL-инъекции, удаленные включения URL/файлов, удаленное выполнение кода, а также защиту от XSS-атак.
- AI-Bolit — Скрипт (не расширение) для поиска вирусов и вредоносных скриптов на сайте. Инструкция по его использованию — в коробке.
- Shell and Backdoor Script Finder — вирусный сканер сайта, у него более продвинутые базы, чем у AI-Bolit.
Сложные пароли к учетной записи администраторов
У меня есть увереность, что большинство сайтов на Joomla можно взломать с помощью пары логина admin и паролья 1234. Это недопустимая халатность. Такой пароль с логином подбирается в считанные секунды. Если вы испытываете трудности с генерацией сложных паролей, то воспользуйтесь сервисом pasw.ru. Для хранения используете сервисы, например как Roboform (при регистрации 6 месяцев бесплатно).
Создание страницы «404»
Ну, об этом я писал уже дважды: Посадочная 404 страница и Как создать 404 страницу в Joomla 1.5.xx. Вы же не хотите увидеть вот такую скучную страницу:
Вот, в принципе и все. Этих нескольких простых действий достаточно, чтобы ваш сайт жил и процветал. Безопасность сайта превыше всего.
Cisco ASA 5505 межсетевой экран
Cisco ASA 5505 – современное многофункциональное устройство для защиты локальных сетей от внешних атак и вторжений. Основная функция межсетевого экрана Cisco (firewall) — защита сети от вторжений, вирусов, спама, шпионских программ, контентная фильтрация трафика пользователей. Построенные на базе аппаратной платформы сетевые экраны Cisco ASA обеспечивают высокую надежность, производительность в задаче обеспечения безопасности ЛВС от внешних атак. Любой компании, имеющей соединение внутренней корпоративной сети с публичной сетью Интернет требуется твердая уверенность в безопасности. Межсетевые экраны Cisco ASA 5500 обеспечивают высокую степень безопасности с достаточным уровнем гибкости, чтобы удовлетворять потребности растущей и изменяющейся компании.
Особенности выделяющие Cisco ASA 5505
Выделяясь среди конкурентов отличным соотношением цена-качество Cisco ASA 5505 имеет ряд технологических преимуществ для бизнеса. Многофункциональные устройства защиты Cisco ASA 5500 Series являются вашей первой и лучшей линией обороны. Обеспечение безопасности и надежности корпоративной сети означает, что сотрудники компании всегда смогут рассчитывать на ее наличие.
ОСОБЕННОСТИ |
ОПИСАНИЕ |
Гибкость настройки политик безопасности |
Настраивайте безопасность в соответствии со своими специфическими потребностями в доступе и бизнес-политиками в удобном WEB интерфейсе |
Mасштабируемость технологии |
Когда предприятие развивается и требует изменений, можно легко добавлять возможности и производить модернизацию, используя наокпленные данные по защите устройств и технолгии настройки |
Расширенная безопасность |
Используйте новые преимущества новейших методик обеспечения безопасности содержимого, шифрования, аутентификации, авторизации и предотвращения вторжений, удаленного VPN доступа |
Простота настройки |
Используйте единое устройство, которое легко устанавливать, администрировать и контролировать |
Расширенные сетевые возможности |
Настраивайте виртуальные частные сети (VPN), предоставляющие мобильным и удаленным сотрудникам доступ к ресурсам компании, либо создавайте сети VPN между партнерами, другими офисами и сотрудниками, основываясь на ролях |
Функциональные возможности ASA 5505:
- поддержка двух сетей VPN для связи между офисами и партнерами, с расширением до 25 (ASA 5505) или 750 (ASA 5520) сотрудников;
- поддержка от 5 (ASA 5505) до 250 (ASA 5550) пользователей локальной сети из любой точки;
- множество вариантов высокоскоростных сетевых соединений, в зависимости от ваших потребностей в производительности;
- заранее настроенные пакеты для упрощения заказа и настройки.
Модификации межсетевого экрана Cisco ASA 5505
НАЗВАНИЕ |
ОПИСАНИЕ |
ASA5505-K8 |
Стандартная комплектация. Cisco ASA 5505 в этой конфигурации обеспечивает обработку до 10000 одновременных сессий пользователей, позволяет создать до 10 IPSec VPN туннелей, обеспечивает защиту для 10-и пользователей, имеет возможность создания до 3-х VLAN, путем назначения нужных портов внутреннего коммутатора в нужную группу VLAN интерфейса. Не поддерживает создание 802.1Q транк порта, поддерживает механизмы шифрования AES |
ASA5505-50-BUN-K8 |
Конфигурация брандмауэра с расширенным количеством пользователей. В этой конфигурации межсетевой экран имеет все функции стандартной версии, но обеспечивает подключения для 50-и пользователей |
ASA5505-SEC-BUN -K8 |
Конфигурация Security Plus c поддержкой 50-и пользователей,25 IPSec VPN подключений, до 20 VLAN 802. 1Q TRUNK на портах коммутатора, включающая функцию DMZ |
ASA5505-UL-BUN-K8 |
Максимальная конфигурация в этой конфигурации устройство не имеет ограничений на количеству пользователей, имеет Security Plus лицензию со всеми функциями платформы. |
ASA5505-50-AIP5-K8 |
Конфигурация на 50 пользователей, со встроенным модулем AIP-SSC-5, который обеспечивает аппаратное ускорение межсетевого экрана и выполнение функции IPS — защиту сети от шпионских программ, вирусов. Имеет все функции Security Plus |
ASA5505-SSL10-K8 |
Версия, с возможностью использования SSL для организации удаленных защищенных подключений пользователей. Основной плюс использования SSL для создания удаленных VPN подключений – поддержка протокола SSL практически всеми устройствами, отсутствие необходимости в установке отдельного клиента для IPSec. |
Cisco ASA 5505. Опции и пакеты расширения
ASA5505-SEC-PL — Security Plus лицензия, снимающая ограничение и позволяющая использовать порты встроенного коммутатора в режиме до 20 VLAN 802.1Q TRUNK, до 25-и IPSec VPN подключений, включая функцию DMZ для стандартных версий межсетевого экрана Cisco.
ASA5505-RACK-MNT — набор для монтажа межсетевого экрана ASA 5505 в стандартную телекоммуникационную стойку 19”. Комплект позволяет установить до 2-х устройств Cisco ASA 5505. Включает в себя полку размером 2U со всеми необходимыми кронштейнами и крепежом.
ASA5505-SW-10-50 — лицензия расширения количества защищаемых экраном ASA 5505 пользователей с 10 до 50 ASA5505-SW-10-UL –лицензия снятия всех ограничений количества защищаемых сетевым экраном ASA 5505. Применяется для стандартной версии межсетевого экрана Cisco.
ASA5505-SW-50-UL — лицензия снятия всех ограничений количества защищаемых экраном ASA 5505. Применяется при модернизации любой 50-и пользовательской версии ASA5505-SSL10-K8 – лицензия включения поддержки SSL VPN на 10 пользователей ASA5505-SSL25-K8 – лицензия включения поддержки SSL VPN на 25 пользователей.
*Суммарная производительность передачи данных. Поскольку передача данных происходит всегда в двух направлениях (исходящий и входящий трафик) то эта производительность делится пропорционально входящему и исходящему трафикам
Директивы .htaccess — Викиучебник
Перенаправление (редирект)[править]
На другой адрес[править]
Redirect /index.php http://example.com/index.php
При запросе определённых страниц[править]
Redirect /data http://www.example.com/data Redirect /forum http://forum.example.com
По маске имени файла[править]
Следующие строки определяют, что все запросы, кроме запросов к файлам с расширениями .gif и .jpg, будут перенаправлены на файл index.php:
RewriteEngine On RewriteRule !. www.mydomain.com$ [NC] RewriteRule (.*) http://mydomain.com/$1 [R=301]
Работает только при наличии mod_rewrite.
Индексные страницы[править]
Переопределение индексного файла[править]
DirectoryIndex index.html index.php index.shtml
Запрет на отображение содержимого каталога при отсутствии индексного файла[править]
Типы файлов[править]
Изменение обработчика по типу файла[править]
Пример переопределения HTML-файлов для обработки их с помощью PHP:
RemoveHandler .html .htm AddType application/x-httpd-php .php .htm .html .phtml
Обработка ошибок[править]
ErrorDocument 401 /401.html ErrorDocument 403 /403.html ErrorDocument 404 /404.html ErrorDocument 500 /500.html
При этом размер конечного файла должен быть больше 515 байт, иначе некоторые браузеры могут подменить страницу своей стандартной.
Кодировка[править]
Отдаваемых файлов[править]
AddDefaultCharset windows-1251
Загружаемых файлов[править]
CharsetSourceEnc windows-1251
Отдаваемых файлов конкретного типа[править]
AddCharset windows-1251 . js
Вместо .js можно указать несколько типов файлов, разделяя их пробелами.
Управление доступом[править]
Запрет доступа к файлам[править]
Запрет доступа ко всем файлам и каталогам в текущем каталоге:
Запрет доступа к определённому файлу:
<Files config.php> Deny from all </Files>
Запрет доступа к файлам по маске:
<Files *.inc> Deny from all </Files>
Спецсимволы для определения маски:
- ? — любой одиночный символ
- * — любая последовательность символов, исключая символ / (слэш)
Запрет доступа к файлам по регулярному выражению:
<Files ~ "\.(inc|conf|cfg)$"> Deny from all </Files>
Определение доступа по IP[править]
Order deny,allow Deny from all Allow from 192.168.11.1
Строка order deny, allow определяет, в каком порядке следует выполнять директивы. Сначала выполняется директива запрета доступа, а затем разрешается доступ только для IP-адреса 192.168.11.1.
Order Allow,Deny Allow from all Deny from 192.140.170.219 Deny from 10.10.220.201
В этом примере наоборот запрещается доступ с определённых IP-адресов.
Закрытие каталогов паролем[править]
AuthName "Auth message" AuthType Basic require <valid-user | user <username1> [username2] ... [usernameN]> AuthUserFile "/full/path/to/.htpasswd"
Пароли хранятся в файле .htpasswd.
Доступ к файлам Nextcloud с помощью WebDAV — Документация Nextcloud latest User Manual latest
Nextcloud полностью поддерживает протокол WebDAV, и вы можете подключаться и синхронизироваться с файлами Nextcloud через WebDAV. В этой главе вы узнаете, как подключить Linux, macOS, Windows и мобильные устройства к вашему серверу Nextcloud через WebDAV. Прежде чем приступить к настройке WebDAV, давайте кратко рассмотрим рекомендуемый способ подключения клиентских устройств к вашим серверам Nextcloud.
Примечание
В следующих примерах вы должны заменить example.com/nextcloud URL-адресом вашего сервера Nextcloud (пропустите часть каталога, если установка находится в корне вашего домена), а “USERNAME” — именем подключающегося пользователя.
See the WebDAV URL (bottom left in settings) on your Nextcloud.
Примечание
In the following examples, you must use an app-password for login, which you can generate in your security settings.
Nextcloud Desktop и мобильные клиенты
Рекомендуемый способ синхронизации настольного ПК с сервером Nextcloud заключается в использовании клиентов синхронизации Nextcloud/ownCloud. Вы можете настроить клиент для сохранения файлов в любом локальном каталоге и выбрать, какие каталоги на сервере Nextcloud синхронизировать. Клиент отображает текущее состояние соединения и регистрирует все действия, поэтому вы всегда знаете, какие удаленные файлы были загружены на ваш компьютер, и вы можете проверить, правильно ли синхронизированы файлы, созданные и обновленные на вашем локальном ПК, с сервером.
Рекомендуемый способ синхронизации сервера Nextcloud с устройствами Android и Apple iOS — использование мобильных приложений.
Чтобы подключить мобильное приложение к серверу Nextcloud, используйте только базовый URL и папку:
В дополнение к мобильным приложениям, предоставляемым Nextcloud или ownCloud, вы можете использовать другие приложения для подключения к Nextcloud со своего мобильного устройства с помощью WebDAV. WebDAV Navigator — хорошее (проприетарное) приложение для устройств Android и iPhone. URL для использования на них:
example.com/nextcloud/remote.php/dav/files/USERNAME/
Конфигурация WebDAV
При желании вы также можете подключить свой настольный ПК к серверу Nextcloud, используя протокол WebDAV, а не специальное клиентское приложение. Web Distributed Authoring and Versioning (WebDAV) — это расширение протокола передачи гипертекста (HTTP), которое позволяет легко создавать, читать и редактировать файлы на веб-серверах. С помощью WebDAV вы можете получать доступ к общим ресурсам Nextcloud в Linux, macOS и Windows так же, как и к любому удаленному сетевому ресурсу, и сохранять синхронизацию.
Доступ к файлам с помощью Linux
Вы можете получить доступ к файлам в операционных системах Linux, используя следующие методы.
Файловый менеджер Наутилус
When you configure your Nextcloud account in the GNOME Control Center, your files will automatically be mounted by Nautilus as a WebDAV share, unless you deselect file access.
Вы также можете смонтировать файлы Nextcloud вручную. Используйте протокол davs://
для подключения файлового менеджера Nautilus к вашей папке Nextcloud:
davs://example.com/nextcloud/remote.php/dav/files/USERNAME/
Примечание
If your server connection is not HTTPS-secured, use dav://
instead
of davs://
:
Примечание
Тот же метод работает для других файловых менеджеров, которые используют GVfs, таких как Caja MATE и Nepomuk Cinnamon.
Доступ к файлам с помощью KDE и файлового менеджера Dolphin
Чтобы получить доступ к файлам Nextcloud с помощью файлового менеджера Dolphin в KDE, используйте протокол webdav://
:
webdav://example. com/nextcloud/remote.php/dav/files/USERNAME/
Вы можете создать постоянную ссылку на свой сервер Nextcloud:
- Откройте Dolphin и нажмите “Сеть” в левом столбце “Места”.
- Нажмите на иконку с надписью Добавить сетевую папку. Результирующий диалог должен появиться с уже выбранным WebDAV.
- Если WebDAV не выбран, выберите его.
- Нажмите кнопку Далее.
- Введите следующие настройки:
- Имя: имя, которое вы хотите видеть в закладке Размещение, например Nextcloud.
- Пользователь: имя пользователя Nextcloud, которое вы использовали для входа, например, admin.
- Сервер: доменное имя Nextcloud, например example.com (без http:// до каталогов).
- Папка — введите путь
nextcloud/remote.php/dav/files/USERNAME/
.
- (Необязательно) Установите флажок «Создать значок», чтобы закладка отображалась в столбце Метки.
- (Необязательно) Укажите любые специальные настройки или сертификат SSL в поле «Порт и шифрование».
Монтирования WebDAV в командной строке Linux
Вы можете выполнить монтирование WebDAV из командной строки Linux. Это полезно, если вы предпочитаете получать доступ к Nextcloud так же, как и к любому другому удаленному подключенному ресурсу. В следующем примере показано, как создать персональное монтирование и автоматически монтировать его при каждом входе в систему на компьютере Linux.
Установите драйвер
davfs2
для файловой системы WebDAV, который позволяет вам монтировать общие ресурсы WebDAV, как и любую другую удаленную файловую систему. Используйте эту команду для установки в Debian/Ubuntu:Используйте эту команду для установки на CentOS, Fedora и openSUSE:
Добавьте себя в группу
davfs2
:usermod -aG davfs2 <username>
Затем создайте каталог
nextcloud
в вашем домашнем каталоге для точки монтирования и.davfs2/
для вашего личного файла конфигурации:mkdir ~/nextcloud mkdir ~/. davfs2
Скопируйте
/etc/davfs2/secrets
в~/.davfs2
:cp /etc/davfs2/secrets ~/.davfs2/secrets
Установите себя в качестве владельца и сделайте права доступа для чтения и записи:
chown <linux_username>:<linux_username> ~/.davfs2/secrets chmod 600 ~/.davfs2/secrets
Добавьте свои учетные данные для входа в Nextcloud в конец файла
secrets
, используя URL-адрес вашего сервера Nextcloud, а также имя пользователя и пароль для Nextcloud:https://example.com/nextcloud/remote.php/dav/files/USERNAME/ <username> <password> or $PathToMountPoint $USERNAME $PASSWORD for example /home/user/nextcloud john 1234
Добавьте информацию о монтировании в
/etc/fstab
:https://example.com/nextcloud/remote.php/dav/files/USERNAME/ /home/<linux_username>/nextcloud davfs user,rw,auto 0 0
Затем проверьте, что он монтируется и аутентифицируется, выполнив следующую команду. Если вы установите его правильно, вам не понадобятся права root:
Вы также должны иметь возможность размонтировать его:
Теперь каждый раз, когда вы входите в систему Linux, ваша папка Nextcloud должна автоматически монтироваться через WebDAV в вашем каталоге ~/nextcloud
. Если вы предпочитаете монтировать его вручную, измените auto
на noauto
в /etc/fstab
.
Известные проблемы
Проблема
Ресурс временно недоступен
Решение
Если при создании файла в каталоге возникают проблемы, отредактируйте файл /etc/davfs2/davfs2.conf
и добавьте:
Проблема
Сертификат, предупреждения
Решение
Если вы используете самоподписанный сертификат, вы получите предупреждение. Чтобы изменить это, вам нужно настроить davfs2
для распознавания вашего сертификата. Скопируйте mycertificate.pem
в /etc/davfs2/certs/
. Затем отредактируйте /etc/davfs2/davfs2.conf`
и раскомментируйте строку servercert
. Теперь добавьте путь вашего сертификата, как в этом примере:
servercert /etc/davfs2/certs/mycertificate.pem
Доступ к файлам с помощью macOS
Примечание
MacOS Finder страдает от серии проблем реализации и должен использоваться, только если сервер Nextcloud работает на Apache и mod_php или Nginx 1.3.8+. Альтернативные macOS-совместимые клиенты, способные получать доступ к общим ресурсам WebDAV, включают приложения с открытым исходным кодом, такие как Cyberduck (см. Инструкции здесь) и Filezilla. Коммерческие клиенты включают в себя Mountain Duck, Forklift, Transmit и Commander One.
Чтобы получить доступ к файлам через macOS Finder:
- From the Finder’s top menu bar, choose Go > Connect to Server…:
When the Connect to Server… window opens, enter your Nextcloud server’s WebDAV address in the Server Address: field, i. e.:
https://cloud.YOURDOMAIN.com/remote.php/dav/files/USERNAME/
- Нажмите Подключить. Ваш сервер WebDAV должен появиться на рабочем столе как общий диск.
Доступ к файлам с помощью Microsoft Windows
Если вы используете Windows, вы можете сопоставить Nextcloud с новым диском. Сопоставление с диском позволяет просматривать файлы, хранящиеся на сервере Nextcloud, так же, как файлы, хранящиеся на подключенном сетевом диске.
Использование этой функции требует подключения к сети. Если вы хотите хранить ваши файлы в автономном режиме, используйте Desktop Client для синхронизации всех файлов вашего Nextcloud с одним или несколькими каталогами вашего локального жесткого диска.
Примечание
Windows 10 now defaults to allow Basic Authentication if HTTPS is enabled prior to mapping your drive. On older versions of Windows, you must permit the use of Basic Authentication in the Windows Registry: launch “regedit“ and navigate to HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesWebClientParameters. Create or edit the DWORD value “BasicAuthLevel“ (Windows Vista, 7 and 8) or “UseBasicAuth“ (Windows XP and Windows Server 2003) and set its value data to 1 for SSL connections. Value 0 means that Basic Authentication is disabled, a value of 2 allows both SSL and non-SSL connections (not recommended). Then exit Registry Editor, and restart the computer.
Сопоставление дисков с помощью командной строки
В следующем примере показано, как подключить диск с помощью командной строки. Чтобы сопоставить диск:
Откройте командную строку Windows.
Введите следующую строку в командной строке, чтобы сопоставить диск компьютера Z:
net use Z: https://<drive_path>/remote.php/dav/files/USERNAME/ /user:youruser yourpassword
где <drive_path>находится URL вашего сервера Nextcloud.
Пример: net use Z: https://example.com/nextcloud/remote.php/dav/files/USERNAME/ /user:youruser yourpassword
Компьютер сопоставляет файлы вашей учетной записи Nextcloud с буквой диска Z.
Примечание
Хотя это и не рекомендуется, вы также можете подключить сервер Nextcloud по протоколу HTTP, оставив соединение незашифрованным. Если вы планируете использовать HTTP-соединения на устройствах в общественных местах, мы настоятельно рекомендуем использовать VPN-туннель для обеспечения необходимой безопасности.
Альтернативный синтаксис команды:
net use Z: \\example.com@ssl\nextcloud\remote.php\dav /user:youruser yourpassword
Сопоставление дисков с помощью проводника Windows
Чтобы подключить диск с помощью Microsoft Windows Explorer:
- Перейдите на свой компьютер в проводнике Windows.
- Right-click on Computer entry and select Map network drive… from the drop-down menu.
- Выберите локальный сетевой диск, к которому вы хотите подключить Nextcloud.
- Укажите адрес своего экземпляра Nextcloud, /remote.php/dav/files/USERNAME/.
Пример:
https://example. com/nextcloud/remote.php/dav/files/USERNAME/
Примечание
Для серверов, защищенных SSL, установите флажок Переподключиться при входе в систему, чтобы обеспечить постоянство сопоставления при последующих перезагрузках. Если вы хотите подключиться к серверу Nextcloud от имени другого пользователя, установите флажок Подключиться с использованием других учетных данных.
- Нажмите кнопку
Готово
.
Проводник Windows отображает сетевой диск, делая ваш экземпляр Nextcloud доступным.
Доступ к файлам с помощью Cyberduck
Cyberduck — это браузер с открытым исходным кодом для FTP и SFTP, WebDAV, OpenStack Swift и Amazon S3, предназначенный для передачи файлов в macOS и Windows.
Примечание
В этом примере используется Cyberduck версии 4.2.1.
Чтобы использовать Cyberduck:
- Укажите сервер без какой-либо информации протокола. Например:
example.com
- Specify the appropriate port. The port you choose depends on whether or not your Nextcloud server supports SSL. Cyberduck requires that you select a different connection type if you plan to use SSL. For example:
80 (для WebDAV)
443 (для WebDAV (HTTPS/SSL))
- Use the ‘More Options’ drop-down menu to add the rest of your WebDAV URL into the ‘Path’ field. For example:
remote.php/dav/files/USERNAME/
Теперь Cyberduck обеспечивает доступ к файлам на сервере Nextcloud.
Доступ к общедоступным ресурсам через WebDAV
Nextcloud предоставляет возможность доступа к общим ресурсам через WebDAV.
Чтобы получить доступ к общедоступной папке, откройте:
https://example.com/nextcloud/public.php/webdav
в клиенте WebDAV используйте токен общего доступа в качестве имени пользователя и (необязательно) пароль общего ресурса в качестве пароля.
Примечание
Settings → Administration → Sharing → Allow users on this server to send shares to other servers. This option also allows WebDAV access to public shares needs to be enabled in order to make this feature work.
Известные проблемы
Проблема
Windows не подключается с использованием HTTPS.
Решение 1
Клиент Windows WebDAV может не поддерживать Индикацию имени сервера (SNI) для зашифрованных соединений. Если вы обнаружите ошибку при монтировании экземпляра Nextcloud с шифрованием SSL, обратитесь к своему провайдеру о назначении выделенного IP-адреса для вашего сервера на основе SSL.
Решение 2
The Windows WebDAV Client might not support TLSv1.1 and TLSv1.2 connections. If you have restricted your server config to only provide TLSv1.1 and above the connection to your server might fail. Please refer to the WinHTTP documentation for further information.
Проблема
Появляется следующее сообщение об ошибке: Ошибка 0x800700DF: размер файла превышает допустимый предел и не может быть сохранен.
Решение
Windows ограничивает максимальный размер файла, который может быть передан с или на общий ресурс WebDAV. Вы можете увеличить значение FileSizeLimitInBytes в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters, нажав Изменить.
Чтобы увеличить ограничение до максимального значения 4 ГБ, выберите Десятичное число, введите значение 4294967295 и перезагрузите Windows или перезапустите службу WebClient.
Проблема
Не удается получить доступ к вашим файлам из Microsoft Office через WebDAV.
Решение
Известные проблемы и способы их решения описаны в статье KB2123563.
Проблема
Невозможно сопоставить Nextcloud как диск WebDAV в Windows, используя самоподписаный сертификат.
Решение
- Перейдите к своему экземпляру Nextcloud через ваш любимый веб-браузер.
- Нажимайте, пока не дойдете до ошибки сертификата в строке состояния браузера.
- Просмотрите сертификат, затем на вкладке «Сведения» выберите «Копировать в файл».
- Сохраните на рабочий стол с произвольным именем, например
myNextcloud.pem
.- Пуск, Выполнить, MMC.
- Файл, добавить/удалить оснастку.
- Выберите «Сертификаты», нажмите «Добавить», «Моя учетная запись», «Готово» и «ОК».
- Выберете доверенные корневые центры сертификации, сертификаты.
- Щелкните правой кнопкой мыши Сертификат, выберите Все задачи, Импорт.
- Выберите Сохранить сертификат на рабочем столе.
- Select Place all Certificates in the following Store, Click Browse.
- Установите флажок «Показать физические хранилища», «Развернуть доверенные корневые центры сертификации» и выберите «Локальный компьютер», нажмите «ОК», завершите импорт.
- Проверьте список, чтобы убедиться, что он добавлен. Вам, вероятно, нужно обновить, прежде чем вы увидите это. Выйдите из MMC.
- Откройте Браузер, выберите Инструменты, Удалить историю просмотров.
- Выберите все, кроме Приватной фильтрации данных, завершите.
- Перейдите в Свойства обозревателя, Вкладка содержимого, Очистить состояние SSL.
- Закройте браузер, затем снова откройте и протестируйте.
Проблема
You cannot download more than 50 MB or upload large files when the upload takes longer than 30 minutes using Web Client in Windows 7.
Решение
Обходные пути описаны в статье KB2668751.
Доступ к файлам с помощью cURL
Поскольку WebDAV является расширением HTTP, cURL может использоваться для сценариев файловых операций.
Чтобы создать папку с текущей датой в качестве имени:
$ curl -u user:pass -X MKCOL "https://example.com/nextcloud/remote.php/dav/files/USERNAME/$(date '+%d-%b-%Y')"
Чтобы загрузить файл error. log
в этот каталог:
$ curl -u user:pass -T error.log "https://example.com/nextcloud/remote.php/dav/files/USERNAME/$(date '+%d-%b-%Y')/error.log"
Чтобы переместить файл:
$ curl -u user:pass -X MOVE --header 'Destination: https://example.com/nextcloud/remote.php/dav/files/USERNAME/target.jpg' https://example.com/nextcloud/remote.php/dav/files/USERNAME/source.jpg
Чтобы получить свойства файлов в корневой папке:
$ curl -X PROPFIND -H "Depth: 1" -u user:pass https://example.com/nextcloud/remote.php/dav/files/USERNAME/ | xml_pp <?xml version="1.0" encoding="utf-8"?> <d:multistatus xmlns:d="DAV:" xmlns:oc="http://nextcloud.org/ns" xmlns:s="http://sabredav.org/ns"> <d:response> <d:href>/nextcloud/remote.php/dav/files/USERNAME/</d:href> <d:propstat> <d:prop> <d:getlastmodified>Tue, 13 Oct 2015 17:07:45 GMT</d:getlastmodified> <d:resourcetype> <d:collection/> </d:resourcetype> <d:quota-used-bytes>163</d:quota-used-bytes> <d:quota-available-bytes>11802275840</d:quota-available-bytes> <d:getetag>"561d3a6139d05"</d:getetag> </d:prop> <d:status>HTTP/1. 1 200 OK</d:status> </d:propstat> </d:response> <d:response> <d:href>/nextcloud/remote.php/dav/files/USERNAME/welcome.txt</d:href> <d:propstat> <d:prop> <d:getlastmodified>Tue, 13 Oct 2015 17:07:35 GMT</d:getlastmodified> <d:getcontentlength>163</d:getcontentlength> <d:resourcetype/> <d:getetag>"47465fae667b2d0fee154f5e17d1f0f1"</d:getetag> <d:getcontenttype>text/plain</d:getcontenttype> </d:prop> <d:status>HTTP/1.1 200 OK</d:status> </d:propstat> </d:response> </d:multistatus>
Доступ к Dropbox с помощью PHP
В этой статье мы рассмотрим PHP API Dropbox, создав простой клиент для доступа к файлам в учетной записи Dropbox. Клиент выполнит некоторые основные операции, такие как аутентификация, просмотр файлов, а также загрузка и выгрузка файлов.
Чтобы статья была короткой и удобочитаемой, я буду сводить включенный код к минимуму и вместо этого отсылать вас к полному коду, доступному на GitHub. Для запуска кода вам понадобится PHP с поддержкой cURL и, очевидно, аккаунт Dropbox .
Отправной точкой для всего, что связано с разработкой с Dropbox, должен стать Центр разработчиков Dropbox, где вы можете найти справочник по API вместе с его основными понятиями и лучшими практиками. Вы также можете скачать официальные SDK, но PHP не указан среди поддерживаемых языков. На Github есть ссылка на сторонний PHP SDK .
Наш клиент будет структурирован больше как официальный клиент Python, но я взял некоторые идеи и код из PHP SDK выше, особенно для части OAuth. У нас будет объект DropboxClient
объект DropboxClient
. Первый позаботится о сложной части: получении учетных данных и управлении ими из Dropbox. Затем клиентский объект будет использовать объект сеанса для выполнения вызовов API и получения данных. Под объектом сеанса находится объект DropboxRESTClient
для выполнения HTTP-вызовов с использованием cURL.
Расскажите Dropbox о вашем приложении
Прежде всего нам необходимо зарегистрировать наше приложение в Dropbox, чтобы получить уникальную пару ключей API. Нам понадобятся эти ключи, чтобы «представить» наше приложение и запросить авторизацию.
Войдите в Центр разработчиков и перейдите по ссылке «MyApps», затем выберите «Создать приложение». Dropbox запросит у вас имя, описание и тип доступа для вашего приложения.
Параметр типа доступа указывает, где ваше приложение сможет читать и записывать файлы. Рекомендуемое значение — «Папка приложения», каталог песочницы, который будет создан внутри дома пользователя. Выбрав «Полный Dropbox», приложение увидит весь Dropbox пользователя.
Как только ваше приложение будет создано, появится страница параметров, где вы сможете отредактировать его данные и найти учетные данные для доступа.
Вновь созданные приложения находятся в «статусе разработки». Это позволяет нам немедленно начать разработку и позволяет до пяти другим пользователям протестировать ее. Когда приложение будет готово к выпуску, мы можем подать заявку на получение статуса продукта, и команда Dropbox проверит его, чтобы убедиться в том, что оно соответствует их условиям и рекомендациям по брендингу.
Кодирование приложения
Я поместил свой код в подкаталог моей локальной установки Apache, чтобы он был доступен по адресу http://localhost/mydropbox
. Структура каталогов:
Файл bootstrap.php
выполняет запуск приложения и будет включен в каждый из интерфейсных файлов, поэтому давайте начнем с обсуждения этого.
Я инициализирую глобальную переменную $config
как пустой массив и затем указываю некоторые значения конфигурации. Первые три связаны с Dropbox: ключ доступа, секретный ключ и тип доступа со страницы сведений о вашем приложении. Затем я определяю некоторые другие полезные настройки: базовый корневой путь приложения, путь для сохранения некоторых данных и путь к файлу PHP, который будет содержать токен доступа для приложения.
Этот файл файла маркера доступа не существует в начале; он создается на странице authorize.php
и заполняется учетными данными, предоставленными Dropbox. Это будет стандартный файл PHP, и, если он существует, он будет позже включен в этот скрипт. Содержимое файла токена будет похоже на:
<?php $access_token = array ( "oauth_token_secret" => "abcdefghilmnopqr", "oauth_token" => "stuvwxyzabcdefgh", "uid" => "1234567" );
oauth_token
и oauth_token_secret
— это учетные данные для доступа, а uid
— это уникальный идентификатор пользователя.
В следующем разделе файла начальной загрузки я устанавливаю поведение ошибок PHP и выполняю некоторые проверки требований; для запуска приложения каталог данных должен существовать и быть доступным для записи, а файл auth.php
должен быть доступен для записи, если он существует. Это гарантирует, что приложение может выполнять свою работу свободно.
Наконец, я включаю наши библиотеки, инициализирую сеанс PHP, устанавливаю пустой $access_token
(который будет заполнен позже) и, если он существует, auth. php
файл auth.php
.
Каждый сценарий внешнего интерфейса будет запускаться внутри основного блока try
/ catch
. Прежде чем копаться в коде библиотеки, нам сначала нужно понять поток, поэтому я начну с цикла авторизации.
авторизация
При первом запуске нашего приложения будет выполнено следующее условие в файле index.php
:
<?php if (!isset($access_token)) { header("Location: authorize.php"); exit; }
Маркер доступа пуст, поэтому я перенаправляю пользователя на страницу authorize.php
которая будет управлять процессом авторизации.
После фазы начальной загрузки я делаю еще одну проверку на наличие токена. Это гарантирует, что этот скрипт будет запущен, только если у нас нет токена. Чтобы избежать бесконечного цикла перенаправления, файл auth.php
удаляется основным блоком catch
скрипта, если возвращен код ошибки 401 (неверный токен).
Первое, что я делаю в каждом скрипте, это создаю новый объект DropboxSession
с нашими ключами API. Когда мы вызываем скрипт напрямую, первое условие будет ложным, а блок else
выполняется. Объект сеанса подключается к Dropbox и запрашивает временный токен. Затем токен анализируется в массив и сохраняется в переменной $_SESSION
для следующего этапа.
Мы создаем URL авторизации, используя этот токен. Пользователь должен быть перенаправлен или приглашен посетить URL-адрес, по которому он решает, разрешить или запретить доступ к своим данным.
URL авторизации может содержать обратный URL в качестве необязательного параметра. Я просто oauth_token
URL текущего скрипта, поэтому, если пользователь авторизует приложение, которое он перенаправляет обратно в наш скрипт, на этот раз значениями oauth_token
и uid
переданными строкой запроса. Первое условие теперь оценивается как истинное, поэтому мы можем продолжить и запросить маркер постоянного доступа.
Массив $token
для этого запроса oauth_token
с помощью этого нового oauth_token
и предыдущего oauth_token_secret
, затем он передается в метод obtainAccessToken()
. В случае успеха у нас есть постоянный (до отзыва) токен доступа. Это должно храниться где-то; очевидный выбор — база данных, но для этого примера мы экспортируем ее как действительный код PHP, используя встроенную var_export()
и запишем ее в наш файл auth.php
. Затем пользователь перенаправляется на страницу индекса, которая является самым простым сценарием.
В начале нашего блока try
/ catch
создается новый объект $access_token
, на этот раз с постоянным $access_token
качестве четвертого аргумента. Этот объект используется для создания объекта DropboxClient
. Эти два шага являются общими для всех других сценариев.
Открытые методы клиента отображаются на соответствующие вызовы Dropbox API. Я accountInfo()
метод accountInfo()
который возвращает массив, содержащий сведения о пользователе: уникальный идентификатор, имя, адрес электронной почты, информацию о квоте и реферальную ссылку (более подробную информацию см. В официальной документации).
За кулисами: объекты REST и Session
Теперь, когда у нас есть обзор поверхностного потока, давайте посмотрим, что происходит под капотом, наша библиотека Dropbox содержится в каталоге lib/dropbox
и состоит из трех классов.
ОТДЫХ
Класс самого низкого уровня нашей библиотеки — это клиент REST (см. lib/dropbox/rest.php
). Этот класс является простой оболочкой для cURL. Он выполняет HTTP-вызовы и возвращает выходные данные в необработанном или закодированном формате или создает исключение в случае ошибки.
Конструктор проверяет, установлен ли в системе cURL, или выдает исключение. Затем он пытается инициализировать внутренний обработчик $curl
с параметром $curlDefaults
. Обработчик не установлен внутри деструктора.
Методы error()
, errno()
и close()
говорят сами за себя. Затем у нас есть ряд служебных методов get()
, post()
и put()
, все простые обертки для метода main request()
который выполняет настоящую работу.
Сначала мы устанавливаем URL для выборки, затем метод HTTP и необходимые параметры, дополнительные заголовки и поля POST (если есть). Параметры для методов GET и PUT передаются по URL-адресу методом вызывающей стороны.
Прежде чем сделать вызов, мы должны сказать cURL получить весь контент, включая заголовки HTTP (установить опцию CURLOPT_HEADER
), потому что некоторые методы API (ex file_get()
) помещают свою информацию в заголовки.
Запрос cURL выполняется с помощью curl_exec()
сохраняющим результат в $response
а переменная $info
заполняется curl_info()
подробностями о последнем выполнении. Если метод PUT, нам также придется закрыть дескриптор входного файла.
С помощью содержимого $response
и значений $info
мы анализируем результат и отделяем заголовки HTTP от тела. По умолчанию тело возвращается как JSON-декодированный, если аргумент $raw
не установлен в true.
Прежде чем продолжить, есть проверка ошибок. Dropbox API использует коды ошибок HTTP для уведомлений об ошибках. Если код состояния больше 400, значит, что-то пошло не так, и в содержании тела сохраняется сообщение об ошибке. Я извлекаю это сообщение и выкидываю исключение. Если ошибок нет, HTTP-заголовки анализируются, и результат возвращается в виде массива, содержащего код состояния, заголовки и тело.
Объект сеанса
Объект DropboxSession
расширяет базовый клиент REST для удовлетворения наших потребностей:
- выполнить начальный процесс аутентификации / авторизации,
- включать полученные данные аутентификации в каждый последующий запрос REST.
Конструктор просто инициализирует внутренние переменные. Другой простой метод — buildAuthorizeURL()
который создает URL авторизации из временного токена. Наиболее важные методы класса:
-
obtainRequestToken()
— запросить временный токен доступа OAuth. -
obtainAccessToken()
— запросить постоянный токен доступа OAuth для приложения. -
fetch()
— выполнить вызов REST, включая все необходимые параметры аутентификации и подписи.
Эти три метода имеют похожий поток. Сначала они создают базовый целевой URL и заполняют ассоциативный массив $params
требуемыми ключами / значениями oauth_*
для отправки. Каждый вызов API должен содержать временную метку и уникальный случайный хэш, параметр $nonce
.
Затем подпись генерируется с использованием имени метода HTTP, URL-адреса и параметров. Затем он помещается в очередь в массив $params
с oauth_signature
ключа oauth_signature
. URL выбирается с помощью данного метода HTTP, и возвращается часть тела ответа. Для методов GET и PUT строка запроса генерируется и добавляется к URL-адресу с помощью встроенной функции http_build_query()
.
obtainRequestToken()
и obtainAccessToken()
практически идентичны: первый не использует токен и вызывается методом GET HTTP. Второй вызывается методом POST HTTP и должен включать токен, полученный при предыдущем вызове. Этот токен затем используется как часть ключа подписи для всех следующих вызовов API.
Метод fetch()
выполняет несколько дополнительных задач. Сначала он принимает массив с именем $args
с любыми дополнительными аргументами, требуемыми конкретным API, например путь к списку ресурсов или файл для загрузки / выгрузки. Эти параметры объединяются с массивом $params
до создания подписи. Единственным исключением является аргумент входного файла, используемый методом PUT для загрузки файла, который извлекается и сохраняется для дальнейшего использования. Оператор switch
используется, чтобы указать правильный HTTP-метод для вызова.
Класс DropboxSession
также имеет два служебных метода, encodeParams()
и getSignature()
, которые вызываются основными методами, описанными выше. encodeParams()
подготавливает параметры запроса для подписи, а getSignature()
генерирует подпись запроса OAuth для данного вызова API.
Последний объект DropboxClient
Объект DropboxClient
— это наш высокоуровневый интерфейс с Dropbox. Он предоставляет общедоступные методы API, использует объект DropboxSession
среднего уровня для выполнения вызовов API и возвращает обработанный вывод вызывающему сценарию. Для этой статьи я реализовал ограниченный набор методов:
-
accountInfo()
— получить данные текущего пользователя Dropbox. -
metadata()
— извлекает информацию об объекте Dropbox (файле или папке) и извлекает список содержимого для объектов папки. -
getFile()
— скачать файл и его метаданные и при необходимости сохранить его на диск. -
putFile()
— загрузить локальный файл в удаленный путь Dropbox.
Объект сеанса и базовые URL-адреса API хранятся как внутренние переменные и инициализируются конструктором.
Все методы следуют более или менее одинаковому подходу, поэтому я укажу на различия. Все методы, имеющие дело с путем, должны добавлять к каждому вызову корневой путь Dropbox. Корневой путь зависит от типа доступа к приложению и может быть «Dropbox», если приложение имеет полный доступ, или «Sandbox», если приложение имеет ограниченный доступ. Если это значение не соответствует удаленным настройкам приложения, возвращается ошибка.
Общие шаги, выполняемые каждым методом:
- Проверьте и подготовьте список аргументов.
- Выполните HTTP-вызов.
- Разбираем и возвращаем ответ.
Метод accountInfo()
является самым простым; он вызывает свой URL без аргументов и возвращает ассоциативный массив с ответом.
Метод metadata()
используется файлом list.php
для извлечения и отображения содержимого каталога. Единственный обязательный параметр — это путь к файлу или каталогу для проверки, но он позволяет нам указать все остальные параметры соответствующего вызова API. Если аргумент $path
является файлом, возвращаемый массив содержит его метаданные. Если это папка, ключ content
содержит список его файлов, если аргумент $list
равен false. Мы можем ограничить размер содержимого с $fileLimit
аргумента $fileLimit
(максимум 25 000) и можем запросить конкретную версию файла или папки (подробности см. В справочнике по API).
Важно отметить, что Dropbox API возвращает хеш-значение для каждого вызова. Если мы хотим отобразить содержимое папки и предоставить нашему методу параметр $hash
, API проверяет, изменились ли выходные данные с момента последнего вызова. Если нет, возвращается код состояния 301 (не изменен). Команда Dropbox рекомендует кэшировать результаты и полагаться на эти значения в списках папок для оптимизации производительности.
Метод getFile()
используется для извлечения файла, хранящегося в Dropbox пользователя. Все содержимое файла возвращается вызовом в случае успеха, и его метаданные хранятся в пользовательском заголовке HTTP x-dropbox-metadata
в виде строки JSON. Возвращаемое значение этого метода — ассоциативный массив, который содержит имя, тип mime, метаданные и контент. Кроме того, я добавил параметр $outFile
чтобы сохранить файл непосредственно на диске.
Файл download.php
показывает демонстрацию этого метода в действии. В этом примере загруженный файл сохраняется непосредственно в каталог данных приложения, а часть содержимого ответа очищается.
Метод putFile()
загружает файл из нашего локального хранилища в Dropbox пользователя, используя HTTP-метод PUT, который предпочитает команда Dropbox вместо POST. Этот метод проверяет, существует ли локальный файл и не превышает лимит API 150 МБ, перед любым другим обычным действием.
Поддерживаемые параметры для этого метода, помимо пути к исходному файлу, — это папка назначения, необязательное альтернативное имя и опция перезаписи. Если этот последний параметр имеет значение false и удаленный файл существует, загруженный файл переименовывается с прогрессивным номером (например, test.txt
становится test (1).txt
). API также позволяет использовать необязательный параметр parent_rev
для управления ревизиями, но для простоты я решил его опустить.
Резюме
Это лишь небольшая часть API Dropbox, но этого может быть достаточно для начала разработки собственных приложений. Для меня это был также хороший повод поиграть с OAuth. Не стесняйтесь дорабатывать и расширять код, сопровождающий эту статью, в соответствии с вашими потребностями и, как всегда, счастливого кодирования!
Изображение через Fotolia
PHP: Жонглирование шрифтами — Руководство
Типаж
PHP не требует (и не поддерживает) явное определение типа в переменной декларация; тип переменной определяется контекстом, в котором используется переменная. То есть, если присвоено строковое значение для переменной $ var , $ var становится строка. Если значение int затем присваивается $ var , он становится int.
Примером автоматического преобразования типов PHP является оператор умножения «*».Если один из операндов является плавающим, то оба операнда оцениваются как float, и результатом будет float. Иначе, операнды будут интерпретированы как целые числа, и результат будет также быть int. Обратите внимание, что это , а не изменить типы самих операндов; единственное изменение в том, как оцениваются операнды и тип самого выражения.
php
$ foo = "1"; // $ foo - строка (ASCII 49)
$ foo * = 2; // $ foo теперь целое (2)
$ foo = $ foo * 1.3; // $ foo теперь является вещественным (2.6)
$ foo = 5 * "10 поросят"; // $ foo является целым числом (50)
$ foo = 5 * "10 маленьких свиней"; // $ foo - это целое число (50)
?>
Если последние два приведенных выше примера кажутся странными, посмотрите, как числовые строки преобразовать в целые числа.
Чтобы заставить переменную оцениваться как определенный тип, см. Раздел Приведение типов. Чтобы изменить тип переменной, см. функцию settype ().
Чтобы протестировать любой из примеров в этом разделе, используйте var_dump () функция.
Примечание :
Поведение автоматического преобразования в массив в настоящее время неопределенный.
Кроме того, поскольку PHP поддерживает индексацию строк через смещения используя тот же синтаксис, что и индексирование массива, следующий пример справедливо для всех версий PHP:
php
$ a = 'автомобиль'; // $ a - строка
$ a [0] = 'b'; // $ a по-прежнему является строкой
echo $ a; // бар
?>См. Раздел под названием String доступ по символам для получения дополнительной информации.
Тип литье
Приведение типов в PHP работает так же, как и в C: имя желаемого типа пишется в круглых скобках перед преобразованной переменной.
php
$ foo = 10; // $ foo - целое число
$ bar = (boolean) $ foo; // $ bar - это логическое значение
?>
Разрешенные броски:
- (int), (integer) — преобразовать в int
- (bool), (boolean) — привести к типу bool
- (float), (double), (real) — приведение к float
- (строка) — преобразовать в строку
- (массив) — преобразовать в массив
- (объект) — приведение к объекту
- (не задано) — привести к NULL
(двоичное) приведение и префикс b существует для прямой поддержки.Обратите внимание, что (двоичное) приведение необходимо так же, как (строка), но на него не следует полагаться на.
Приведение (неустановленное) устарело с PHP 7.2.0. Обратите внимание, что (неустановленное) приведение то же самое, что присвоение значения NULL переменной или вызову. В (unset) приведение удалено с PHP 8.0.0.
Обратите внимание, что в круглых скобках разрешены табуляции и пробелы, поэтому следующие функционально эквивалентны:
php
$ foo = (int) $ bar;
$ foo = (int) $ bar;
?>
Преобразование литеральных строк и переменных в двоичные струны:
php
$ binary = (двоичный) $ string;
$ binary = b "двоичная строка";
?>
Примечание :
Вместо того, чтобы преобразовывать переменную в строку, также возможно заключить переменную в двойные кавычки.
php
$ foo = 10; // $ foo - целое число
$ str = "$ foo"; // $ str - это строка
$ fst = (string) $ foo; // $ fst также является строкой// Это распечатывает, что «они одинаковые»
if ($ fst === $ str) {
echo «они одинаковы»;
}
?>
Может быть неочевидно, что именно произойдет при переходе между определенными типы. Для получения дополнительной информации см. Эти разделы:
PHP 7.4 — PhpStorm
PHP 7.4 содержит новые функции, дополнения синтаксиса и исправления. Подробные сведения о миграции кода см. В руководстве «Переход с PHP 7.3.x на PHP 7.4.x».
Типизированные свойства
С поддержкой типизированных свойств вы можете объявлять подсказки типа для переменных и свойств класса. PhpStorm выделяет и разрешает типизированные свойства и отображает нарушения типа, если таковые имеются. Вы можете использовать действие «Добавить объявленный тип» Alt + Enter , позволяющее добавлять подсказку типа «на лету» на основе PHPDoc, значения по умолчанию или объявления типа аргумента.
Вложенный тернарный оператор
PHP 7.4 не поддерживает левую ассоциативность для ?
тернарный оператор. Вам следует либо вообще не использовать вложенные тернары, либо, если необходимо, предоставить круглые скобки для явного объявления порядка вычислений. Проверка использования вложенных тернарных операторов выделит устаревшие выражения и предоставит вам быстрое исправление, чтобы прояснить поведение:
Числовой литеральный разделитель
При работе с длинными числами вы можете разместить разделители подчеркивания в любом месте числового литерала, чтобы визуально отформатировать его и, таким образом, улучшить читаемость кода.Для этого используйте действие намерения Добавить разделители чисел Alt + Enter .
Ковариантные возвраты и контравариантные параметры
При работе с методом, унаследованным от родительского класса, вы можете определять менее конкретные типы параметров и более конкретные типы возвращаемых значений. То есть тип параметра может быть заменен одним из его супертипов, а тип возвращаемого значения может быть заменен его подтипом.
Оператор объединения с нулевым значением
Оператор слияния с нулевым значением ?? =
позволяет объединить операции объединения и присваивания с нулевым значением в одну.Таким образом можно сократить длинные конструкции кода. PhpStorm обнаруживает использование ??
и предоставляет быстрое решение для уменьшения избыточности.
Оператор распространения в выражениях массива
В PHP 7. 4 вы можете использовать оператор распространения ...
внутри выражений массива. Раньше он был доступен только внутри списков аргументов функций. Недопустимый тип проверки распакованных аргументов проверяет правильность использования оператора и гарантирует, что вы распаковываете только массивы и обходные объекты.
Стрелочные функции
При написании простых однострочных лямбда-функций в PHP 7.4 вы можете использовать синтаксис коротких стрелок: fn (parameter_list) => expr
. Функции с короткими стрелками вводят автоматическую привязку переменных из внешней области по значению. PhpStorm обеспечивает для них завершение, а также разрешает объявления.
Чтобы преобразовать лямбда-функцию из старого синтаксиса в новый короткий, вы можете использовать соответствующее действие намерения Преобразовать закрытие в функцию стрелки:
Устаревшие версии
PHP 7. 4 осуждает несколько языковых конструкций. Вы можете просмотреть полный список устаревших здесь. PhpStorm выделяет такие устаревшие способы использования и предлагает быстрые исправления для них.
Последнее изменение: 02 декабря 2020 г.
Access-Control-Allow-Headers — HTTP | MDN
Access-Control-Allow-Headers: <имя-заголовка> [, <имя-заголовка>] *
Заголовки Access-Control-Allow-Headers: *
-
<имя-заголовка>
- Имя поддерживаемого заголовка запроса.В заголовке может быть указано любое количество заголовков, разделенных запятыми.
-
*
(подстановочный знак) - Значение «
*
» считается специальным значением подстановочного знака только для запросов без учетных данных (запросы без файлов cookie HTTP или информации аутентификации HTTP). В запросах с учетными данными он обрабатывается как буквальное имя заголовка «*
» без специальной семантики. Обратите внимание, что заголовокAuthorization
не может содержать подстановочные знаки и всегда должен быть указан явно.
Вот пример того, как может выглядеть заголовок Access-Control-Allow-Headers
. Он указывает, что настраиваемый заголовок с именем X-Custom-Header
поддерживается запросами CORS к серверу (в дополнение к заголовкам запросов, занесенным в список безопасных CORS).
Access-Control-Allow-Headers: X-Custom-Header
В этом примере показан Access-Control-Allow-Headers
, когда он указывает поддержку нескольких заголовков.
Access-Control-Allow-Headers: X-Custom-Header, Upgrade-Insecure-Requests
Обход дополнительных ограничений
Пример предполетного запроса
Давайте рассмотрим пример предполетного запроса, включающего Access-Control-Allow-Headers
.
Запрос
Во-первых, просьба. Предварительный запрос — это запрос OPTIONS
, который включает в себя некоторую комбинацию трех заголовков предварительного запроса: Access-Control-Request-Method
, Access-Control-Request-Headers
и Origin
.
Предварительный запрос ниже сообщает серверу, что мы хотим отправить запрос CORS GET
, который имеет заголовки, перечисленные в Access-Control-Request-Headers
( Content-Type
и x-requested-with
).
ОПЦИИ / ресурс / foo Метод-запроса-контроля доступа: ПОЛУЧИТЬ Access-Control-Request-Headers: Content-Type, x-request-with Происхождение: https://foo.bar.org
Ответ
Если запрос CORS, указанный в запросе предварительной проверки, авторизован, сервер ответит на запрос предварительной проверки сообщением, в котором указаны разрешенный источник, методы и заголовки. Ниже мы видим, что Access-Control-Allow-Headers
включает в себя запрошенные заголовки.
HTTP / 1.1 200 ОК Content-Length: 0 Подключение: keep-alive Access-Control-Allow-Origin: https://foo.bar.org Доступ-Контроль-Разрешить-Методы: POST, GET, OPTIONS, DELETE Access-Control-Allow-Headers: Content-Type, x-required-with Максимальный возраст управления доступом: 86400
Если запрошенный метод не поддерживается, сервер ответит ошибкой.
Таблицы BCD загружаются только в браузере
.323 | текст / h423 | Интернет-телефония | |
.aac | аудио / aac | Аудиофайл AAC | |
.abw | Приложение/ abiword | Документ AbiWord | |
.acx | приложение / интернет-собственность-поток | Исполняемый файл Atari ST | |
.ai | приложение / иллюстратор | Файл Adobe Illustrator | |
.aif | аудио / aiff | Аудиофайл AIFF | audio / aifc, audio / x-aiff |
.aifc | аудио / aiff | Аудиофайл AIFF | audio / aifc, audio / x-aiff |
.aiff | аудио / aiff | Аудиофайл AIFF | audio / aifc, audio / x-aiff |
.asf | видео / x-ms-asf | Файл Windows Media | |
. asp | Приложение/ x-asp | Исходный файл ASP | текст / asp |
.asr | видео / x-ms-asf | Файл Windows Media | |
.asx | видео / x-ms-asf | Файл Windows Media | |
.au | аудио / базовое | Аудиофайл | аудио / au, audio / x-au, audio / x-basic |
.avi | видео / avi | Видео файл AVI | приложение / x-troff-msvideo, изображение / avi, видео / msvideo, видео / x-msvideo, video / xmpg2 |
.axs | приложение / олескрипт | Сценарий ActiveX | |
.bas | текст / простой | Исходный код BASIC | |
.bin | приложение / поток октетов | Двоичный файл | приложение / bin, приложение / двоичный файл, приложение / x-msdownload |
.bmp | изображений / BMP | Растровое изображение | application / bmp, application / x-bmp, image / ms-bmp, image / x-bitmap, image / x-bmp, image / x-ms-bmp, image / x-win-bitmap, image / x-windows -bmp, изображение / x-xbitmap |
. bz2 | приложение / x-bzip2 | Сжатый файл bzip2 | приложение / bzip2, приложение / x-bz2, приложение / x-bzip |
.c | текст / x-csrc | Исходный файл C | |
.c ++ | текст / x-c ++ src | Исходный файл C ++ | |
.каб | заявка / vnd.ms-cab-сжатый | Архив Microsoft Cabinet | приложение / кабина, приложение / x-кабинет |
.cat | Приложение/ vnd.ms-pkiseccat | Каталог безопасности | |
.cct | Приложение/ x-Director | Файл Adobe Director | |
.cdf | Заявка/ cdf | Формат определения канала | приложение / x-cdf, приложение / netcdf, приложение / x-netcdf, текст / cdf, текст / x-cdf |
.cer | Приложение/ x-x509-ca-cert | Файл сертификата безопасности Интернета | приложение / pkix-cert, приложение / x-pkcs12, приложение / keychain_access |
. cfc | Приложение/ x-cfm | Исходный файл ColdFusion | |
.cfm | Приложение/ x-cfm | Исходный файл ColdFusion | |
.класс | приложение / x-java | Файл байт-кода Java | приложение / java, приложение / java-байт-код, приложение / java-vm, приложение / x-java-applet, приложение / x-java-bean, приложение / x-java-class, приложение / x-java-vm , приложение / x-jinit-bean, приложение / x-jinit-applet |
.clp | Приложение/ x-msclip | Буфер обмена Windows / рисунок | |
.смx | изображений / x-cmx | Изображение для обмена презентациями | приложение / cmx, приложение / x-cmx, рисунок / cmx, изображение / x-cmx |
.cod | изображений / cis-cod | Файл CIS-COD | |
.cp | текст / x-c ++ src | Исходный файл C ++ | |
. cpio | Приложение/ x-cpio | Архив UNIX CPIO | |
.cpp | текст / x-c ++ src | Исходный файл C ++ | |
.crd | Приложение/ x-mscardfile | Windows Cardfile | |
.crt | Приложение/ x-x509-ca-cert | Файл сертификата безопасности Интернета | приложение / pkix-cert, приложение / x-pkcs12, приложение / keychain_access |
.crl | Приложение/ pkix-crl | Список отозванных сертификатов | |
.crt | Приложение/ x-x509-ca-cert | Файл сертификата | приложение / pkix-cert, приложение / keychain_access |
.csh | Приложение/ x-csh | C Напильник | |
.css | текст / CSS | Файл каскадных таблиц стилей | Приложение/ таблица стилей CSS |
. cst | Приложение/ x-Director | Файл Adobe Director | |
.csv | текст / csv | Файл с разделителями-запятыми | приложение / csv, текст / значения, разделенные запятыми, текст / значения, разделенные запятой, x |
.cxt | Приложение/ x-Director | Файл Adobe Director | |
.dcr | Приложение/ x-Director | Файл Adobe Director | |
.der | Приложение/ x-x509-ca-cert | Файл сертификата безопасности Интернета | приложение / pkix-cert, приложение / x-pkcs12, приложение / keychain_access |
.dib | изображений / BMP | Растровое изображение | application / bmp, application / x-bmp, image / ms-bmp, image / x-bitmap, image / x-bmp, image / x-ms-bmp, image / x-win-bitmap, image / x-windows -bmp, изображение / x-xbitmap |
. diff | текст / х-патч | Исходный файл патча | |
.dir | Приложение/ x-Director | Файл Adobe Director | |
.dll | приложение / x-msскачать | Библиотека динамической компоновки | приложение / октет-поток, приложение / x-msdos-программа |
.dms | приложение / поток октетов | Сжатый архив DISKMASHER | |
.doc | приложение / vnd.ms-word | Документ Microsoft Word | приложение / документ, приложение / msword, приложение / msword-doc, приложение / vnd.msword, приложение / winword, приложение / слово, приложение / x-msw6, приложение / x-msword, приложение / x-msword-doc |
.docm | приложение / vnd.ms-word.document.macroEnabled.12 | Документ Microsoft Word | |
.docx | application / vnd.openxmlformats-officedocument. wordprocessingml.document | Файл Microsoft Word | заявка / vnd.ms-word.document.12, application / vnd.openxmlformats-officedocument.word |
. Точка | приложение / msword | Шаблон документа Word | |
.dotm | приложение / vnd.ms-word.template.macroEnabled.12 | Файл шаблона Microsoft Word | |
.dotx | заявка / vnd.openxmlformats-officedocument.wordprocessingml.template | Файл шаблона Microsoft Word | |
.dta | Приложение/ x-stata | Файл данных Stata | |
.dv | видео / x-dv | Цифровой видеофайл | |
.dvi | Приложение/ x-dvi | Файл DVI | |
.dwg | изображений / x-dwg | чертеж AutoCAD | application / acad, application / autocad_dwg, application / dwg, application / x-acad, application / x-autocad, application / x-dwg, image / vnd. dwg |
.dxf | Приложение/ x-autocad | чертеж AutoCAD | приложение / dxf, приложение / x-dxf, рисунок / x-dxf, изображение / vnd.dxf, изображение / x-autocad, изображение / x-dxf |
.dxr | Приложение/ x-Director | Файл Adobe Director | |
.elc | Приложение/ x-elc | Исходный файл Emacs | |
.eml | сообщение / rfc822 | Файл веб-архива | |
.enl | приложение / x-endnote-library | Файл библиотеки EndNote | заявка / ссылка на x-endnote |
.enz | приложение / x-endnote-library | Файл библиотеки EndNote | заявка / ссылка на x-endnote |
.eps | заявка / постскриптум | Файл PostScript | application / eps, application / x-eps, image / eps, image / x-eps |
. etx | текст / x-setext | Setext (Текст с расширенной структурой) | текст / любой текст |
.Evy | заявка / посланник | Документ посланника | Приложение/ x-envoy |
.exe | приложение / x-msdos-программа | Исполняемый файл Windows | приложение / dos-exe, приложение / exe, приложение / msdos-windows, приложение / x-sdlc, приложение / x-exe, приложение / x-winexe |
.fif | аппликация / фракталы | Формат фрактального изображения | изображений / FIF |
.flr | х-мир / х-vrml | Файл языка моделирования виртуальной реальности | |
.fm | приложение / vnd.framemaker | Файл FrameMaker | application / framemaker, приложение / производитель, application / vnd.mif, application / x-framemaker, application / x-maker, application / x-mif |
. fqd | Приложение/ x-Director | Файл Adobe Director | |
.gif | изображение / gif | GIF изображение | |
.gtar | аппликация / деготь | Сжатый файл tar | приложение / x-gtar, приложение / x-tar |
.gz | приложение / gzip | Сжатый архив gzip | приложение / сжатие gzip, приложение / сжатие gzip, приложение / x-gunzip, приложение / x-gzip |
.h | текст / x-chdr | Заголовочный файл C | |
.hdf | Приложение/ x-hdf | Файл иерархического формата данных | |
.hlp | приложение / winhlp | Файл справки Windows | приложение / x-helpfile, приложение / x-winhelp |
.hqx | Приложение/ binhex | Архив BinHex | приложение / mac-binhex, приложение / mac-binhex40 |
. hta | приложений / hta | Файл приложения HTML | |
.htc | текст / x-компонент | Файл компонента HTML | |
.htm | текст / HTML | HTML файл | приложение / xhtml + xml |
.html | текст / HTML | HTML файл | приложение / xhtml + xml |
.htt | текст / webviewhtml | Файл гипертекстового шаблона | |
.ico | изображений / x-ico | Favicon, файл значков | |
.ics | текст / календарь | Календарный файл | |
.ief | изображений / ief | Файл изображения IEF | |
.iii | Приложение/ x-iphone | Файл, совместимый с Intel для iPhone | |
.indd | Приложение/ x-indesign | Файл Adobe InDesign | |
. ins | Приложение/ регистрация x-internet | Файл настроек Интернет-коммуникаций IIS | |
.isp | Приложение/ регистрация x-internet | Файл настроек интернет-провайдера IIS | |
.jad | текст / vnd.sun.j2me.app-дескриптор | Дескриптор приложения Java | |
.jar | приложение / java-архив | Файл архива Java | |
.Java | текст / x-java | Исходный файл Java | Java / *, текст / Java, текст / x-java-источник |
.jfif | изображений / jpeg | Изображение JPEG | изображений / pjpeg |
.jpe | изображений / jpeg | Изображение JPEG | изображений / pjpeg |
.jpeg | изображений / jpeg | Изображение JPEG | изображений / pjpeg |
.jpg | изображений / jpeg | Изображение JPEG | изображений / pjpeg |
. js | текст / JavaScript | Исходный файл JavaScript | приложение / javascript, приложение / x-javascript, приложение / x-js |
.kml | application / vnd.google-earth.kml + xml | Файл KML | |
.kmz | приложение / vnd.google-earth.kmz | Сжатый файл KML | |
. Латекс | аппликация / x-латекс | LATEX файл | текст / x-латекс |
.lha | Приложение/ x-lha | Сжатый архивный файл | приложение / lha, приложение / lzh, приложение / x-lzh, приложение / x-lzh-archive |
.lib | приложение / x-endnote-library | Файл библиотеки EndNote | заявка / ссылка на x-endnote |
.llb | Приложение/ x-labview | Файл приложения LabVIEW | Приложение/ x-labview-vi |
.log | текст / x-log | Текстовый файл журнала | |
. lsf | видео / x-la-asf | Потоковое аудио / видео файл | |
.lsx | видео / x-la-asf | Потоковое аудио / видео файл | |
.lvx | приложение / x-labview-exec | Файл моделирования LabVIEW CAL | |
.лж | Приложение/ x-lha | Сжатый архивный файл | приложение / lha, приложение / lzh, приложение / x-lzh, приложение / x-lzh-archive |
.м | текст / x-objcsrc | Исходный файл на языке C | |
.m1v | видео / mpeg | Видеофайл MPEG | |
м2в | видео / mpeg | Видеофайл MPEG | |
м3 | аудио / x-mpegurl | Файл списка воспроизведения MP3 | application / x-winamp-playlist, audio / mpegurl, audio / mpeg-url, audio / playlist, audio / scpls, audio / x-scpls |
. m4a | аудио / m4a | Аудиофайл MPEG-4 | аудио / x-m4a |
.m4v | видео / mp4 | Видеофайл MPEG-4 | видео / mpeg4, видео / x-m4v |
.ma | приложение / математика | Файл Mathematica | |
сообщение / rfc822 | Файл веб-архива | ||
.мужчина | Приложение/ x-troff-man | Troff с файлом макросов MAN | |
.mcd | Приложение/ x-mathcad | MathCaD файл | приложение / mcad |
.mdb | приложение / vnd.ms-access | Файл Microsoft Access | приложение / mdb, приложение / msaccess, приложение / vnd.msaccess, приложение / x-mdb, приложение / x-msaccess |
.me | Приложение/ x-troff-me | Troff с файлом макросов ME | |
.mfp | application / x-shockwave-flash | Файл Adobe Flash | приложение / futuresplash |
. mht | сообщение / rfc822 | Файл веб-архива | |
.mhtml | сообщение / rfc822 | Файл веб-архива | |
. Середина | аудио / x-midi | Аудиофайл MIDI | приложение / x-midi, audio / mid, audio / midi, audio / soundtrack |
.midi | аудио / x-midi | Аудиофайл MIDI | приложение / x-midi, audio / mid, audio / midi, audio / soundtrack |
.mif | приложение / vnd.framemaker | Файл FrameMaker | application / framemaker, приложение / производитель, application / vnd.mif, application / x-framemaker, application / x-maker, application / x-mif |
.mny | Приложение/ x-msmoney | Файл данных о деньгах | |
.mov | видео / quicktime | Видео файл Quicktime | |
.mp2 | видео / mpeg | Аудиофайл MPEG уровня 2 | аудио / MPEG, аудио / x-mpeg, аудио / x-mpeg-2, видео / x-mpeg, видео / x-mpeq2a |
. mp3 | аудио / MPEG | Аудиофайл MP3 | audio / mp3, audio / mpeg3, audio / mpg, audio / x-mp3, audio / x-mpeg, audio / x-mpeg3, audio / x-mpg |
.mpa | видео / mpeg | Аудиопоток MPEG | |
.mpe | видео / mpeg | Видеофайл MPEG | |
.mpeg | видео / mpeg | Видеофайл MPEG | |
. Миль на галлон | видео / mpeg | Видеофайл MPEG | |
MPP | приложение / vnd.ms-project | Файл Microsoft Project | приложение / mpp, приложение / msproj, приложение / msproject, приложение / x-dos_ms_project, приложение / x-ms-project, приложение / x-msproject |
.mpv2 | видео / mpeg | Аудиопоток MPEG | |
.mqv | видео / quicktime | Видео файл Quicktime | |
.ms | Приложение/ x-troff-ms | Troff с файлом макросов MS | |
. mvb | приложение / x-msmediaview | Программа просмотра мультимедиа | |
.mws | аппликация / x-клен | Файл рабочего листа Maple | Приложение/ maple-v-r4 |
.nb | приложение / математика | Файл Mathematica | |
.nws | сообщение / rfc822 | Файл веб-архива | |
.oda | заявка / oda | Документ ODA | |
.odf | приложение / vnd.oasis.opendocument.formula | Файл формул OpenOffice | |
.odg | приложение / vnd.oasis.opendocument.graphics | Графический файл OpenOffice | |
.odp | заявка / vnd.oasis.opendocument.presentation | Файл презентации OpenOffice | |
.ods | Приложение/ vnd.oasis.opendocument. spreadsheet | Файл электронной таблицы OpenOffice | |
. odt | application / vnd.oasis.opendocument.text | Документ OpenOffice | |
.ogg | приложение / ogg | Аудиофайл OGG | приложение / x-ogg, audio / x-ogg |
.один | Приложение/ msonenote | Файл Microsoft OneNote | |
.p12 | Приложение/ x-x509-ca-cert | Файл сертификата безопасности Интернета | приложение / pkix-cert, приложение / x-pkcs12, приложение / keychain_access |
. Патч | текст / х-патч | Исходный файл патча | |
.pbm | изображение / x-Portable-bitmap | Переносимое растровое изображение | изображение / pbm, изображение / переносимое растровое изображение, изображение / x-pbm |
.pcd | изображений / x-photo-cd | Файл компакт-диска с фотографиями Kodak | изображений / pcd |
. pct | изображений / x-pict | Изображение для Macintosh Quickdraw | изображение / pict, изображение / x-macpict |
Файл Adobe Acrobat | приложение / acrobat, приложение / nappdf, приложение / x-pdf, приложение / vnd.pdf, текст / pdf, текст / x-pdf | ||
.pfx | приложение / x-pkcs12 | Файл обмена личной информацией | |
.pgm | изображение / x-portable-graymap | Портативное изображение серой карты | изображений / x-pgm |
.php | Приложение/ x-php | Исходный файл PHP | приложение / php, текст / php, текст / x-php |
.pic | изображений / x-pict | Изображение для Macintosh Quickdraw | изображение / pict, изображение / x-macpict |
.pict | изображений / x-pict | Изображение для Macintosh Quickdraw | изображение / pict, изображение / x-macpict |
. pjpeg | изображений / jpeg | Изображение JPEG | изображений / pjpeg |
.pl | Приложение/ x-perl | Исходный файл Perl | текст / x-perl |
.pls | аудио / x-mpegurl | Файл списка воспроизведения MP3 | application / x-winamp-playlist, audio / mpegurl, audio / mpeg-url, audio / playlist, audio / scpls, audio / x-scpls |
.pko | заявка / ynd.ms-pkipko | Объект безопасности PublicKey | |
.pm | Приложение/ x-perl | Исходный файл Perl | текст / x-perl |
.pmc | Приложение/ x-perfmon | Файл монитора производительности Windows | |
.png | изображение / png | PNG изображение | изображений / x-png |
.pnm | изображение / x-portable-anymap | Portable Any Map Graphic Bitmap | Портативное растровое изображение любой карты|
. pod | текст / x-pod | Файл документации Perl | |
.potm | приложение / vnd.ms-powerpoint.template.macroEnabled.12 | Файл шаблона Microsoft PowerPoint | |
.potx | application / vnd.openxmlformats-officedocument.presentationml.template | Файл шаблона Microsoft PowerPoint | |
.ppam | приложение / vnd.ms-powerpoint.addin.macroEnabled.12 | Файл Microsoft PowerPoint | |
.ppm | изображение / x-portable-pixmap | Переносимое растровое изображение | приложение / стр / мин, приложение / x-стр / мин, изображение / x-стр / мин |
.pps | Приложение/ vnd.ms-powerpoint | Файл Microsoft PowerPoint | приложение / ms-powerpoint, приложение / mspowerpoint, приложение / powerpoint, приложение / ppt, приложение / vnd-mspowerpoint, приложение / vnd_ms-powerpoint, приложение / x-mspowerpoint, приложение / x-powerpoint |
. ppsm | приложение / vnd.ms-powerpoint.slideshow.macroEnabled.12 | Файл Microsoft PowerPoint | |
.ppsx | application / vnd.openxmlformats-officedocument.presentationml.slideshow | Файл Microsoft PowerPoint | |
.ppt | Приложение/ vnd.ms-powerpoint | Файл Microsoft PowerPoint | приложение / ms-powerpoint, приложение / mspowerpoint, приложение / powerpoint, приложение / ppt, приложение / vnd-mspowerpoint, приложение / vnd_ms-powerpoint, приложение / x-mspowerpoint, приложение / x-powerpoint |
.pptm | приложение / vnd.ms-powerpoint.presentation.macroEnabled.12 | Файл Microsoft PowerPoint | |
.pptx | application / vnd.openxmlformats-officedocument.presentationml.presentation | Файл Microsoft PowerPoint | |
.prf | приложение / pics-rules | Файл правил PICS | |
. пс | заявка / постскриптум | Файл PostScript | application / eps, application / x-eps, image / eps, image / x-eps |
.psd | приложение / фотошоп | Файл Adobe Photoshop | приложение / psd, приложение / x-photoshop, изображение / фотошоп, изображение / psd, изображение / x-photoshop, изображение / x-psd |
.pub | заявка / vnd.ms-publisher | Файл Microsoft Publisher | Приложение/ x-mspublisher |
.py | текст / x-python | Исходный файл Python | |
.qt | видео / quicktime | Видео файл Quicktime | |
.ra | аудио / vnd.rn-realaudio | Файл RealAudio | аудио / vnd.pn-realaudio, audio / x-pn-realaudio, audio / x-pn-realaudio-plugin, audio / x-pn-realvideo, audio / x-realaudio |
.ram | аудио / vnd.rn-realaudio | Файл RealAudio | audio / vnd. pn-realaudio, audio / x-pn-realaudio, audio / x-pn-realaudio-plugin, audio / x-pn-realvideo, audio / x-realaudio |
.rar | заявка / rar | Сжатый архив | приложение / сжатие x-rar |
.ras | изображение / x-cmu-raster | Изображение растровое | |
.rgb | изображений / x-rgb | IRIS изображение | изображений / rgb |
.rm | приложение / vnd.rn-realmedia | Файл RealMedia | |
.rmi | аудио / середина | Радио MIDI-файл | |
.roff | Приложение/ x-troff | Напильник Troff | |
об / мин | аудио / vnd.rn-realaudio | Файл RealAudio | audio / vnd.pn-realaudio, audio / x-pn-realaudio, audio / x-pn-realaudio-plugin, audio / x-pn-realvideo, audio / x-realaudio |
. rtf | Заявление/ RTF | Файл в формате RTF | приложение / форматированный текст, приложение / x-rtf, текст / форматированный текст, текст / RTF |
.RTX | Заявление/ RTF | Файл в формате RTF | приложение / форматированный текст, приложение / x-rtf, текст / форматированный текст, текст / RTF |
.rv | видео / vnd.rn-realvideo | Файл RealVideo | видео / x-pn-realvideo |
.sas | приложение / sas | Файл SAS | приложение / x-sas, приложение / x-sas-data, приложение / x-sas-log, приложение / x-sas-output |
.sav | Заявка/ spss | Файл SPSS | |
.scd | Приложение/ x-msschedule | Данные расписания | |
.scm | текст / x-script.scheme | Файл схемы | текст / х-схема |
. sct | текст / сценарий | Компонент сценария Windows | |
.SD2 | Заявка/ spss | Файл SPSS | |
. Море | Приложение/ x-sea | Самораспаковывающийся архив | |
.sh | Приложение/ x-sh | Файл сценария оболочки | Приложение/ x-shellscript |
.shar | Приложение/ x-shar | Архивный файл Sharp UNIX | |
.shtml | текст / HTML | HTML файл | приложение / xhtml + xml |
. Сайт | заявка / материал | Архив материалов | application / x-sit, application / x-stuffit |
. См | аппликация / смайл | SMIL файл | приложение / smil + xml |
.snd | аудио / базовое | Аудиофайл | аудио / au, audio / x-au, audio / x-basic |
. spl | application / x-shockwave-flash | Файл Adobe Flash | приложение / futuresplash |
.spo | Заявка/ spss | Файл SPSS | |
.sql | текст / x-sql | Файл SQL | текст / sql |
.src | приложение / x-wais-source | Исходный файл WAIS | |
.sst | приложение / vnd.ms-pkicertstore | Расширение криптографической оболочки хранилища сертификатов | |
.stl | заявка / vnd.ms-pkistl | Список доверенных сертификатов | |
.stm | текст / HTML | Файл SHTML | |
.swa | Приложение/ x-Director | Файл Adobe Director | |
.swf | application / x-shockwave-flash | Файл Adobe Flash | приложение / futuresplash |
. sxw | приложение / vnd.sun.xml.writer | Документ OpenOffice.org | |
.t | Приложение/ x-troff | Напильник Troff | |
.tar | аппликация / деготь | Сжатый файл tar | приложение / x-gtar, приложение / x-tar |
.tcl | Приложение/ x-tcl | Исходный файл TCL | текст / x-скрипт.tcl, текст / x-tcl |
.tex | аппликация / x-tex | TeX файл | текст / x-tex |
.tga | изображений / x-targa | Truevision Targa изображение | приложение / tga, приложение / x-targa, приложение / x-tga, изображение / targa, изображение / tga, изображение / x-tga |
.tgz | приложение / gzip | Сжатый архив gzip | приложение / сжатие gzip, приложение / сжатие gzip, приложение / x-gunzip, приложение / x-gzip |
. tif | изображений / tiff | Файл изображения с тегами | приложение / tif, приложение / tiff, приложение / x-tif, приложение / x-tiff, изображение / tif, изображение / x-tif, изображение / x-tiff |
.tiff | изображений / tiff | Файл изображения с тегами | приложение / tif, приложение / tiff, приложение / x-tif, приложение / x-tiff, изображение / tif, изображение / x-tif, изображение / x-tiff |
.tnef | Приложение/ ms-tnef | Файл Microsoft Exchange TNEF | |
.tr | Приложение/ x-troff | Напильник Troff | |
.trm | Приложение/ x-msterminal | Настройки терминала | |
.tsv | текст / цв | Файл с разделителями табуляцией | текст / значения, разделенные табуляцией, текст / значения, разделенные табуляцией x |
.twb | Приложение/ twb | Tableau Workbook file | приложение / twbx, приложение / x-twb |
. twbx | Приложение/ twb | Tableau Workbook file | приложение / twbx, приложение / x-twb |
.txt | текст / простой | Простой текстовый файл | |
.uls | текст / iuls | Служба определения местоположения в Интернете | |
.ustar | Приложение/ x-ustar | Сжатый архив POSIX tar | |
.vcf | текст / x-vcard | Файл vCard | |
.vrml | х-мир / х-vrml | Файл языка моделирования виртуальной реальности | |
.vsd | приложение / vnd.visio | Файл Microsoft Visio | приложение / visio, приложение / visio.drawing, приложение / vsd, приложение / x-visio, приложение / x-vsd, изображение / x-vsd |
.w3d | Приложение/ x-Director | Файл Adobe Director | |
. war | приложение / x-webarchive | Веб-архив KDE | |
.wav | аудио / wav | Аудиофайл формы волны | аудио / s-wav, аудио / волна, аудио / x-wav |
.wcm | заявка / vnd.ms-works | Передача файлов Works | |
.wdb | заявка / vnd.ms-works | Файл Microsoft Works | Приложение/ x-msworks-wp |
.wks | заявка / vnd.ms-works | Файл Microsoft Works | Приложение/ x-msworks-wp |
.wma | аудио / x-ms-wma | Файл Windows Media | |
.wmf | изображений / x-wmf | Файл Windows Media | приложение / wmf, приложение / x-msmetafile, приложение / x-wmf, изображение / wmf, изображение / x-win-metafile |
.wmv | видео / x-ms-wmv | Файл Windows Media | |
. wmz | Приложение/ x-ms-wmz | Сжатый файл Windows Media | |
.wpd | приложение / wordperfect | Документ WordPerfect | приложение / wordperf, приложение / wpd |
.wps | заявка / vnd.ms-works | Файл Microsoft Works | Приложение/ x-msworks-wp |
.wri | приложение / x-mswrite | Написать документ | |
.wrl | х-мир / х-vrml | 3D-файл VRML | |
.wrz | х-мир / х-vrml | 3D-файл VRML | |
.xbm | изображение / x-xbitmap | Растровое изображение | |
.xhtml | текст / HTML | HTML файл | приложение / xhtml + xml |
.xla | Приложение/ vnd.ms-excel | Надстройка Excel | |
.xlam | приложение / vnd. ms-excel.addin.macroEnabled.12 | Файл Microsoft Excel | |
.xlc | Приложение/ vnd.ms-excel | Диаграмма Excel | |
.xll | Приложение/ vnd.ms-excel | Файл Microsoft Excel | application / excel, application / msexcel, application / msexcell, application / x-dos_ms_excel, application / x-excel, application / x-ms-excel, application / x-msexcel, application / x-xls, application / xls |
.XLM | Приложение/ vnd.ms-excel | Макро-файл Excel | |
.xls | Приложение/ vnd.ms-excel | Файл Microsoft Excel | application / excel, application / msexcel, application / msexcell, application / x-dos_ms_excel, application / x-excel, application / x-ms-excel, application / x-msexcel, application / x-xls, application / xls |
.xlsb | приложение / vnd.ms-excel.sheet.binary.macroEnabled. 12 | Файл Microsoft Excel | |
.xlsm | приложение / vnd.ms-excel.sheet.macroEnabled.12 | Файл Microsoft Excel | |
.xlsx | application / vnd.openxmlformats-officedocument.spreadsheetml.sheet | Файл Microsoft Excel | |
.xlt | Приложение/ vnd.ms-excel | Файл шаблона Excel | |
.xltm | приложение / vnd.ms-excel.template.macroEnabled.12 | Файл Microsoft Excel | |
.xltx | application / vnd.openxmlformats-officedocument.spreadsheetml.template | Файл шаблона Microsoft Excel | |
.xlw | Приложение/ vnd.ms-excel | Файл рабочей области Excel | |
.xml | текст / xml | Файл XML | приложение / x-xml, приложение / xml |
.xpm | изображений / x-xpixmap | Pixmap изображение | изображение / x-xpm, изображение / xpm |
. xps | заявка / vnd.ms-xpsdocument | Файл Microsoft XPS | |
.xsl | текст / xsl | Файл таблицы стилей XSLT | |
.xwd | изображение / x-xwindowdump | X Дамп Windows | изображение / xwd, изображение / x-xwd, приложение / xwd, приложение / x-xwd |
.z | аппликация / x-compress | Сжатый архивный файл UNIX | приложение / z, приложение / x-z |
.молния | приложение / zip | Сжатый zip-архив | application / x-compress, application / x-compressed, application / x-zip, application / x-zip-compressed, application / zip-compressed, application / x-7zip-compressed |
Как создать токен доступа Shopify — Разработка приложений Shopify
Многие владельцы магазинов нуждаются в помощи, чтобы добавить в свой магазин дополнительную функциональность. Или, возможно, вы разработчик, у которого есть отличная идея нового приложения (приложения), которое помогло бы владельцам магазинов продавать больше. В любом случае вам, вероятно, потребуется использовать Shopify API. API позволяет вам делать такие вещи, как загружать инвентарь магазина и изменять его тему.
В этой статье мы рассмотрим, что нужно для получения доступа к конкретному магазину и выполнения вызовов API. Предполагается, что у вас есть хоть какие-то знания в области разработки. Я буду использовать PHP для представления примеров, но вы можете использовать практически любой язык разработки для выполнения всех обсуждаемых функций.
Создание приложений для продавцов Shopify
Если вы хотите создавать приложения для Shopify App Store, предлагать частные услуги по разработке приложений или ищете способы расширить свою пользовательскую базу, партнерская программа Shopify поможет вам добиться успеха.Присоединяйтесь бесплатно и получите доступ к образовательным ресурсам, средам предварительной версии для разработчиков и возможностям регулярного распределения доходов.
ПодписатьсяТипы приложений
В Shopify есть два типа приложений: частные и публичные. Частные приложения привязаны только к одному магазину и обычно предназначены для владельцев магазинов, которые хотят расширить функциональность своих магазинов. Общедоступные приложения, как вы, возможно, догадались, предназначены для приложений, которые должны быть предложены всем владельцам магазинов, а не привязаны к одному магазину. Например, все приложения, перечисленные в Shopify App Store, являются общедоступными.В этой статье мы сосредоточимся на общедоступных приложениях, но техническая сторона для обоих одинакова.
Вам также могут понравиться: 4 совета по созданию продающего приложения Shopify.
Перед началом работы
В этом руководстве мы рассмотрим каждый шаг, необходимый для запуска вашего приложения и взаимодействия с Shopify API. Прежде чем мы продолжим, вам нужно сделать следующее (если вы еще этого не сделали):
1. Зарегистрируйте учетную запись партнера Shopify.Это бесплатно!
2. При входе в систему создайте здесь ключи API своего приложения. Большинство параметров говорят сами за себя, однако, когда вы дойдете до поля URL обратного вызова приложения, вам нужно будет ввести домен, над которым вы работаете. Shopify будет отправлять только токены в этот домен. Например, если вы работаете на своем локальном компьютере, вы можете пока установить http: // localhost /.
3. После входа в систему щелкните Приложения на левой панели навигации и щелкните Создать приложение .
Назовите свое приложение как хотите. Для URL-адреса приложения введите домен, с которым вы работаете, прикрепленный к /install.php . Если вы разрабатываете локально на своем компьютере, введите http: //localhost/install.php . Вам может потребоваться добавить номер порта, если ваш сервер не работает на порту 80 (например, http: // localhost: 8888 / install.php ).
4. После создания приложения перейдите на вкладку Информация о приложении . В списке Whistlisted Redirect URL вам нужно добавить тот же домен, что и на шаге 3, на этот раз с /generate_token.php. Например, если вы разрабатываете локально на своем компьютере, вам нужно добавить http: //localhost/generate_token.php.
5. Прокрутите до конца этого представления и запишите свой ключ API и секретный ключ API . Эти учетные данные понадобятся вам, чтобы следовать примерам.
Загрузите мой образец кода PHP. Весь приведенный ниже пример кода взят из этих скриптов. Образец кода написан в процедурном стиле, чтобы облегчить изучение основных концепций. В производственной среде вам наверняка захочется добавить больше проверок и оптимизаций.
Раз уж мы затронули тему URL-адресов, узнайте больше о том, что такое канонический URL-адрес и почему они так важны.
Вам также могут понравиться: 7 советов по максимальному использованию Shopify API.
Создание токена доступа
Чтобы начать работу с данными магазина с помощью Shopify API, вы должны пройти аутентификацию в магазине. Это означает, что владелец магазина должен установить и утвердить ваше приложение для определенных разрешений (например, для создания новых продуктов). Это делается с помощью процесса под названием OAuth, который является очень безопасным и распространенным методом связи между приложениями. Он знает, что это звучит сложно, но не волнуйтесь, любой может быстро это освоить.
В этой статье мы будем использовать OAuth для создания специального URL-адреса, по которому пользователь может одобрить ваше приложение и, наконец, сгенерировать специальный токен, который вы можете использовать для доступа к соответствующему магазину через API в будущем.Ниже представлена блок-схема, на которой показаны все шаги, необходимые для этого.
Шаг 1: Сбор информации о магазине
Когда продавец Shopify запрашивает установку вашего приложения через Shopify App Store, запрос будет отправлен на URL вашего приложения с добавленным параметром shop . Значением параметра shop будет доменное имя продавца myshopify , например http: //localhost/install.php? shop = johns-apparel.myshopify.com.
Мы можем имитировать этот запрос на установку, просто вставив этот URL-адрес в адресную строку нашего браузера во время работы нашего сервера, заменив значение shop на домен вашего магазина разработки Shopify.
Шаг 2: Разрешение на установку
Когда у вас будет URL-адрес владельца магазина myshopify.com, вам нужно будет перенаправить пользователя на URL-адрес, по которому они смогут одобрить ваше приложение. Формат этого URL-адреса следующий.
https: // {магазин} .myshopify.com/admin/oauth/authorize?client_id= {api_key} & scope = {scopes} & redirect_uri = {redirect_uri}
{shop}
URL субдомена myshopify.com, который вам дал пользователь.
{api_key}
Ваш ключ API, который был вам предоставлен, как описано выше.
{scopes}
Это список разрешений, которые вы просите принять у владельца магазина. В этом примере нам понадобится возможность читать заказы и изменять продукты, поэтому я запрашиваю read_orders и write_products.См. Полный список областей и их определений.
{redirect_uri}
Куда направить пользователя дальше. Это URL-адрес сценария, который будет генерировать токен, как описано в шаге 3 ниже.
Пример кода PHP
Шаг 3. Захват кода доступа
Если пользователь одобрил вашу установку, он вернется с кодом авторизации в URL-адресе в виде строки запроса. Например:
Часть перед знаком «?» соответствует включенной вами переменной $ redirect_uri
.
После «?» должны быть включены несколько параметров: «code», «hmac» и «timestamp». Параметр «code» — это ваш код авторизации, который вы будете использовать для части процесса OAuth. Два других параметра используются для проверки того, что запрос действительно от Shopify. Давайте сначала поработаем над этим…
Шаг 3.b: Подтвердите данные
Что, если хакер попытается отправить запрос на ваш сервер в указанном выше формате? Как узнать, действительно ли это Shopify или это кто-то другой пытается злонамеренно? Вот почему предоставляются «hmac» и «timestamp».Вычислив дайджест HMAC SHA256, мы можем сравнить его с входящим параметром hmac и определить, является ли запрос законным.
Пример кода PHP
Давайте продолжим, используя это значение «кода», чтобы получить токен доступа для магазина. Мы сделаем это, запустив наш первый вызов API.
Шаг 4. Обменяйте код доступа на токен магазина
К настоящему времени у нас есть все необходимое для создания токена приложения: ключ API вашего приложения, учетные данные секретного ключа приложения и код доступа.
Shopify имеет специальную конечную точку вызова API, которую вы можете использовать для «обмена» кода доступа с постоянным токеном API магазина:
/ admin / oauth / access_token
Пример кода PHP
В приведенном выше коде мы отправляем сообщения на серверы Shopify, а затем сохраняем сгенерированный OAuth токен для demo-shop. myshopify.com в переменной $ token
. Помните, что это как пароль к этому магазину, поэтому вам нужно хранить этот токен в очень надежном месте.
Шаг 5. Выполните вызовы API
Если вы дошли до этого шага, значит, вы прошли все сложные этапы! Теперь вы можете выполнять вызовы API в магазин, если вы ранее были одобрены для соответствующей области. В противном случае вам нужно будет получить новый токен с необходимыми разрешениями, выполнив указанные выше действия.
Подводя итог, для каждого вызова API потребуются следующие данные:
- Токен API магазина
- Магазин «myshopify.com »URL
- Конечная точка API, для которой нужно вызывать вместе со специальными параметрами
В этом руководстве одно из разрешений (областей), к которым мы запросили доступ, — это чтение информации о продукте — давайте попробуем это сейчас. Конечная точка для этого вам понадобится: /admin/products.json
Пример кода PHP
Если все обработано правильно, переменная $ products
должна содержать строку JSON, которая выглядит примерно так:
В возвращенном JSON у меня есть только один продукт с идентификационным номером 370733088. Предположим, мы хотим изменить этот продукт, поэтому, продолжая работу с этим кодом, мы программно поместим этот идентификатор в переменную, чтобы мы могли работать с этим продуктом.
Хорошо, теперь у нас есть вышеупомянутый идентификационный номер, хранящийся в переменной $ product_id
. Представьте, что я хочу изменить название этого продукта. Существующее название, «тест», в конце концов, не очень удобно для пользователя. Вам нужно будет использовать эту переменную $ product_id
, чтобы Shopify знал, какой продукт вы изменяете…
В массиве $ modify_data
у нас есть вся необходимая информация, которую мы отправляем в Shopify.Этот массив конвертируется в JSON в нашей функции shopify_call ()
. Для справки в будущем требования для этого вызова API перечислены в документации API Shopify. Вы также можете заметить, что наш метод транзакции данных — PUT. Это сообщает Shopify, что мы изменяем данные, а не загружаем или удаляем их.
Если этот вызов API был успешным, вы получите обратно строку JSON с вашими обновлениями в переменной $ modified_product_response
:
Как видите, название продукта было обновлено, чтобы соответствовать тому, что мы отправили в переменной $ modify_data
.Shopify сделал свой API очень предсказуемым и последовательным. Это означает, что в будущем вы можете работать с большинством конечных точек API аналогичным образом.
Выполнение вызовов API на лету
Когда я разрабатываю для Shopify, я экономлю много времени, используя графический интерфейс для выполнения вызовов API. Таким образом, мне не нужно писать целую кучу PHP-кода, прежде чем я буду уверен, что API содержит данные, которые мне нужны. Ниже приведены несколько хороших вариантов.
Вам также может понравиться: Маркетинг вашего приложения Shopify: страница со списком приложений.
Практика ведет к совершенству
После небольшой практики, я думаю, вы согласитесь, что Shopify API гибок и прост в доступе. С ним можно сделать так много, и он только расширяет поддержку различных конечных точек. Не могу дождаться, чтобы увидеть, что вы придумаете!
Если у вас есть какие-либо вопросы, вы можете найти меня на форумах Shopify или написать в комментариях ниже.
Хотите узнать больше о создании приложений для Shopify? Ознакомьтесь с нашим исчерпывающим списком статей о разработке приложений Shopify и Shopify API.
MS Access: функция iif
В этом руководстве MSAccess объясняется, как использовать функцию Access iif с синтаксисом и примерами.
Описание
Функция iif Microsoft Access возвращает одно значение, если заданное условие оценивается как ИСТИНА, или другое значение, если оно оценивается как ЛОЖЬ.
Синтаксис
Синтаксис функции iif в MS Access:
iif (условие, значение_если_ истинное значение, значение_если_ ложь)
Параметры или аргументы
- состояние
- Значение, которое вы хотите проверить.
- value_if_true
- Значение, которое возвращается, если условие оценивается как ИСТИНА.
- значение_if_false
- Значение, которое возвращается, если условие оценивается как ЛОЖЬ.
Возврат
Функция iif возвращает value_if_true , когда условие TRUE.
Функция iif возвращает value_if_false , если условие — FALSE.
Применимо к
Функцию iif можно использовать в следующих версиях Microsoft Access:
- Доступ 2016, Доступ 2013, Доступ 2010, Доступ 2007, Доступ 2003, Доступ XP, Доступ 2000
Пример
Давайте посмотрим, как использовать функцию iif в MS Access:
iif ([Qty]> 10, «большой», «маленький»)
В этом примере будет возвращено значение «большой», если значение в поле Qty больше 10.В противном случае вернется «маленький».
Это эквивалентно следующему оператору IF в коде VBA.
Если [Кол-во]> 10 Тогда результат = "большой" Еще результат = "маленький" Конец, если
Пример в SQL / запросы
Вы можете использовать функцию iif в запросе в Microsoft Access.
Например:
В этом запросе мы использовали функцию iif следующим образом:
Часы: IIf ([Time Out] <# 12:00:00 PM #, ([Time Out) - [Time In]) * 24, (([Time Out] - [Time In]) * 25) -0 .5)
В этом примере, если поле [Time Out] меньше или равно 12 часам полудня, то функция iif вернет количество часов, прошедших между [Time Out] и [Time In].
Если [Тайм-аут] больше 12 часов полудня, то функция iif вычитает 30 минут из отработанного времени.
Результаты функции iif будут отображаться в столбце с именем Hours .
Часто задаваемые вопросы
Вопрос: Как мне использовать функцию iif, если я хочу иметь более одного условия?
Ответ: Вы можете использовать ключевое слово AND для включения нескольких условий.
В приведенном выше примере функция iif вернет «Да», если ContactTitle = «Owner» и City = «Madrid». Если одно или оба этих условия не выполняются, возвращается «Нет».
Изучение оболочки - Урок 9: Разрешения
Unix-подобные операционные системы, такие как Linux, отличаются от других вычислительных систем. системы в том, что они не только многозадачности , но и многопользовательский .
Что именно это означает? Это означает, что более одного пользователя могут быть
одновременно работая с компьютером.В то время как настольный или портативный компьютер
имеет только одну клавиатуру и монитор, он может использоваться более чем одним пользователем.
Например, если компьютер подключен к сети или Интернету, удаленный
пользователи могут войти в систему через ssh
(безопасная оболочка) и управлять
компьютер. Фактически, удаленные пользователи могут запускать графические приложения и иметь
вывод отображается на удаленном компьютере. Система X Window поддерживает это.
Многопользовательские возможности Unix-подобных систем - это особенность, которая глубоко укоренился в конструкции операционной системы.Если мы вспомним среда, в которой был создан Unix, имеет смысл. Много лет назад до того, как компьютеры стали «персональными», они были большими, дорогими и централизованными. Типичная университетская компьютерная система состояла из большого мэйнфрейма. расположены в каком-то здании на территории кампуса, и терминала были расположены повсюду кампус, каждый из которых подключен к большому центральному компьютеру. Компьютер бы поддерживать много пользователей одновременно.
Чтобы сделать это практичным, необходимо было разработать метод защиты пользователи друг от друга.В конце концов, мы бы не хотели, чтобы действия одного пользователя сбой компьютера, и мы не позволим одному пользователю вмешиваться в файлы принадлежащий другому пользователю.
В этом уроке будут рассмотрены следующие команды:
-
chmod
- изменить права доступа к файлам -
su
- временно стать суперпользователем -
sudo
- временно стать суперпользователем -
chown
- изменить владение файлом -
chgrp
- изменить а группа владения файлом
Права доступа к файлу
В системе Linux каждому файлу и каталогу назначаются права доступа для владелец файла, члены группы связанных пользователей и все остальные. Можно назначить права на чтение файла, запись файла и выполнение файла. (т.е. запустите файл как программу).
Чтобы увидеть настройки разрешений для файла, мы можем использовать команду ls
. В качестве примера рассмотрим программу bash
, которая находится в папке / bin
.
каталог:
[me @ linuxbox me] $ ls -l / bin / bash
-rwxr-xr-x 1 root root 1113504 6 июня 2019 г. / bin / bash
Здесь мы видим:
- Файл "/ bin / bash" принадлежит пользователю "корень"
- Суперпользователь имеет право читать, писать, и запустите этот файл
- Файл принадлежит группе "root"
- Члены группы "root" также могут читать и выполнить этот файл
- Все остальные могут прочитать и выполнить это файл
На диаграмме ниже мы видим, как выглядит первая часть листинга. интерпретируется.Он состоит из символа, указывающего тип файла, за которым следует три набора из трех символов, которые передают чтение, запись и исполнение разрешение для владельца, группы и всех остальных.
chmod
Команда chmod
используется для изменения
разрешения файла или каталога. Для его использования указываем желаемый
настройки разрешений и файл или файлы, которые мы хотим изменить. Есть два
способы указать разрешения. В этом уроке мы сосредоточимся на одном из них,
называется методом восьмеричной записи .
Легко представить настройки разрешений как серию битов ( как компьютер о них думает). Вот как это работает:
rwx rwx rwx = 111 111 111 rw- rw- rw- = 110 110 110 rwx --- --- = 111 000 000 и так далее... rwx = 111 в двоичном формате = 7 rw- = 110 в двоичном формате = 6 r-x = 101 в двоичном формате = 5 r-- = 100 в двоичной системе = 4
Теперь, если мы представим каждый из трех наборов разрешений (владелец, группа,
и другие) в виде одной цифры, у нас есть довольно удобный способ выразить
возможные настройки разрешений.Например, если мы хотим установить some_file
иметь права на чтение и запись для владельца, но
хотел, чтобы файл был закрыт для других, мы бы:
[me @ linuxbox me] $ chmod 600 some_file
Вот таблица с числами, которая охватывает все общие настройки. Те начинающиеся с «7» используются с программами (поскольку они разрешают выполнение), а остальные предназначены для других типов файлов.
Значение | Значение |
777 | (rwxrwxrwx) Нет ограничений на разрешения.Кто угодно может делать что угодно. Обычно нежелательная настройка. |
755 | (rwxr-xr-x) Владелец файла может читать, писать и выполнять файл. Все остальные может читать и выполнять файл. Эта настройка является общим для программ, которые используются всеми пользователей. |
700 | (rwx ------) Владелец файла может читать, писать и выполнять файл.Никто остальное имеет какие-то права. Эта настройка полезна для программ, которые может использовать только владелец, и должны храниться в тайне от других. |
666 | (rw-rw-rw-) Все пользователи могут читать и напишите файл. |
644 | (rw-r - r--) Владелец может читать и писать файл, а все остальные могут только прочтите файл. Обычная настройка данных файлы, которые могут читать все, но только владелец может измениться. |
600 | (rw -------) Владелец может читать и напишите файл. У всех остальных нет прав. Обычная настройка для файлов данных, которые владелец хочет сохранить конфиденциальность. |
Разрешения каталога
Команда chmod
также может использоваться для управления
права доступа к каталогам. Опять же, мы можем использовать восьмеричную запись, чтобы установить
разрешения, но значение атрибутов r, w и x отличается:
- r - Позволяет отображать содержимое каталога если также установлен атрибут x.
- w - Позволяет создавать файлы в каталоге, удален или переименован, если также установлен атрибут x.
- x - Позволяет войти в каталог (например,
cd dir
).
Вот несколько полезных настройки для справочников:
Значение | Значение |
---|---|
777 | (rwxrwxrwx) Нет ограничений на разрешения.Кто угодно может перечислять файлы, создавать новые файлы в каталоге и удалить файлы в каталоге. Вообще не хорошо параметр. |
755 | (rwxr-xr-x) Владелец каталога имеет полный доступ. Все остальные могут перечислить каталог, но не может ни создавать файлы, ни удалять их. Этот параметр является общим для каталогов которым вы хотите поделиться с другими пользователями. |
700 | (rwx ------) Владелец каталога имеет полный доступ.Больше ни у кого нет прав. Этот параметр полезен для каталогов, только владелец может использовать и должен храниться частное от других. |
На короткое время стать суперпользователем
Часто бывает необходимо стать суперпользователем, чтобы
выполнять важные задачи системного администрирования, но
как мы знаем, мы
не должны оставаться в системе как суперпользователь.
В большинстве дистрибутивов есть программа, которая может дать вам
временный доступ к привилегиям суперпользователя.Эта программа называется su
(сокращение от замещающего пользователя) и может использоваться в тех
случаи, когда вам нужно быть суперпользователем для небольшого
количество задач. Чтобы стать суперпользователем, просто
введите команду su
. Ты сможешь
будет запрошен пароль суперпользователя:
[me @ linuxbox me] $ su
Пароль:
[root @ linuxbox me] #
После выполнения команды su
у нас есть новый
сеанс оболочки в качестве суперпользователя. Чтобы выйти из сеанса суперпользователя, введите exit
, и мы вернемся к предыдущему сеансу.
В большинстве современных дистрибутивов используется альтернативный метод. Скорее, чем
используя su
, эти системы вместо этого используют команду sudo
. С sudo
,
одному или нескольким пользователям по мере необходимости предоставляются права суперпользователя. Чтобы
выполнить команду как суперпользователь, желаемой команде просто предшествует
с помощью команды sudo
. После ввода команды
пользователю предлагается ввести собственный пароль, а не пароль суперпользователя:
[me @ linuxbox me] долларов sudo some_command
Пароль для меня:
[me @ linuxbox me]
Фактически, современные дистрибутивы даже не устанавливают пароль учетной записи root, поэтому
делает невозможным войти в систему как пользователь root.Корневая оболочка все еще возможна
с sudo
с использованием параметра "-i":
[me @ linuxbox me] долларов sudo -i
Пароль для меня:
корень @ linuxbox: ~ #
Изменение владельца файла
Мы можем изменить владельца файла с помощью команды chown
. Вот пример: предположим, мы хотим
измените владельца some_file
с «я» на «вы». Мы могли:
[me @ linuxbox me] $ sudo chown you some_file
Обратите внимание, что для смены владельца файла у нас должен быть суперпользователь.
привилегии.Для этого в нашем примере использовалась команда sudo
команда для выполнения chown
.
chown
работает с каталогами так же, как и
по файлам.
Смена владельца группы
Групповое владение файлом или каталогом можно изменить с помощью chgrp
. Эта команда используется так:
[me @ linuxbox me] $ chgrp new_group some_file
В приведенном выше примере мы изменили групповое владение some_file
из предыдущей группы в «новую_группу».Мы должны быть
владелец файла или каталога для выполнения chgrp
.