предисловие
Обычно, чтобы понять концепцию, нам нужно усвоить десять понятий. в сужденииJWT(JsonWebToken)
Можно ли заменитьsession
Прежде чем управлять, мы должны понять, чтоtoken
,а такжеaccess token
иrefresh token
разница.
понять что такоеOAuth
,чтоSSO
,SSO
разные стратегииOAuth
иSAML
разница, иOAuth
иOpenID
отличие, а главное, отличиеauthorisation
иauthentication
.
Наконец мы выводимJSON WEB TOKEN
, чатJWT
существуетSession
Управляйте сильными и слабыми сторонами и одновременно попытайтесь устранить эти недостатки и посмотрите, каковы затраты и издержки.
текст
Эта статья оOAuth
РазрешитьиAPI
Вызов экземпляров все изGoogle API
.
О токене
Token
Даже в компьютерной сфере есть разные определения, здесь мы говоримtoken
,Относится кдоступ к ресурсамреквизиты для входа. Например, когда вы звонитеGoogle API
, вам необходимо предъявить действительныйtoken
чтобы указать, что вы запросилизаконность. этоToken
даGoogle
для вас это представляетGoogle
для тебяРазрешитьпозволяет вам получить доступAPI
Позадиресурс.
проситьAPI
при переноскеtoken
Есть также много способов, черезHTTP Header
илиurl
параметр илиgoogle
Предоставленная библиотека классов может:
- HTTP Header
GET /drive/v2/files HTTP/1.1
Authorization: Bearer <token>
Host: www.googleapis.com/
- URL-параметры
GET https://www.googleapis.com/drive/v2/files?token=<token>
- Библиотека функций Python
from googleapiclient.discovery import build
drive = build('drive', 'v2', credentials=credentials)
В частности, приведенное выше используется для вызоваAPI
изtoken
, которые мы называем разделенными наaccess token
. как правилоaccess token
Там естьСрок годности, еслиИстекшийнужноПолучить. Так как же вернуть? Взгляните на первое приобретениеtoken
Как выглядит процесс:
-
Сначала нужно
Google API
Подпишитесь на приложение, и вы получите его после регистрацииИнформация о сертификации(credentials
)включаютID
иsecret
. Не все типы программ имеютsecret
. -
следующий за
Google
проситьaccess token
. Не обращайте внимания на некоторые детали здесь, такие как параметры запроса (конечно, вам нужно подать заявку на вышеsecret
). Важно, если то, к чему вы хотите получить доступ,Пользовательские ресурсы, пользователю будет напомненоРазрешить. -
еслиАвторизация пользователяполный.
Google
вернусьaccess token
. или вернутьсяКод авторизации(authorization code
), а затем получить кодaccess token
.
token
После того, как вы его получите, вы можете взять его с собойtoken
доступAPI
.
Процесс показан на рисунке ниже:
Примечание: Пройдено на третьем шаге
authorization code
обменaccess token
в процессе,access token
, также вернет дополнительную информацию, связанную с последующими обновлениями.refresh token
.
однаждыaccess token
истек срок, вы можете пройтиrefresh token
запросить сноваaccess token
.
Вышеупомянутое является лишь грубым изложением, и некоторые дополнительные понятия намеренно опущены. например, обновлениеaccess token
Конечно, вам не нужноrefresh token
, это зависит от вашегометод запросаи доступныйТип ресурсаЗависит от.
Здесь возникают еще две проблемы:
-
если
refesh token
А если он еще и просрочен? В это время пользователям необходимоПовторная авторизация. -
Зачем различать
refresh token
иaccess token
? Если объединить в одинtoken
тогда поставьДата истечения срока годностискорректированныйдольше, и каждый разнедействителенпользователь послеПовторная авторизацияДостаточно? Этот вопрос будет связан с соответствующими понятиями, обсуждаемыми позже, которые будут объяснены позже.
OAuth 2.0
Получить отtoken
использоватьtoken
интерфейс доступа. Это на самом деле стандартOAuth2.0
доступ под механизмAPI
процесс. Вот введениеOAuth
Внутренние и внешние связанные концепции, более глубокое пониманиеtoken
эффект.
SSO (Single sign-on)
Обычно внутри компании есть много платформ для всех, таких как управление персоналом, управление кодом, мониторинг журналов, приложение бюджета и так далее. Если на каждой платформе будет реализована собственная пользовательская система, это, несомненно, будет огромным расточительством, поэтому у компании будет наборобщедоступная пользовательская система, пока пользователи входят в систему, они могутдоступ ко всем системам. Этовойти.
SSO
это классрешениеЧто касается конкретной реализации, у нас есть две стратегии на выбор:
-
SAML 2.0
-
OAuth 2.0
Далее мы различаем этоДва способа авторизациикакая разница. но описываяразные стратегииПеред этим поговорим о несколькихобщие характеристики, и довольно важное понятие.
Authentication VS Authorisation
-
Authentication:Идентификация, именуемая в дальнейшемСертификация;
-
Authorisation:доступ к ресурсамРазрешить.
Сертификациярольпризнанныйвы можете получить доступ к системе дляАутентификация посетителейтак или иначезаконный пользователь;иРазрешитьиспользуется, чтобы решить, что у вас есть доступкакие ресурсы имеют разрешения.
Большинство людей не видят разницы между ними, потому что они на стороне пользователя. Для системного разработчика есть разница между ними, которые представляют собой две разные должностные обязанности. нам может просто понадобитьсяФункция аутентификации, вместо необходимостиФункция авторизации, вам даже не нужно реализовывать это самостоятельноФункция аутентификации. с помощьюGoogle
систему аутентификации, т.е. пользователи могут использоватьGoogle
аккаунт для входа.
Authorization Server/Identity Provider(IdP)
поставить во главесертифицированный сервисназываетсяAuthorizationServer
илиIdentityProvider
, именуемый в дальнейшемIDP
.
Service Provider(SP)/Resource Server
поставить во главепредоставить ресурсы(API
вызов) служба вызываетсяResourceServer
илиServiceProvider
, именуемый в дальнейшемSP
.
SAML 2.0
На картинке нижеSAML2.0
Блок-схема, посмотрите на картинку, чтобы говорить:
-
Такжене вошелПользовательОткрыть браузерзайти на ваш сайт(
SP
),Веб-сайтПредоставлять услугино нетНе несет ответственности за аутентификацию пользователей. -
тогда
SP
В направленииIDP
отправилSAML
запрос аутентификации, в то время какSP
будетПользовательский браузерперенаправить наIDP
. -
IDP
После проверки отSP
изЗапрос правильныйПосле этого рендерить в браузереформа входаПозвольте пользователю заполнитьимя пользователяипарольчтобы залогиниться. -
После того, как пользователь успешно войдет в систему,
IDP
будет генерировать содержащийИнформация о пользователе(имя пользователяилипароль)изSAML token
(SAML token
Также известен какSAML Assertion
,По сутиXML
узел).IDP
В направленииSP
возвращениеtoken
, и воляПеренаправление пользователяприбытьSP
(token
Возврат вШаги перенаправления, о чем будет подробно рассказано ниже). -
SP
правильно получилtoken
Подтвердить и проанализировать егоИнформация о пользователе,Напримеркто пользовательа такжеразрешения пользователяЧто. На основании этой информации пользователям может быть разрешен доступ к содержимому нашего веб-сайта.
когда пользовательIDP
После успешного входа,IDP
пользователь долженперенаправить сноваприбытьSP
сайт, обычно есть два способа сделать этот шаг:
-
HTTP
Перенаправление: это не рекомендуется, потому чтоперенаправитьизURL
длинаограниченное, не может нести более длинную информацию, такую какSAML Token
. -
HTTP POST
Запрос: это более традиционный подход.После того, как пользователь входит в систему, отображается форма, и пользователь нажимаетSP
ОтправитьPOST
просить. В качестве альтернативы вы можете использоватьJavaScript
В направленииSP
выпуститьPOST
просить.
Если ваше приложение основано наWeb
, то с вышеописанной схемой проблем нет. Но если вы разработаетеiOS
илиAndroid
, то возникает проблема:
-
пользователь в
iPhone
открыть приложение наIDP
Аутентифицировать. -
приложение перейти к
Safari
Браузер, после завершения аутентификации входа, должен пройтиHTTP POST
будет в видеtoken
вернуться кмобильное приложение.
Несмотря на то чтоPOST
изurl
Можетоткрыть приложение,номобильное приложениене удалось разобратьPOST
, мы не сможем прочитатьSAML Token
.
Конечно, есть способы, например
IDP
этап авторизациине лезь в системуSafari
браузер, вв линиюизWebview
в решении, пытаясь найти способы получить отWebview
извлечь изtoken
или используйтепрокси-сервер.
так или иначе,SAML 2.0
иНепригодныйв настоящее времяКроссплатформенностьсцена, которая также может иметь какое-то отношение к возрасту2005
лет, в тот моментHTTP POST
Это действительно лучший вариант.
OAuth 2.0
Давайте кратко разберемсяSSO
внизOAuth2.0
процесс.
-
пользователь черезклиент(возможнобраузертак же может бытьмобильное приложение) хотите получить доступ
SP
ресурсы на , ноSP
скажите пользователю, чтоСертификация, ПользовательперенаправитькIDP
. -
IDP
В направленииПользовательпроситьSP
Можно ли получить доступИнформация о пользователе. Если пользователь согласен,IDP
В направленииклиентвозвращениеauthorization code
. -
Клиент получает
authorization code
В направленииIDP
обменaccess token
, и возьмиaccess token
В направленииSP
Запросить ресурсы. -
SP
После принятия запроса возьмите прикрепленныйtoken
В направленииIDP
проверятьличность пользователя. Убедившись, что личность верна,SP
В направленииклиентРаспространяйте соответствующие ресурсы.
ТакOAuth
как избежатьSAML
в процессене удалось разобрать POST
Что можно сказать о содержании информации?
-
С одной стороны, пользователь
IDP
возвращениеклиентпути, также черезURL
перенаправить сюдаURL
позволятьнастроитьschema
, так что даже еслимобильный телефонтакже можетоткрыть приложение; -
С другой стороны, потому что
IDP
В направленииклиентпрошлоauthorization code
, вместоXML
информация, поэтомуcode
можно легко прикрепить кперенаправитьURL
передача дальше.
но вышеSSO
Процесс не отражаетOAuth
намерение.OAuth
намерениеприложениепозволятьдругое приложениесуществуетАвторизация пользователяв случаеполучить доступ к своим данным.
OAuth
Дизайнерский замысел более склонен кАвторизация вместо аутентификации(Конечно, авторизация пользовательской информации косвенно обеспечивает аутентификацию), хотяGoogle
изOAuth 2.0 API
Также поддерживаетРазрешитьиСертификация. Итак, вы используетеFacebook
илиGmail
Когда учетная запись входит на сторонний сайт, она появитсяДиалог авторизации,Сказать тебесторонний сайтДоступ к вашей информации требует вашего согласия.
наверхуSSO
изOAuth
В процессе задействованы три роли:SP
, IDP
а такжеClient
. но на практикеClient
может не существовать, например, вы пишетесерверная программатайм-пассGoogle API
отYoutube
Извлеките последние данные программы, затемсерверная программанужно получитьYoutube
изOAuth
РазрешитьВот и все.
OAuth VS OpenId
Если вы обратите внимание, вы увидите на некоторых сайтах, чтоOpenID
способ войти в систему, на самом деле, заключается в использованииFacebook
счет илиGoogle
Сайт входа в аккаунт:
OpenID
иOAuth
Так же, как. Но по сути это две совершенно разные вещи:
-
OpenID:только дляАутентификация(
Authentication
), что позволяет использоватьтот же аккаунтсуществуетВход на несколько веб-сайтов. это только для тебяюридическое лицоодобрение, когда вы начинаете сFacebook
После входа учетной записи на сайт сайтнет доступаты вFacebook
Вверхданные. -
OAuth:используется дляРазрешить(
Authorisation
),позволятьуполномоченная сторонадоступуполномоченная сторонаизДанные пользователя.
Refresh Token
Теперь, чтобы ответить на поставленный выше вопрос, зачем нам нужноrefresh token
?
Такая обработка предназначена дляразделение обязанностей:
-
refresh token:ответственныйАутентификация;
-
access token:ответственныйзапросить ресурс.
Несмотря на то чтоrefresh token
иaccess token
все поIDP
выпущено, ноaccess token
также сSP
провестиобмен данными,еслипубличные словаТам будетутечка личных данныхвозможный. иIDP
иSP
может бытьполностью отличаетсяизпредоставление услугиз. В вышеизложенном причина, по которой у нас нет таких опасений, заключается в том, чтоIDP
иSP
обаGoogle
.
JWT
Предварительное понимание
По сутиJWT
Слишкомtoken
, как мы уже упоминали выше, этодоступ к ресурсамизсертификат.
Google
Некоторые изAPI
Такие какPrediction API
илиGoogle Cloud Storage
, не требуетсядоступпользователиличные данныеиз. так что не надо проходитьАвторизация пользователяНа этом шаге приложение может получить прямой доступ. как вышеOAuth
Нет вClient
Процесс без участия аналогичен. это использоватьJWT
После завершения визита конкретный процесс выглядит следующим образом:
-
Сначала вам нужно
Google API
Создайте учетную запись службы на (service account
). -
Получатьсервисный аккаунтизИнформация о сертификации(
credential
),включаютадрес электронной почты,client ID
, и параоткрытый/закрытый ключ. -
использовать
Client ID
изакрытый ключСоздайподписатьизJWT
, затем поместите этоJWT
ОтправитьGoogle
обменaccess token
. -
Google
возвращениеaccess token
. -
программа прошла
access token
доступAPI
.
Вам даже не нужноGoogle
спроситьaccess token
, но нестиJWT
в видеHTTP header
внутреннийbearer token
прямое интервьюAPI
это тоже хорошо. этоJWT
величайшее очарование.
рациональное знание
JWT
Как следует из названия, этоJSON
структурныйtoken
, состоит из трех частей:
-
header
-
payload
-
signature
header
header
используется для описанияметаинформация, например, для производстваsignature
Алгоритм:
{
"typ": "JWT",
"alg": "HS256"
}
вalg
Ключевое слово указывает, какой из них использоватьхеш-алгоритмсоздаватьsignature
.
payload
payload
для выполнения вашего желанияпройти на серверИнформация. Вы можете либо добавитьофициальное поле,Например:iss(Issuer)
, sub(Subject)
, exp(Expirationtime)
, также можно подключитьНастраиваемые поля,НапримерuserId
:
{
"userId": "b08f86af-35da-48f2-8fab-cef3904660bd"
}
signature
signature
перевести какподписать, для создания подписи необходимо выполнить следующие шаги:
-
отсервер интерфейсаполучитьключ, при условии, что
secret
. -
правильно
header
провестиbase64
кодирование, предполагая, что результатheaderStr
. -
будет
payload
провестиbase64
кодирование, предполагая, что результатpayloadStr
. -
будет
headerStr
иpayloadStr
использовать.
персонажсобраны в символыdata
. -
от
data
иsecret
В качестве параметра используйтехеш-алгоритмРассчитатьподписать.
Если приведенное выше описание не интуитивно понятно, используйтеПоддельный кодЭто значит:
// Signature algorithm
data = base64urlEncode( header ) + “.” + base64urlEncode( payload )
signature = Hash( data, secret );
Предположим, наш оригиналJSON
Структура такая:
// Header
{
"typ": "JWT",
"alg": "HS256"
}
// Payload
{
"userId": "b08f86af-35da-48f2-8fab-cef3904660bd"
}
еслиключэто строкаsecret
затем в конце концовJWT
Результат таков:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM
допустимый
jwt.io
начальствопроверятьэтот результат.
Что именно дает JWT
обеспечить целостность данных
JWT
цель не в томСпрятатьиликонфиденциальные данные, но чтобы убедиться, чтоданныедействительно изавторизованная личностьсоздан для предотвращенияФальсификация на полпути.
Вспомните, когда вы получилиJWT
когда можно обойтись безsecret
расшифровывается в случаеheader
иpayload
,так какheader
иpayload
только что прошелbase64
кодирование(encode
), целью кодирования являетсяОблегчение передачи структур данных.
Хотя созданиеsignature
Процесс примерношифрование (encrypt
), но суть на самом делеподписать (sign
) поведение, для гарантиицелостность данных, на самом деле и такжеДанные не зашифрованы.
для интерфейсных вызовов
следующий вAPI
можно прикрепить к звонкуJWT
(обычно вHTTP Header
середина). Также из-заSP
встреча и программаобщийОдинsecret
,такпрограммав состоянии пройтиheader
при условии того жеhash
алгоритм дляПодтвердить подписьПравильно ли, чтобы определить, имеет ли приложение право вызыватьAPI
.
Сеанс разговора с отслеживанием состояния
так какHTTP
данет статуса, такклиентиСерверПроблема, которую необходимо решить, заключается в том, как сделать диалог между ними с сохранением состояния. Только для примерастатус входаизПользовательиметь разрешение только на вызов определенных интерфейсов, то вЛогин пользователяПосле этого нужно помнить, что пользовательзалогинилсястатус. Распространенный подход заключается в использованииsession
механизм.
Общийsession
Модель работает так:
-
пользователь в браузереавторизоватьсяПосле этого сервер генерирует для пользователяТолькоиз
session id
, сохранить вСерверизслужба хранения(НапримерMySQL
,Redis
)середина. -
Должен
session id
Также в то же времявернуться в браузер,отSESSION_ID
заKEY
хранится в браузереcookie
середина. -
Если пользователь снова посещает сайт,
cookie
внутреннийSESSION_ID
последуетпроситьотправить вместеСервер. -
Сервер судит
SESSION_ID
Это уже вRedis
определить, находится ли пользователь встатус входа.
Я полагаю, вы заметили, теоретически говоря,JWT
механизм может заменитьsession
механизм. Пользователю не нужно входить в систему заранее, равно как и серверная частьRedis
Запишите данные для входа пользователя. Местный клиент сохранить юридическийJWT
, когда пользователю нужно вызвать интерфейс, прикрепите юридическийJWT
, каждый раз, когда вызывается интерфейс, серверная часть используетJWT
сделать один разПроверка легитимности. Это также косвенно достигаетсяАвторизованный пользовательцель.
тем не мениеJWT
действительно заменитьsession
механизм? Каковы преимущества и недостатки этого? Эти вопросы будут рассмотрены в следующей статье.
Добро пожаловать в технический публичный аккаунт: Zero One Technology Stack
Эта учетная запись будет продолжать делиться сухими товарами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.