検索
ホームページバックエンド開発PHPチュートリアルOAuth 2.0 を理解する、oauth2.0_PHP チュートリアルを理解する

OAuth 2.0 を理解する、oauth2.0 を理解する

OAuth は認証のためのオープン ネットワーク標準であり、現在のバージョンはバージョン 2.0 です。

この記事は、OAuth 2.0 の設計思想と運用プロセスについて簡潔で一般的な説明を提供します。主な参考資料は RFC 6749 です。

OAuth Logo

1. アプリケーションシナリオ

OAuth がどこに適用されるかを理解するために、仮説的な例を示します。

ユーザーがGoogleに保存した写真を印刷できる「クラウド印刷」Webサイトがあります。このサービスを利用するには、Google に保存されている写真を「クラウド プリント」に読み込ませる必要があります。

OAuth 2.0 を理解する、oauth2.0_PHP チュートリアルを理解する

問題は、Google がユーザーの承認を得た場合にのみ、「クラウド プリント」にこれらの写真の読み取りを許可することです。では、「クラウドプリント」はどのようにしてユーザーの承認を得ているのでしょうか?

従来の方法では、ユーザーは自分の Google ユーザー名とパスワードを「クラウド プリント」に伝え、後者はユーザーの写真を読み取ることができます。このアプローチにはいくつかの重大な欠点があります。

リーリー

OAuth は上記の問題を解決するために生まれました。

2. 名詞の定義

OAuth 2.0 について詳しく説明する前に、いくつかの特別な用語を理解する必要があります。これらは、以下の説明、特にいくつかの図を理解するために非常に重要です。

リーリー

上記の用語を理解すると、OAuth の機能は、「クライアント」が安全かつ制御可能な方法で「ユーザー」の承認を取得し、「サービス プロバイダー」と対話できるようにすることであることを理解するのは難しくありません。

3.OAuthの考え方

OAuth は、「クライアント」と「サービスプロバイダー」の間に認可レイヤーを設定します。 「クライアント」は「サービスプロバイダー」に直接ログインすることはできませんが、ユーザーとクライアントを区別するために認可層にのみログインできます。 「クライアント」が認可レイヤーにログインするために使用するトークンは、ユーザーのパスワードとは異なります。ユーザーはログイン時に認可レイヤートークンの権限範囲と有効期間を指定できます。

「クライアント」が認可レイヤーにログインすると、「サービスプロバイダー」は、トークンの権限範囲と有効期間に基づいて、ユーザーの保存情報を「クライアント」に公開します。

4. 操作プロセス

OAuth 2.0の実行プロセスは以下のとおりです(RFC 6749から抜粋)。

OAuth 2.0 を理解する、oauth2.0_PHP チュートリアルを理解する

リーリー

上記の 6 つのステップのうち、B が鍵であること、つまり、ユーザーがクライアントをどのように承認できるかが重要であることを理解するのは難しくありません。この認可により、クライアントはトークンを取得し、そのトークンに基づいてリソースを取得できます。

以下では、クライアントが認可を取得するための 4 つのモードを 1 つずつ説明します。

5. クライアント認証モード

クライアントはアクセストークンを取得するためにユーザーから認可グラントを取得する必要があります。 OAuth 2.0 では 4 つの認証方法が定義されています。

  • 認証コードモード
  • 簡易モード(暗黙的)
  • パスワードモード (リソース所有者のパスワード認証情報)
  • クライアントモード (クライアント認証情報)

6.認証コードモード

認証コードモードは、最も完全な機能と最も厳格なプロセスを備えた認証モードです。その特徴は、クライアントのバックエンドサーバーを介して「サービスプロバイダー」の認証サーバーと対話することです。

OAuth 2.0 を理解する、oauth2.0_PHP チュートリアルを理解する

手順は次のとおりです:

リーリー

上記の手順に必要なパラメータは次のとおりです。

ステップ A では、クライアントが認証を申請するために使用する URI には次のパラメータが含まれます:

  • response_type: 認可タイプを示します。ここでの値は「code」に固定されています
  • client_id: クライアントのIDを示します。必須のオプションです
  • redirect_uri: リダイレクト URI を表します、オプション
  • scope: 適用される権限の範囲を示します (オプション)
  • state: クライアントの現在の状態を示します。任意の値を指定できます。認証サーバーはこの値を変更せずに返します。

これが例です。

リーリー

ステップ C では、サーバーは次のパラメータを含むクライアントの URI に応答します。

  • code: 認証コードを示します (必須)。コードの有効期間は非常に短くする必要があり、通常は 10 分に設定されます。クライアントはコードを 1 回のみ使用できます。使用しない場合、認証サーバーによって拒否されます。このコードは、クライアント ID およびリダイレクト URI と 1 対 1 に対応します。
  • state: クライアントのリクエストにこのパラメータが含まれている場合、認証サーバーの応答にもこのパラメータが正確に含まれている必要があります。

これが例です。

リーリー

ステップ D では、クライアントは、次のパラメータを含むトークンの HTTP リクエストを認証サーバーに申請します。

  • grant_type: 使用される認可モードを示します。ここでの値は「authorization_code」に固定されます。
  • code: 前のステップで取得した認証コードを示します (必須)。
  • redirect_uri: リダイレクト URI を示します。これは必須であり、ステップ A のパラメーター値と一致している必要があります。
  • client_id: クライアント ID を示します (必須)。

これが例です。

<pre class=" language-http"><code class=" language-http">
POST /token HTTP/1.1
<span class="token keyword">Host: server.example.com
<span class="token keyword">Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
<span class="token keyword">Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb

</span></span></span></code>

E步骤中,认证服务器发送的HTTP回复,包含以下参数:

  • access_token:表示访问令牌,必选项。
  • token_type:表示令牌类型,该值大小写不敏感,必选项,可以是bearer类型或mac类型。
  • expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
  • refresh_token:表示更新令牌,用来获取下一次的访问令牌,可选项。
  • scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。

下面是一个例子。

<pre class=" language-http"><code class=" language-http">
     HTTP/1.1 200 OK
     Content-Type: application/json;charset=UTF-8
     Cache-Control: no-store
     Pragma: no-cache<span class="token application/json">

     <span class="token punctuation">{
       <span class="token string">"access_token"<span class="token punctuation">:<span class="token string">"2YotnFZFEjr1zCsicMWpAA"<span class="token punctuation">,
       <span class="token string">"token_type"<span class="token punctuation">:<span class="token string">"example"<span class="token punctuation">,
       <span class="token string">"expires_in"<span class="token punctuation">:<span class="token number">3600<span class="token punctuation">,
       <span class="token string">"refresh_token"<span class="token punctuation">:<span class="token string">"tGzv3JOkF0XG5Qx2TlKWIA"<span class="token punctuation">,
       <span class="token string">"example_parameter"<span class="token punctuation">:<span class="token string">"example_value"
     <span class="token punctuation">}

</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

从上面代码可以看到,相关参数使用JSON格式发送(Content-Type: application/json)。此外,HTTP头信息中明确指定不得缓存。

七、OAuth 2.0 を理解する、oauth2.0_PHP チュートリアルを理解する

OAuth 2.0 を理解する、oauth2.0_PHP チュートリアルを理解する(implicit grant type)不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤,因此得名。所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。

OAuth 2.0 を理解する、oauth2.0_PHP チュートリアルを理解する

它的步骤如下:

<p>(A)客户端将用户导向认证服务器。</p>
<p>(B)用户决定是否给于客户端授权。</p>
<p>(C)假设用户给予授权,认证服务器将用户导向客户端指定的"重定向URI",并在URI的Hash部分包含了访问令牌。</p>
<p>(D)浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值。</p>
<p>(E)资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌。</p>
<p>(F)浏览器执行上一步获得的脚本,提取出令牌。</p>
<p>(G)浏览器将令牌发给客户端。</p>

下面是上面这些步骤所需要的参数。

A步骤中,客户端发出的HTTP请求,包含以下参数:

  • response_type:表示授权类型,此处的值固定为"token",必选项。
  • client_id:表示客户端的ID,必选项。
  • redirect_uri:表示重定向的URI,可选项。
  • scope:表示权限范围,可选项。
  • state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。

下面是一个例子。

<pre class=" language-http"><code class=" language-http">
    GET /authorize?response_type=token&client_id=s6BhdRkqt3&state=xyz
        &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
    Host: server.example.com

</code>

C步骤中,认证服务器回应客户端的URI,包含以下参数:

  • access_token:表示访问令牌,必选项。
  • token_type:表示令牌类型,该值大小写不敏感,必选项。
  • expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
  • scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。
  • state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。

下面是一个例子。

<pre class=" language-http"><code class=" language-http">
     HTTP/1.1 302 Found
     Location: http://example.com/cb#access_token=2YotnFZFEjr1zCsicMWpAA
               &state=xyz&token_type=example&expires_in=3600

</code>

在上面的例子中,认证服务器用HTTP头信息的Location栏,指定浏览器重定向的网址。注意,在这个网址的Hash部分包含了令牌。

根据上面的D步骤,下一步浏览器会访问Location指定的网址,但是Hash部分不会发送。接下来的E步骤,服务提供商的资源服务器发送过来的代码,会提取出Hash中的令牌。

八、OAuth 2.0 を理解する、oauth2.0_PHP チュートリアルを理解する

OAuth 2.0 を理解する、oauth2.0_PHP チュートリアルを理解する(Resource Owner Password Credentials Grant)中,用户向客户端提供自己的用户名和密码。客户端使用这些信息,向"服务商提供商"索要授权。

在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。这通常用在用户对客户端高度信任的情况下,比如客户端是操作系统的一部分,或者由一个著名公司出品。而认证服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。

OAuth 2.0 を理解する、oauth2.0_PHP チュートリアルを理解する

它的步骤如下:

<p>(A)用户向客户端提供用户名和密码。</p>
<p>(B)客户端将用户名和密码发给认证服务器,向后者请求令牌。</p>
<p>(C)认证服务器确认无误后,向客户端提供访问令牌。</p>

B步骤中,客户端发出的HTTP请求,包含以下参数:

  • grant_type:表示授权类型,此处的值固定为"password",必选项。
  • username:表示用户名,必选项。
  • password:表示用户的密码,必选项。
  • scope:表示权限范围,可选项。

下面是一个例子。

<pre class=" language-http"><code class=" language-http">
     POST /token HTTP/1.1
     Host: server.example.com
     Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
     Content-Type: application/x-www-form-urlencoded

     grant_type=password&username=johndoe&password=A3ddj3w

</code>

C步骤中,认证服务器向客户端发送访问令牌,下面是一个例子。

<pre class=" language-http"><code class=" language-http">
     HTTP/1.1 200 OK
     Content-Type: application/json;charset=UTF-8
     Cache-Control: no-store
     Pragma: no-cache<span class="token application/json">

     <span class="token punctuation">{
       <span class="token string">"access_token"<span class="token punctuation">:<span class="token string">"2YotnFZFEjr1zCsicMWpAA"<span class="token punctuation">,
       <span class="token string">"token_type"<span class="token punctuation">:<span class="token string">"example"<span class="token punctuation">,
       <span class="token string">"expires_in"<span class="token punctuation">:<span class="token number">3600<span class="token punctuation">,
       <span class="token string">"refresh_token"<span class="token punctuation">:<span class="token string">"tGzv3JOkF0XG5Qx2TlKWIA"<span class="token punctuation">,
       <span class="token string">"example_parameter"<span class="token punctuation">:<span class="token string">"example_value"
     <span class="token punctuation">}

</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

上面代码中,各个参数的含义参见《OAuth 2.0 を理解する、oauth2.0_PHP チュートリアルを理解する》一节。

整个过程中,客户端不得保存用户的密码。

九、OAuth 2.0 を理解する、oauth2.0_PHP チュートリアルを理解する

OAuth 2.0 を理解する、oauth2.0_PHP チュートリアルを理解する(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。严格地说,OAuth 2.0 を理解する、oauth2.0_PHP チュートリアルを理解する并不属于OAuth框架所要解决的问题。在这种 模式中,用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实不存在授权问题。

OAuth 2.0 を理解する、oauth2.0_PHP チュートリアルを理解する

它的步骤如下:

<p>(A)客户端向认证服务器进行身份认证,并要求一个访问令牌。</p>
<p>(B)认证服务器确认无误后,向客户端提供访问令牌。</p>

A步骤中,客户端发出的HTTP请求,包含以下参数:

  • granttype:表示授权类型,此处的值固定为"clientcredentials",必选项。
  • scope:表示权限范围,可选项。
<pre class=" language-http"><code class=" language-http">
     POST /token HTTP/1.1
     Host: server.example.com
     Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
     Content-Type: application/x-www-form-urlencoded

     grant_type=client_credentials

</code>

认证服务器必须以某种方式,验证客户端身份。

B步骤中,认证服务器向客户端发送访问令牌,下面是一个例子。

<pre class=" language-http"><code class=" language-http">
     HTTP/1.1 200 OK
     Content-Type: application/json;charset=UTF-8
     Cache-Control: no-store
     Pragma: no-cache<span class="token application/json">

     <span class="token punctuation">{
       <span class="token string">"access_token"<span class="token punctuation">:<span class="token string">"2YotnFZFEjr1zCsicMWpAA"<span class="token punctuation">,
       <span class="token string">"token_type"<span class="token punctuation">:<span class="token string">"example"<span class="token punctuation">,
       <span class="token string">"expires_in"<span class="token punctuation">:<span class="token number">3600<span class="token punctuation">,
       <span class="token string">"example_parameter"<span class="token punctuation">:<span class="token string">"example_value"
     <span class="token punctuation">}

</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>

上面代码中,各个参数的含义参见《OAuth 2.0 を理解する、oauth2.0_PHP チュートリアルを理解する》一节。

十、更新令牌

如果用户访问的时候,客户端的"访问令牌"已经过期,则需要使用"更新令牌"申请一个新的访问令牌。

客户端发出更新令牌的HTTP请求,包含以下参数:

  • granttype:表示使用的授权模式,此处的值固定为"refreshtoken",必选项。
  • refresh_token:表示早前收到的更新令牌,必选项。
  • scope:表示申请的授权范围,不可以超出上一次申请的范围,如果省略该参数,则表示与上一次一致。

下面是一个例子。

<pre class=" language-http"><code class=" language-http">
     POST /token HTTP/1.1
     Host: server.example.com
     Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
     Content-Type: application/x-www-form-urlencoded
     grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA

</code>

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1029364.htmlTechArticle理解OAuth 2.0,理解oauth2.0 OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。 本文对OAuth 2....
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
PHP:サーバー側のスクリプト言語の紹介PHP:サーバー側のスクリプト言語の紹介Apr 16, 2025 am 12:18 AM

PHPは、動的なWeb開発およびサーバー側のアプリケーションに使用されるサーバー側のスクリプト言語です。 1.PHPは、編集を必要とせず、迅速な発展に適した解釈言語です。 2。PHPコードはHTMLに組み込まれているため、Webページの開発が簡単になりました。 3。PHPプロセスサーバー側のロジック、HTML出力を生成し、ユーザーの相互作用とデータ処理をサポートします。 4。PHPは、データベースと対話し、プロセスフォームの送信、サーバー側のタスクを実行できます。

PHPとWeb:その長期的な影響を調査しますPHPとWeb:その長期的な影響を調査しますApr 16, 2025 am 12:17 AM

PHPは過去数十年にわたってネットワークを形成しており、Web開発において重要な役割を果たし続けます。 1)PHPは1994年に発信され、MySQLとのシームレスな統合により、開発者にとって最初の選択肢となっています。 2)コア関数には、動的なコンテンツの生成とデータベースとの統合が含まれ、ウェブサイトをリアルタイムで更新し、パーソナライズされた方法で表示できるようにします。 3)PHPの幅広いアプリケーションとエコシステムは、長期的な影響を促進していますが、バージョンの更新とセキュリティの課題にも直面しています。 4)PHP7のリリースなど、近年のパフォーマンスの改善により、現代の言語と競合できるようになりました。 5)将来的には、PHPはコンテナ化やマイクロサービスなどの新しい課題に対処する必要がありますが、その柔軟性とアクティブなコミュニティにより適応性があります。

なぜPHPを使用するのですか?利点と利点が説明されましたなぜPHPを使用するのですか?利点と利点が説明されましたApr 16, 2025 am 12:16 AM

PHPの中心的な利点には、学習の容易さ、強力なWeb開発サポート、豊富なライブラリとフレームワーク、高性能とスケーラビリティ、クロスプラットフォームの互換性、費用対効果が含まれます。 1)初心者に適した学習と使用が簡単。 2)Webサーバーとの適切な統合および複数のデータベースをサポートします。 3)Laravelなどの強力なフレームワークを持っています。 4)最適化を通じて高性能を達成できます。 5)複数のオペレーティングシステムをサポートします。 6)開発コストを削減するためのオープンソース。

神話を暴く:PHPは本当に死んだ言語ですか?神話を暴く:PHPは本当に死んだ言語ですか?Apr 16, 2025 am 12:15 AM

PHPは死んでいません。 1)PHPコミュニティは、パフォーマンスとセキュリティの問題を積極的に解決し、PHP7.xはパフォーマンスを向上させます。 2)PHPは最新のWeb開発に適しており、大規模なWebサイトで広く使用されています。 3)PHPは学習しやすく、サーバーはうまく機能しますが、タイプシステムは静的言語ほど厳格ではありません。 4)PHPは、コンテンツ管理とeコマースの分野で依然として重要であり、エコシステムは進化し続けています。 5)OpcacheとAPCを介してパフォーマンスを最適化し、OOPと設計パターンを使用してコードの品質を向上させます。

PHP対Pythonの議論:どちらが良いですか?PHP対Pythonの議論:どちらが良いですか?Apr 16, 2025 am 12:03 AM

PHPとPythonには独自の利点と短所があり、選択はプロジェクトの要件に依存します。 1)PHPは、Web開発に適しており、学習しやすく、豊富なコミュニティリソースですが、構文は十分に近代的ではなく、パフォーマンスとセキュリティに注意を払う必要があります。 2)Pythonは、簡潔な構文と学習が簡単なデータサイエンスと機械学習に適していますが、実行速度とメモリ管理にはボトルネックがあります。

PHPの目的:動的なWebサイトの構築PHPの目的:動的なWebサイトの構築Apr 15, 2025 am 12:18 AM

PHPは動的なWebサイトを構築するために使用され、そのコア関数には次のものが含まれます。1。データベースに接続することにより、動的コンテンツを生成し、リアルタイムでWebページを生成します。 2。ユーザーのインタラクションを処理し、提出をフォームし、入力を確認し、操作に応答します。 3.セッションとユーザー認証を管理して、パーソナライズされたエクスペリエンスを提供します。 4.パフォーマンスを最適化し、ベストプラクティスに従って、ウェブサイトの効率とセキュリティを改善します。

PHP:データベースとサーバー側のロジックの処理PHP:データベースとサーバー側のロジックの処理Apr 15, 2025 am 12:15 AM

PHPはMySQLIおよびPDO拡張機能を使用して、データベース操作とサーバー側のロジック処理で対話し、セッション管理などの関数を介してサーバー側のロジックを処理します。 1)MySQLIまたはPDOを使用してデータベースに接続し、SQLクエリを実行します。 2)セッション管理およびその他の機能を通じて、HTTPリクエストとユーザーステータスを処理します。 3)トランザクションを使用して、データベース操作の原子性を確保します。 4)SQLインジェクションを防ぎ、例外処理とデバッグの閉鎖接続を使用します。 5)インデックスとキャッシュを通じてパフォーマンスを最適化し、読みやすいコードを書き、エラー処理を実行します。

PHPでのSQL注入をどのように防止しますか? (準備された声明、PDO)PHPでのSQL注入をどのように防止しますか? (準備された声明、PDO)Apr 15, 2025 am 12:15 AM

PHPで前処理ステートメントとPDOを使用すると、SQL注入攻撃を効果的に防ぐことができます。 1)PDOを使用してデータベースに接続し、エラーモードを設定します。 2)準備方法を使用して前処理ステートメントを作成し、プレースホルダーを使用してデータを渡し、メソッドを実行します。 3)結果のクエリを処理し、コードのセキュリティとパフォーマンスを確保します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール