OAuth

На этой странице показано, как аутентифицировать клиентов с помощью JAR REST API с помощью OAuth (1.0a). Мы объясним, как OAuth работает с Jira и проведем вас по примеру использования OAuth для аутентификации приложения Java (потребителя) с JRE (ресурсом) REST API для пользователя (владельца ресурса).

Аутентификация является ключевым процессом при интеграции с Jira. OAuth является одним из нескольких методов проверки подлинности, используемых с Jira, и обычно используется для аутентификации между серверами, особенно для приложений брандмауэра.

Покажите мне код!

Вы можете найти код для окончательного вывода этого руководства по Bitbucket (найдите каталог Java).

Если вы предпочитаете понимать вещи из источника, не стесняйтесь сначала проверять код. В противном случае руководство ниже объяснит, что происходит.

Также обратите внимание, что репозиторий содержит каталоги с примерами для Node.js, PHP, Python, Perl и Ruby.

Выбор метод аутентификации

Вы выбрали правильный метод аутентификации?

Принимая во внимание базовую аутентификацию? Мы не рекомендуем использовать базовую аутентификацию вообще, за исключением инструментов, таких как личные скрипты или боты. Это может быть проще реализовать, но гораздо менее безопасно. Имя пользователя и пароль отправляются повторно с запросами и кэшируются в веб-браузере. Даже если учетные данные отправляются через SSL / TLS, эти протоколы все еще могут быть скомпрометированы.

Этот учебник был последний раз проверен с помощью Jira Server 7.0.

Обзор

OAuth - это протокол аутентификации, который позволяет пользователю (то есть владельцу ресурса) предоставлять стороннему приложению (то есть потребителю / клиенту) доступ к их информации на другом сайте (то есть ресурсе). Jira использует 3-сторонний OAuth (3LO), что означает, что пользователь участвует в процессе аутентификации, разрешая доступ к своим данным на ресурсе (в отличие от двухстороннего OAuth, где пользователь не участвует).

 

Роли

Это роли в процессе аутентификации OAuth и как они связаны с аутентификацией с Jira:

Ресурс

КАРТИНКА\

Если вы интегрируете клиентское приложение с Jira, тогда Jira считается «ресурсом».

Владелец ресурса

КАРТИНКА

Поскольку Jira является «ресурсом», пользователь Jira считается «владельцем ресурса» для запроса аутентификации.

Потребитель

РИСУНОК

Клиентское приложение регистрируется как потребитель, создавая ссылку на приложение (использующую OAuth) в Jira, которая ссылается на клиента.

Обработка

Процесс аутентификации, широко известный как «танец OAuth», работает, заставляя владельца ресурса предоставлять доступ к своей информации на ресурсе, аутентифицируя токен запроса. Этот токен запроса используется потребителем для получения токена доступа из ресурса. После того, как клиент имеет токен доступа, он может использовать его для выполнения аутентифицированных запросов к ресурсу до тех пор, пока токен не истечет или не будет отозван.

Этот процесс показан более подробно на следующей диаграмме.

РИСУНОК

Смотрите это в действии

Прежде чем мы посмотрим на код, давайте посмотрим, как работает процесс аутентификации OAuth. Это будет практическое пошаговое руководство, в котором вы настроите Jira так, чтобы клиент-образец мог аутентифицироваться против него с помощью OAuth. Вы также будете использовать образец клиента для инициирования «танца OAuth», а затем, наконец, выполнить аутентифицированный запрос к API Jira REST.

Прежде чем вы начнете

Чтобы завершить этот учебник, вам нужно знать и делать следующее:

  1. Основные знания о том, как использовать API REST, например, запросы, ответы, заголовки.
  2. Основное понимание Jira.
  3. Если вы хотите запустить пример Java, вам понадобится пример разработки Jira, Maven (3.x) и недавняя версия Java (например, Oracle JDK 1.8).
  4. Если у вас еще нет кода приложения клиента OAuth, клонируйте его здесь: https://bitbucket.org/atlassian_tutorial/atlassian-oauth-examples (в каталоге Java).
  5. После того, как у вас есть код, создайте клиент, выполнив следующую команду в корне проекта:

mvn clean compile assembly:single

  1. Перейдите в  каталог target в проекте и запустите:

java -jar OAuthTutorialClient-1.0.jar requestToken

Игнорировать исключение на выходе. Вам просто нужно сделать это, чтобы сгенерировать файл config.properties, который вы будете использовать позже.

Шаг 1. Настройте клиентское приложение как потребитель OAuth.

В Jira потребители OAuth представлены ссылками на приложения. В ссылках приложения используется OAuth с подписью RSA-SHA1 для аутентификации. Это означает, что для подписи запросов используется закрытый ключ, а не секрет токена тайны / потребителя OAuth. На следующих шагах вы создадите пару общих / закрытых ключей RSA, а затем создайте новую ссылку приложения в Jira, которая использует ключ.

Создание пары открытых и закрытых ключей RSA

  1. В окне терминала запустите следующие команды openssl. Вы можете сделать это в любом месте вашей файловой системы.

openssl genrsa -out jira_privatekey.pem 1024
openssl req -newkey rsa:1024 -x509 -key jira_privatekey.pem -out jira_publickey.cer -days 365
openssl pkcs8 -topk8 -nocrypt -in jira_privatekey.pem -out jira_privatekey.pcks8
openssl x509 -pubkey -noout -in jira_publickey.cer  > jira_publickey.pem

Это генерирует 1024-битный закрытый ключ, создает сертификат X509 и извлекает закрытый ключ (формат PKCS8) в файл jira \ _privatekey.pcks8. Затем он извлекает открытый ключ из сертификата в файл jira \ _publickey.pem.

  1. Скопируйте закрытый ключ из файла jira \ _privatekey.pcks8 в буфер обмена.
  1. Перейдите в  каталог target в образце проекта клиента OAuth. Откройте файл config.properties и внесите следующие изменения:
    1. Вставьте закрытый ключ из вашего буфера обмена по значению поля private_key. Удалите все разрывы строк.
    2. Измените jira_home на URL вашего примера разработки Jira, например https://example-dev1.atlassian.net.
    3. Не меняйте consumer_key, который должен быть установлен на «OauthKey».
  2. Сохраните файл config.properties.

 

Настройка клиентского приложения как потребителя в Jira

  1. В Jira нажмите шестеренка>«Приложения»> «Ссылки приложения».
  2. В поле «Введите URL-адрес приложения, которое хотите связать» введите любой URL-адрес, например http://example.com/, а затем нажмите «Создать новую ссылку».

Вы получите предупреждение о том, что «от введенного вами URL-адреса не получено ответа». Игнорируйте его и нажмите «Продолжить».

  1. На первом экране диалогового окна «Ссылки приложений» введите все, что вы хотите в полях. Однако убедитесь, что вы выбрали флажок «Создать входящую ссылку».

РИСУНОК

В этом примере не имеет значения, что вы вводите для деталей клиентского приложения (URL, имя, тип и т. д.). Это связано с тем, что мы хотим только получать данные из Jira, поэтому нам нужно только настроить одностороннюю (входящую) ссылку от клиента на Jira.

  1. На следующем экране диалогового окна «Ссылки приложений» введите данные потребителя для образца клиента:
  • Consumer key = OauthKey Потребительский ключ = OauthKey
  • Consumer name = Example Jira app Имя потребителя = Пример приложения Jira
  • Public key = Copy the public key Открытый ключ = Скопируйте открытый ключ из созданного ранее файла jira \ _publickey.pem и вставьте его в это поле.

                           РИСУНОК

  1. Нажмите «Продолжить». Вы должны получить ссылку на приложение, которая выглядит так:

РИСУНОК

Это оно! Теперь вы настроили образец-клиента в качестве потребителя OAuth в Jira.

 

Шаг 2. Сделайте «танец OAuth»

«Танец OAuth» - это термин, который используется для описания процесса получения токена доступа из ресурса, который потребитель может использовать для доступа к информации о ресурсе. Это включает в себя «танец», где между потребителем, владельцем ресурса и ресурсом передаются разные токены (см. Обзор OAuth в начале страницы).

  1. В своем терминале перейдите в  каталог target  проекта примера клиента OAuth, если его еще нет.
  2. Выполните следующую команду:

java -jar OAuthTutorialClient-1.0.jar requestToken

Эта команда запрашивает неавторизованный токен запроса из вашего экземпляра Jira.

 

Вы увидите следующий результат с деталями вашего нового токена запроса:


Token:          ec3dj4byySM5ek3XW7gl7f4oc99obAlo
Token Secret:   OhONj0eF7zhXAMKZLbD2Rd3x7Dmxjy0d
Retrieved request token. go to https://jira101.atlassian.net/plugins/servlet/oauth/authorize?oauth_token=ec3dj4byySM5ek3XW7gl7f4oc99obAlo to authorize it

Токен запроса будет сохраняться в течение 10 минут. Если он истечет, вам нужно будет запросить новый.

 

  1. В своем браузере перейдите к URL-адресу, указанному в выводе терминала. Появится следующее диалоговое окно.

РИСУНОК

  1. Нажмите «Разрешить». Это разрешит токен запроса.

В браузере вы увидите следующий результат:


Доступ одобрен
Вы успешно разрешили «Пример JIRA-приложения». Ваш код подтверждения - «qTJkPi». Вам нужно будет
введите этот точный текст при появлении запроса. Вы должны записать это значение до закрытия окна браузера.

Скопируйте код проверки в буфер обмена или где-нибудь еще, где вы можете его получить.

 

  1. В своем терминале запустите следующую команду:

java -jar OAuthTutorialClient-1.0.jar accessToken qTJkPi

Вам нужно будет заменить код проверки примера (qTJkPi) своим собственным кодом подтверждения с предыдущего шага.

В вашем терминале вы увидите следующий вывод:

Access Token:           W1jjOV4sq2iEqxO4ZYZTJVdgbjtKc2ye

Обратите внимание, что для получения токена доступа в OAuth вам необходимо передать ключ потребителя, токен запроса, код проверки и закрытый ключ. Однако в примерее клиента информация, такая как ключ потребителя, токен запроса, закрытый ключ и т. д., сохраняется в файле config.properties при их создании (посмотрите на это, когда вы завершите этот учебник, и вы увидите добавленные новые значения). Вероятно, вы не хотите делать это для производственной реализации, но это упрощает использование примера клиента для этого примера.

Теперь у нас есть то, что мы хотели от танца OAuth: токен доступа, который мы можем использовать, чтобы сделать аутентифицированный запрос к API Jira REST.

Шаг 3. Сделайте аутентифицированный запрос API Jira REST

Код доступа - это все, что нам нужно, чтобы сделать аутентифицированный запрос API Jira REST. Запросы принимаются в качестве пользователя, который разрешил токен первичного запроса. Токен доступа будет сохраняться в течение 5 лет, если он не будет отменен.

  1. Пример клиента OAuth только делает запросы GET. Чтобы использовать его, выполните следующую команду:

java -jar OAuthTutorialClient-1.0.jar request <URL for GET method>

Вам нужно будет подставить <URL for REST method> URL-адресом метода REST, который вы пытаетесь вызвать.

В коде пример клиента OAuth фактически сохраняет код доступа в файле config.properties, когда он получен. Когда запрос выполняется, пример  клиента передает сохраненный код доступа, а не вводит его.

Вот пример запроса к  GET  (ПОЛУЧИТЬ) задачи, используя пример клиента OAuth. Следующая команда получает JJ-2 с помощью Jira REST API:


java -jar OAuthTutorialClient-1.0.jar request http://localhost:8080/rest/api/latest/issue/JJ-2

Вышеупомянутый метод возвращает такую задачу:


{
   "expand": "renderedFields,names,schema,operations,editmeta,changelog,versionedRepresentations",
   "self": "<a href="http://localhost:8080/rest/api/latest/issue/10300">http://localhost:8080/rest/api/latest/issue/10300</a>",
   "id": "10300",
   "fields": {
     "issuetype": {
       "avatarId": 10803,
       "name": "Bug",
       "self": "<a href="http://localhost:8080/rest/api/2/issuetype/1">http://localhost:8080/rest/api/2/issuetype/1</a>",
       "description": "A problem which impairs or prevents the functions of the product.",
       "id": "1",
       "iconUrl": "<a href="http://localhost:8080/secure/viewavatar?size=xsmall&avatarId=10803&avatarType=issuetype">http://localhost:8080/secure/viewavatar?size=xsmall&avatarId=10803&avatarType=issuetype</a>",
       "subtask": false
     },
     "timespent": null,
     "project": {
       "avatarUrls": {
         "48x48": "<a href="http://localhost:8080/secure/projectavatar?pid=10200&avatarId=10700">http://localhost:8080/secure/projectavatar?pid=10200&avatarId=10700</a>",
         "24x24": "<a href="http://localhost:8080/secure/projectavatar?size=small&pid=10200&avatarId=10700">http://localhost:8080/secure/projectavatar?size=small&pid=10200&avatarId=10700</a>",
         "16x16": "<a href="http://localhost:8080/secure/projectavatar?size=xsmall&pid=10200&avatarId=10700">http://localhost:8080/secure/projectavatar?size=xsmall&pid=10200&avatarId=10700</a>",
         "32x32": "<a href="http://localhost:8080/secure/projectavatar?size=medium&pid=10200&avatarId=10700">http://localhost:8080/secure/projectavatar?size=medium&pid=10200&avatarId=10700</a>"
       },
       "name": "JIRA Junior",
       "self": "<a href="http://localhost:8080/rest/api/2/project/10200">http://localhost:8080/rest/api/2/project/10200</a>",
       "id": "10200",
       "key": "JJ"
     },
     "fixVersions": [],
     "aggregatetimespent": null,
     "resolution": null,
     "customfield_10500": null,
     "customfield_10700": "com.atlassian.servicedesk.plugins.approvals.internal.customfield.ApprovalsCFValue@c8d588",
     "resolutiondate": null,
     "workratio": -1,
     "lastViewed": "2016-08-01T11:23:39.481+1000",
     "watches": {
       "self": "<a href="http://localhost:8080/rest/api/2/issue/JJ-2/watchers">http://localhost:8080/rest/api/2/issue/JJ-2/watchers</a>",
       "isWatching": true,
       "watchCount": 1
     },
     "created": "2013-05-29T13:56:24.224+1000",
     "customfield_10020": null,
     "customfield_10021": "Not started",
     "priority": {
       "name": "Major",
       "self": "<a href="http://localhost:8080/rest/api/2/priority/3">http://localhost:8080/rest/api/2/priority/3</a>",
       "iconUrl": "<a href="http://localhost:8080/images/icons/priorities/major.svg">http://localhost:8080/images/icons/priorities/major.svg</a>",
       "id": "3"
     },
     "customfield_10300": null,
     "customfield_10102": null,
     "labels": [],
     "customfield_10016": null,
     "customfield_10017": null,
     "customfield_10018": null,
     "customfield_10019": null,
     "timeestimate": null,
     "aggregatetimeoriginalestimate": null,
     "versions": [],
     "issuelinks": [],
     "assignee": {
       "emailAddress": "alana@<a href="http://example.com">example.com</a>",
       "avatarUrls": {
         "48x48": "<a href="https://secure.gravatar.com/avatar/b259e2a7fd37a83b02015192ee247e96?d=mm&s=48">https://secure.gravatar.com/avatar/b259e2a7fd37a83b02015192ee247e96?d=mm&s=48</a>",
         "24x24": "<a href="https://secure.gravatar.com/avatar/b259e2a7fd37a83b02015192ee247e96?d=mm&s=24">https://secure.gravatar.com/avatar/b259e2a7fd37a83b02015192ee247e96?d=mm&s=24</a>",
         "16x16": "<a href="https://secure.gravatar.com/avatar/b259e2a7fd37a83b02015192ee247e96?d=mm&s=16">https://secure.gravatar.com/avatar/b259e2a7fd37a83b02015192ee247e96?d=mm&s=16</a>",
         "32x32": "<a href="https://secure.gravatar.com/avatar/b259e2a7fd37a83b02015192ee247e96?d=mm&s=32">https://secure.gravatar.com/avatar/b259e2a7fd37a83b02015192ee247e96?d=mm&s=32</a>"
       },
       "displayName": "Alana Example",
       "name": "alana",
       "self": "<a href="http://localhost:8080/rest/api/2/user?username=alana">http://localhost:8080/rest/api/2/user?username=alana</a>",
       "active": true,
       "timeZone": "Australia/Sydney",
       "key": "alana"
     },
     "updated": "2016-08-01T11:23:38.022+1000",
     "status": {
       "name": "Open",
       "self": "<a href="http://localhost:8080/rest/api/2/status/1">http://localhost:8080/rest/api/2/status/1</a>",
       "description": "The issue is open and ready for the assignee to start work on it.",
       "iconUrl": "<a href="http://localhost:8080/images/icons/statuses/open.png">http://localhost:8080/images/icons/statuses/open.png</a>",
       "id": "1",
       "statusCategory": {
         "colorName": "blue-gray",
         "name": "To Do",
         "self": "<a href="http://localhost:8080/rest/api/2/statuscategory/2">http://localhost:8080/rest/api/2/statuscategory/2</a>",
         "id": 2,
         "key": "new"
       }
     },
     "components": [],
     "timeoriginalestimate": null,
     "description": "The logo is currently a light cerise. I'd like to see it with a deep pink color.",
     "customfield_10012": null,
     "customfield_10013": null,
     "customfield_10014": null,
     "timetracking": {},
     "customfield_10015": null,
     "customfield_10600": null,
     "customfield_10006": "10",
     "customfield_10601": null,
     "customfield_10007": [
       "com.atlassian.greenhopper.service.sprint.Sprint@dc6300[id=1,rapidViewId=<null>,state=CLOSED,name=Sprint 1,goal=<null>,startDate=2013-07-26T11:31:09.530+10:00,endDate=2013-08-09T11:31:09.530+10:00,completeDate=2013-07-26T11:31:46.489+10:00,sequence=1]",
       "com.atlassian.greenhopper.service.sprint.Sprint@6b3e17[id=2,rapidViewId=<null>,state=ACTIVE,name=Sprint 2,goal=<null>,startDate=2013-08-22T11:35:33.759+10:00,endDate=2013-12-12T11:35:00.000+11:00,completeDate=<null>,sequence=2]"
     ],
     "customfield_10008": null,
     "attachment": [],
     "aggregatetimeestimate": null,
     "summary": "JIRA Junior logo is not pink enough",
     "creator": {
       "emailAddress": "admin@<a href="http://example.com">example.com</a>",
       "avatarUrls": {
         "48x48": "<a href="https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=48">https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=48</a>",
         "24x24": "<a href="https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=24">https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=24</a>",
         "16x16": "<a href="https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=16">https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=16</a>",
         "32x32": "<a href="https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=32">https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=32</a>"
       },
       "displayName": "Administrator",
       "name": "admin",
       "self": "<a href="http://localhost:8080/rest/api/2/user?username=admin">http://localhost:8080/rest/api/2/user?username=admin</a>",
       "active": true,
       "timeZone": "Australia/Sydney",
       "key": "admin"
     },
     "subtasks": [],
     "reporter": {
       "emailAddress": "admin@<a href="http://example.com">example.com</a>",
       "avatarUrls": {
         "48x48": "<a href="https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=48">https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=48</a>",
         "24x24": "<a href="https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=24">https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=24</a>",
         "16x16": "<a href="https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=16">https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=16</a>",
         "32x32": "<a href="https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=32">https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=32</a>"
       },
       "displayName": "Administrator",
       "name": "admin",
       "self": "<a href="http://localhost:8080/rest/api/2/user?username=admin">http://localhost:8080/rest/api/2/user?username=admin</a>",
       "active": true,
       "timeZone": "Australia/Sydney",
       "key": "admin"
     },
     "customfield_10000": null,
     "aggregateprogress": {
       "total": 0,
       "progress": 0
     },
     "customfield_10001": null,
     "customfield_10200": "0|10001s:",
     "customfield_10002": null,
     "customfield_10003": null,
     "customfield_10400": null,
     "environment": null,
     "duedate": null,
     "progress": {
       "total": 0,
       "progress": 0
     },
     "comment": {
       "total": 1,
       "comments": [{
         "author": {
           "emailAddress": "admin@<a href="http://example.com">example.com</a>",
           "avatarUrls": {
             "48x48": "<a href="https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=48">https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=48</a>",
             "24x24": "<a href="https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=24">https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=24</a>",
             "16x16": "<a href="https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=16">https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=16</a>",
             "32x32": "<a href="https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=32">https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=32</a>"
           },
           "displayName": "Administrator",
           "name": "admin",
           "self": "<a href="http://localhost:8080/rest/api/2/user?username=admin">http://localhost:8080/rest/api/2/user?username=admin</a>",
           "active": true,
           "timeZone": "Australia/Sydney",
           "key": "admin"
         },
         "created": "2013-06-04T16:11:24.505+1000",
         "updateAuthor": {
           "emailAddress": "admin@<a href="http://example.com">example.com</a>",
           "avatarUrls": {
             "48x48": "<a href="https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=48">https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=48</a>",
             "24x24": "<a href="https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=24">https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=24</a>",
             "16x16": "<a href="https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=16">https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=16</a>",
             "32x32": "<a href="https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=32">https://secure.gravatar.com/avatar/4beac5df66a475580809e0?d=mm&s=32</a>"
           },
           "displayName": "Administrator",
           "name": "admin",
           "self": "<a href="http://localhost:8080/rest/api/2/user?username=admin">http://localhost:8080/rest/api/2/user?username=admin</a>",
           "active": true,
           "timeZone": "Australia/Sydney",
           "key": "admin"
         },
         "self": "<a href="http://localhost:8080/rest/api/2/issue/10300/comment/10100">http://localhost:8080/rest/api/2/issue/10300/comment/10100</a>",
         "id": "10100",
         "body": "Hi [~william] JIRA is *super fun* (see JJ-1). Alana is going to fix the logo.",
         "updated": "2013-06-12T21:55:34.882+1000"
       }],
       "maxResults": 1,
       "startAt": 0
     },
     "votes": {
       "hasVoted": false,
       "self": "<a href="http://localhost:8080/rest/api/2/issue/JJ-2/votes">http://localhost:8080/rest/api/2/issue/JJ-2/votes</a>",
       "votes": 0
     }
   },
   "key": "JJ-2"
 }

Поздравления! Теперь вы знаете, как использовать OAuth, чтобы сделать аутентифицированный запрос API Jira REST.

Советы по разработке

Вы можете реализовать OAuth несколькими способами, в зависимости от того, что вы создаете. Тем не менее, мы рекомендуем вам просмотреть исходный код нашего образца Java OAuth-клиента, чтобы получить представление о том, как он реализован, независимо от технологий, которые вы используете.

Кроме того, вы найдете ряд общих советов ниже, которые должны быть полезными, независимо от того, как вы реализуете OAuth.

  • Используйте библиотеки OAuth. Вместо того, чтобы полностью внедрять все, существует ряд библиотек OAuth, которые вы можете использовать в коде на OAuth.net. Образец клиента OAuth использует клиентскую библиотеку Google OAuth для Java.
  • OAuth 2.0 не поддерживается. В настоящее время поддерживается только OAuth 1.0a для аутентификации в Jira REST API.
  • Запросы на токены должны быть сделаны с использованием HTTP POST.
  • Установите обратный вызов на «oob» (то есть вне диапазона) при создании токена запроса, если вы хотите показать секретный токен пользователю. См. GetAndAuthorizeTemporaryToken в JIRAOAuthClient.java в образце клиента OAuth для этого примера. Затем вы можете установить обратный вызов на какой-либо другой URL-адрес после того, как пользователь авторизует токен, чтобы Jira отправил токен и секрет на этот URL-адрес.
  • При выполнении запросов передайте токен доступа OAuth в заголовок запроса, не передавайте его в тело запроса. Если вы передадите данные OAuth в тело запроса, он вернет ошибку «400 Bad Request» для большинства методов. Вы должны передать данные в заголовке вместо этого, например, Authorization: Bearer {access_token}.

Следующие шаги

Прочтите обзор безопасности, чтобы узнать разницу между аутентификацией и авторизацией, а также то, как пользователи авторизованы в Jira.Ознакомьтесь с API Jira REST:

  • API-интерфейс REST для платформы Jira
  • API REST Jira Software Server
  • API REST службы поддержки Jira

 

По материалам Atlassian JIRA  Server Developer OAuth