M2Mシナリオにおけるクライアントクレデンシャルモード|OIDC & OAuth2.0認証プロトコルベストプラクティスシリーズ【4】

前 2 回の記事では、  OIDC 認証コードとそれによって拡張された PKCE モードについて紹介しましたが、今回は、OIDC 認証モードの 1 つである (Client Credentials) モードに焦点を当てます。クライアント (アプリケーション) が独自の名前で OIDC サーバーからアクセス トークン (アクセス トークン) を取得する認証モードで、API または IoT シナリオを保護するためによく使用されます。

[ Authingは、中国で唯一の開発者中心のフルシナリオ ID クラウド製品であり、1000 以上の API とすべての主流言語 SDK を提供し、数十万の開発者によるコミュニティ エコロジーを持っています。

01. クライアントの認証情報

クライアント認証情報モードは、ユーザーの参加なしでサーバー間の認証 (M2M 認証) に使用されます。事前にプログラミング アクセス アカウントを作成し、AK キーと SK キーのペアをリソースの呼び出し元に引き渡す必要があります。ベンダーによってこれの実装方法が異なることに注意してください。たとえば、Okta と Auth0 によるクライアント資格情報の実装は次のとおりです。 use Client ID と Client Secret は呼び出し側に引き渡され、Authing はアプリケーションでプログラミング アクセス アカウントを作成し、AK/SK を呼び出し側に引き渡します。呼び出し側の使用方法に違いはありません。このメソッドは、呼び出し元が管理する複数のメソッドに適しています。

⚠️ クライアント資格情報モードはリフレッシュ トークンをサポートしません。

全体的には次のようなプロセスがあります。

1.リソースの呼び出し元は、認証情報 AK、SK、および要求される権限のスコープを認証承認エンドポイントに送信します。

2.資格情報が正しく、呼び出し元にリソース権限がある場合、Authing はその呼び出し元に対して AccessToken を発行します。

3.呼び出し元は、access_token を保持してリソース サーバーを要求します。

4.リソース サーバーは、トークンが合格したことを確認した後、関連するリソースを返します。

フローチャートは次のとおりです。

1.1 接続の準備をする

1.1.1 アプリケーションを作成し、Authing で設定する

いつものように、最初に Authing でアプリケーションを作成する必要があります。

認証モードの構成

プログラムによるアクセス アカウントを作成し、API 呼び出し元に付与します。

1.1.2 Auhing で権限を定義し、AK SK アカウントを承認する

注: ユーザー認証中、スコープはユーザー情報に対応し、AK/SK が Token を取得する場合、スコープは認可された API 権限に対応する必要があります。

1.1.2.1 スコープ権限の仕様

Authingのスコープ権限項目はスペースで区切られており、各項目の形式は次のようになります。

リソース:リソース識別子:リソース操作

リソース: リソース識別子: リソース操作。

以下は、Authing でサポートされるすべてのスコープ形式です。

1. 意味は、書籍リソース番号 1 の読み取り許可です。

book:1:read

2. 意味はすべての書籍リソースの読み取り許可です

book:*:read

3. 意味はすべての書籍リソースの読み取り許可です

book:read

4. すべての書籍リソースのすべての操作権限を意味します

book:*:*

5. すべての書籍リソースのすべての操作権限を意味します

book:*

6. すべての書籍リソースのすべての操作権限を意味します

book:

7. すべてのリソースのすべての操作権限を意味します

*:*:*

8. すべてのリソースのすべての操作権限を意味します

*:*

9. すべてのリソースのすべての操作権限を意味します

*

1.1.2.2 認証権限管理で関連リソースを定義する

book リソースを定義します。

1.1.2.3 プログラムによるアクセス アカウントの承認

ここでは、作成したばかりのプログラミング アクセス アカウントの呼び出し元 A を承認し、呼び出し元 A が GET リクエストで /book API にアクセスできるようにし、ID 20150 の注文のみを取得できるようにします。

1.2 アクセステスト

1.2.1 必要な呼び出しインターフェイスのリスト

POST${host}/oidc/token 获取 Token
POST${host}/oidc/token/introspection 校验 Token
POST${host}/oidc/revocation 吊销 Token

1.2.2 Postman での実行

以下に紹介するインターフェイスは、オンラインの郵便配達員コレクションを通じて fork によって体験できます。

https://app.getpostman。com/run-collection/24730905-5d29e488-719e-4ffe-af21-a7c18298d328?action=collection%2Ffork&collection-url=entityId%3D24730905-5d29e488-719e-4ffe-af21-a7c18298d328%26entityType%3Dcollection %26ワークスペースID%3D13ff793c-024c- 459d-b1f6-87e91c4769ed#?env%5BAuthing%20OIDC%5D=I6dHJ1ZSwidHlwZSI6ImRlZmF1bHQifV0=

1.2.3 トークンの取得

POST${host}/oidc/token

ユーザーが Authing 側でログイン操作を完了すると、Authing は生成されたコードをパラメータとして redirect_uri アドレスにコールバックします。このとき、対応するアクセス トークン access_token は code-for-token インターフェイスを通じて取得できます。

リクエストの例:

curl --location 'https://{host}/oidc/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id={AccessKey}' \
--data-urlencode 'client_secret={SecretKey}' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'scope=book:20150:GET book:20150:POST' 

応答例 (成功) :

{
"access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Il9xcEhRQXFvbXd0Z3BKX2xZVHNtN2FMVEU3YUtJb0tQeFN5by1faDdGUVkifQ.eyJhenAiOiI2M2Y0ODA5OTlkNGY0MDRiZTViNDQ0NGEiLCJhdWQiOiI2M2Y0ODI1ZDhhNWRmNjYyNTU4YjI4MTQiLCJzY29wZSI6ImJvb2s6MjAxNTA6R0VUIiwiaWF0IjoxNjgxNzExNDU2LCJleHAiOjE2ODE3MTIwNTYsImp0aSI6IlBiSks5djNFTS1rS1o3bms4VmdBRms3eVVPRzJES2NwYUQ2M2gxaThmVlkiLCJpc3MiOiJodHRwczovL29pZGMtY2xpZW50LWNyZWRlbnRpYWxzLmF1dGhpbmcuY24vb2lkYyJ9.qPcJU84C9Ztjm5dk-im8ntatPaB5P8j3ZPdW1eoi-V5po8k32jexUemSEHInEfqdxcnY7OyR1pph6JVjehmoCAX6gqA_3fv20hUjnWQNqcZegAiNea4jQbLKlMsYnTQhhJWmzhs64LwCJD1RqQy0VtoL2ZVVfAEpySHWL6TwWVz0AkvQpZbzkF6FRCa03rli_jc1BNtpGUhvNdtGs6xJMMLJZ31dptrLlSSWSQ71t05fqBfEiToN6-JkwKXJedpHBvFWt_-XncQbksdQQc6krTcgaWkrIbv6LblTrtAifXLfOsANweOAG8QoKLh55vSMMBXdzdw-IzXeCDuwQT5P2w",
"token_type":"Bearer",
"expires_in":600,
"scope":"book:20150:GET",
"rejected_scope":"book:20150:POST"
} 

ここで、scope はアクセス アカウントによるアクセスを許可するリソース、rejected_scope は申請したが拒否された権限です。呼び出し元 A に book:20150:GET の権限を割り当てただけなので、book をリクエストします。 20150: GET および book:20150:POST 権限を同時に持つ場合、book:20150:POST 権限は拒否され、呼び出し元は access_token を取得した後、そのトークンを使用して保護された API を呼び出すことができます。

応答例 (失敗) :

{
"error": "server_error",
"error_description": "编程访问账号不存在!"
} 

1.2.4 トークンの検証

POST${host}/oidc/token/introspection

API サーバーはインターフェイス呼び出しリクエストを受信した後、このインターフェイスを呼び出して、access_token の有効性と、対応する API を呼び出す権限があるかどうかを確認できます。

このエンドポイントは、access_token、id_token、refresh_token を受け入れ、アクティブかどうかを示すブール値を返します。トークンがアクティブな場合、トークンに関する追加データも返されます。トークンが無効、期限切れ、または取り消されている場合、トークンは非アクティブであるとみなされます。

access_token は、RS256 署名アルゴリズムまたは HS256 署名アルゴリズムを使用して署名できます。2 つの署名アルゴリズムの違いは次のとおりです。

RS256 は 、RSA アルゴリズムを使用したデジタル署名アルゴリズムであり、公開キーと秘密キーのペアを使用して情報を暗号化し、検証します。RS256 署名で生成されたトークンは、RSA キー ペアで署名するとより高いレベルの保護が提供されるため、HS256 署名で生成されたトークンよりも安全です。RS256 署名アルゴリズムを使用するトークンは、JWK エンドポイントを通じて取得できる公開キーを使用して検証できます。

HS256 は、対称鍵を使用するデジタル署名アルゴリズムです。署名と検証に同じキーを使用します。HS256 署名アルゴリズムは、署名と検証に RSA 公開鍵/秘密鍵ペアの代わりに対称鍵を使用するため、RS256 署名アルゴリズムよりもパフォーマンスが高速です。HS256 署名アルゴリズムを使用するトークンは、共有シークレット (アプリケーション キー) によって検証できます。

実際のアプリケーションでは、RS256 アルゴリズムの方が安全ですが、より多くのリソースを消費します。システムが高いパフォーマンスを必要とする場合は、HS256 署名アルゴリズムを選択できます。オンライン認証:

リクエストパラメータ:

リクエストの例:

curl --location --request POST 'https://{host}/oidc/token/introspection' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id={应用ID}' \
--data-urlencode 'client_secret={应用密钥}' \
--data-urlencode 'token={ token }' \
--data-urlencode 'token_type_hint=access_token' 

検証の access_token 応答例 (検証が成功した場合)

{
"active": true,
"aud": "63f4825d8a5df662558b2814",
"client_id": "63f480999d4f404be5b4444a",
"exp": 1681713127,
"iat": 1681712527,
"iss": "https://oidc-client-credentials.authing.cn/oidc",
"jti": "EpveFqLsgskNIre8fK-h0AOK6oBIfZH6erT5iSrRKmd",
"scope": "book:20150:GET",
"token_type": "Bearer"
} 

検証の access_token 応答の例 (検証失敗):

{
"active": false
} 

1.2.5 トークンの引き出し

POST${host}/oidc/token/revocation

API サービスは、このインターフェイスを通じて呼び出し元の access_token を取り消すことができます。

リクエストパラメータ:

リクエストの例:

curl --location --request POST 'https://{host}/oidc/token/revocation' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id={应用ID}' \
--data-urlencode 'client_secret={应用密钥}' \
--data-urlencode 'token= {token}' \
--data-urlencode 'token_type_hint=access_token' 

応答例 (成功) :

HTTP 200 OK

応答例 (失敗) :

{
"error": "xxxx","error_description": "xxxx"
} 

02. この章の概要

この章では、API を保護するためのクライアント認証情報モードの使用について紹介し、これまで、OIDC の一般的に使用される認証モードを紹介しました。

[Authing は、中国で唯一の開発者中心のフルシナリオ ID クラウド製品であり、1000 を超える API とすべての主流言語 SDK を提供し、数十万の開発者のコ​​ミュニティ エコロジーを備えています。

以下は、OIDC および OAuth2.0 認証プロトコルのベスト プラクティス シリーズの記事のカタログです。原文を表示するには、リンクをクリックしてください。

OIDC & OAuth2.0プロトコルとその認可モードを詳しく解説|認証プロトコルベストプラクティスシリーズ[1]

OIDC & OAuth2.0 認可コードモード アクセス認証|認証プロトコルベストプラクティスシリーズ【2】

2023-04-27 11:45に編集

おすすめ

転載: blog.csdn.net/Authing/article/details/130403476