Socialite は OAuth2 認証ツールです。 これはlaravel/socialiteからインスピレーションを得ており、あらゆるPHPプロジェクトで簡単に使用できます。英語文書
このツールは現在、次のプラットフォームをサポートしています: Facebook、Github、Google、Linkedin、Outlook、QQ、TAPD、Alipay、Taobao、Baidu、DingTalk、Weibo、WeChat、Douyin、Feishu、Lark、Douban、Enterprise WeChat、Tencent Cloud、Line、ジーティー、コーディング。
私のプロジェクトが気に入ってサポートしたい場合は、ここをクリックしてください❤️
PHP >= 8.0.2
composer require " overtrue/socialite " -vvv
ユーザーは、対応する構成変数を作成し、ツールを使用して各プラットフォームの認証アプリケーションを作成するだけで、プラットフォームの access_token とユーザー関連の情報を簡単に取得できます。ツールの実装ロジックの詳細については、各主要プラットフォームの OAuth2 ドキュメントを参照してください。
ツールの使用方法は大きく以下の手順に分かれます。
Laravel ユーザー向けに作成されたより便利な統合パッケージ: overtrue/laravel-socialite
authorize.php
: ユーザーがプラットフォーム認証にジャンプできるようにします
<?php
use Overtrue Socialite SocialiteManager ;
$ config = [
' github ' => [
' client_id ' => ' your-app-id ' ,
' client_secret ' => ' your-app-secret ' ,
' redirect ' => ' http://localhost/socialite/callback.php ' ,
],
];
$ socialite = new SocialiteManager ( $ config );
$ url = $ socialite -> create ( ' github ' )-> redirect ();
return redirect ( $ url );
callback.php
:
<?php
use Overtrue Socialite SocialiteManager ;
$ config = [
' github ' => [
' client_id ' => ' your-app-id ' ,
' client_secret ' => ' your-app-secret ' ,
' redirect ' => ' http://localhost/socialite/callback.php ' ,
],
];
$ socialite = new SocialiteManager ( $ config );
$ code = request ()-> query ( ' code ' );
$ user = $ socialite -> create ( ' github ' )-> userFromCode ( $ code );
$ user -> getId (); // 1472352
$ user -> getNickname (); // "overtrue"
$ user -> getUsername (); // "overtrue"
$ user -> getName (); // "安正超"
$ user -> getEmail (); // "[email protected]"
. . .
これは、各プラットフォームに同じキーと値のペアclient_id
、 client_secret
、 redirect
) を設定することですぐに機能します。
例:
$ config = [
' weibo ' => [
' client_id ' => ' your-app-id ' ,
' client_secret ' => ' your-app-secret ' ,
' redirect ' => ' http://localhost/socialite/callback.php ' ,
],
' facebook ' => [
' client_id ' => ' your-app-id ' ,
' client_secret ' => ' your-app-secret ' ,
' redirect ' => ' http://localhost/socialite/callback.php ' ,
],
];
各プラットフォームには、 foo
などの任意の名前を付けることができます。エイリアス メソッドを使用した後、必要なプログラムを正しく見つける方法をツールキットに指示するために、構成に追加のprovider
キーを設定する必要があります。
$ config = [
// 为 github 应用起别名为 foo
' foo ' => [
' provider ' => ' github ' , // <-- provider name
' client_id ' => ' your-app-id ' ,
' client_secret ' => ' your-app-secret ' ,
' redirect ' => ' http://localhost/socialite/callback.php ' ,
],
// 另外一个名字叫做 bar 的 github 应用
' bar ' => [
' provider ' => ' github ' , // <-- provider name
' client_id ' => ' your-app-id ' ,
' client_secret ' => ' your-app-secret ' ,
' redirect ' => ' http://localhost/socialite/callback.php ' ,
],
//...
];
$ socialite = new SocialiteManager ( $ config );
$ appFoo = $ socialite -> create ( ' foo ' );
$ appBar = $ socialite -> create ( ' bar ' );
次の 2 つの点に従うことで、カスタム サービス プロバイダーからアプリケーションを簡単に作成できます。
カスタムクリエーターを使用する
次のコードに示すように、サービス プロバイダー名は foo アプリケーションに定義されていますが、ツール自体はまだそれをサポートしていないため、作成者のextend()
使用してサービス プロバイダーのインスタンスをクロージャの形式で作成します。関数。
$ config = [
' foo ' => [
' provider ' => ' myprovider ' , // <-- 一个工具还未支持的服务提供程序
' client_id ' => ' your-app-id ' ,
' client_secret ' => ' your-app-secret ' ,
' redirect ' => ' http://localhost/socialite/callback.php ' ,
],
];
$ socialite = new SocialiteManager ( $ config );
$ socialite -> extend ( ' myprovider ' , function ( array $ config ) {
return new MyCustomProvider ( $ config );
});
$ app = $ socialite -> create ( ' foo ' );
重要
? カスタム サービス プロバイダー クラスはOvertrueSocialiteContractsProviderInterface
インターフェイスを実装する必要があります。
class MyCustomProvider implements Overtrue Socialite Contracts ProviderInterface
{
//...
}
次に、ツールがクラスを見つけてインスタンス化できるように、 provider
のクラス名を設定します。
$ config = [
' foo ' => [
' provider ' => MyCustomProvider::class, // <-- 类名
' client_id ' => ' your-app-id ' ,
' client_secret ' => ' your-app-secret ' ,
' redirect ' => ' http://localhost/socialite/callback.php ' ,
],
];
$ socialite = new SocialiteManager ( $ config );
$ app = $ socialite -> create ( ' foo ' );
プラットフォームごとに構成方法が異なります。ツールが正常に動作するようにするには、使用しているプラットフォームの構成が期待どおりに設定されていることを確認してください。
以下のように設定してください
$ config = [
' alipay ' => [
// 这个键名还能像官方文档那样叫做 'app_id'
' client_id ' => ' your-app-id ' ,
// 请根据官方文档,在官方管理后台配置 RSA2
// 注意: 这是你自己的私钥
// 注意: 不允许私钥内容有其他字符
// 建议: 为了保证安全,你可以将文本信息从磁盘文件中读取,而不是在这里明文
' rsa_private_key ' => ' your-rsa-private-key ' ,
// 确保这里的值与你在服务后台绑定的地址值一致
// 这个键名还能像官方文档那样叫做 'redirect_url'
' redirect ' => ' http://localhost/socialite/callback.php ' ,
// 沙箱模式接入地址见 https://opendocs.alipay.com/open/220/105337#%E5%85%B3%E4%BA%8E%E6%B2%99%E7%AE%B1
' sandbox ' => false ,
]
. . .
];
$ socialite = new SocialiteManager ( $ config );
$ user = $ socialite -> create ( ' alipay ' )-> userFromCode ( ' here is auth code ' );
// 详见文档后面 "User interface"
$ user -> getId (); // 1472352
$ user -> getNickname (); // "overtrue"
$ user -> getUsername (); // "overtrue"
$ user -> getName (); // "安正超"
. . .
このツールは現在、RSA2 個人秘密キー認証方式のみをサポートしています。
ドキュメントに示されているように、
注: このツールは、サードパーティの Web サイトに接続してユーザー情報 (opeid、unionid、ニックネーム) を取得するための QR コードのみをサポートします。
$ config = [
' dingtalk ' => [
// or 'app_id'
' client_id ' => ' your app id ' ,
// or 'app_secret'
' client_secret ' => ' your app secret ' ,
// or 'redirect_url'
' redirect ' => ' redirect URL '
]
];
$ socialite = new SocialiteManager ( $ config );
$ user = $ socialite -> create ( ' dingtalk ' )-> userFromCode ( ' here is auth code ' );
// 详见文档后面 "User interface"
$ user -> getId (); // 1472352
$ user -> getNickname (); // "overtrue"
$ user -> getUsername (); // "overtrue"
$ user -> getName (); // "安正超"
. . .
注: Douyin サービスを使用する際、access_token を直接使用してユーザー情報を取得したい場合は、最初に openid を設定してください。 最初に
withOpenId()
呼び出し、次にuserFromToken()
呼び出します
$ config = [
' douyin ' => [
' client_id ' => ' your app id ' ,
' client_secret ' => ' your app secret ' ,
' redirect ' => ' redirect URL '
]
];
$ socialite = new SocialiteManager ( $ config );
$ user = $ socialite -> create ( ' douyin ' )-> userFromCode ( ' here is auth code ' );
$ user = $ socialite -> create ( ' douyin ' )-> withOpenId ( ' openId ' )-> userFromToken ( ' here is the access token ' );
注:
头条
サービスを使用する際、access_token を直接使用してユーザー情報を取得したい場合は、最初に openid を設定してください。 最初にwithOpenId()
呼び出し、次にuserFromToken()
呼び出します
$ config = [
' toutiao ' => [
' client_id ' => ' your app id ' ,
' client_secret ' => ' your app secret ' ,
' redirect ' => ' redirect URL '
]
];
$ socialite = new SocialiteManager ( $ config );
$ user = $ socialite -> create ( ' toutiao ' )-> userFromCode ( ' here is auth code ' );
$ user = $ socialite -> create ( ' toutiao ' )-> withOpenId ( ' openId ' )-> userFromToken ( ' here is the access token ' );
注:
西瓜
サービスを使用する際、access_token を直接使用してユーザー情報を取得したい場合は、最初に openid を設定してください。 最初にwithOpenId()
呼び出し、次にuserFromToken()
呼び出します
$ config = [
' xigua ' => [
' client_id ' => ' your app id ' ,
' client_secret ' => ' your app secret ' ,
' redirect ' => ' redirect URL '
]
];
$ socialite = new SocialiteManager ( $ config );
$ user = $ socialite -> create ( ' xigua ' )-> userFromCode ( ' here is auth code ' );
$ user = $ socialite -> create ( ' xigua ' )-> withOpenId ( ' openId ' )-> userFromToken ( ' here is the access token ' );
他の構成では、使用方法に違いはありません。withDisplay withDisplay()
を使用してログイン ページをリダイレクトするモードを簡単に選択できます。
$ authUrl = $ socialite -> create ( ' baidu ' )-> withDisplay ( ' mobile ' )-> redirect ();
popup
モードは、ツール内のデフォルトの使用モードです。 basic
使用されるデフォルトのスコープ値です。
いくつかの簡単な方法で app_ticket を構成することで、内部アプリケーション モードを使用できます。
$ config = [
' feishu ' => [
// or 'app_id'
' client_id ' => ' your app id ' ,
// or 'app_secret'
' client_secret ' => ' your app secret ' ,
// or 'redirect_url'
' redirect ' => ' redirect URL ' ,
// 如果你想使用使用内部应用的方式获取 app_access_token
// 对这个键设置了 'internal' 值那么你已经开启了内部应用模式
' app_mode ' => ' internal '
]
];
$ socialite = new SocialiteManager ( $ config );
$ feishuDriver = $ socialite -> create ( ' feishu ' );
$ feishuDriver -> withInternalAppMode ()-> userFromCode ( ' here is code ' );
$ feishuDriver -> withDefaultMode ()-> withAppTicket ( ' app_ticket ' )-> userFromCode ( ' here is code ' );
いくつかの簡単な方法で app_ticket を構成することで、内部アプリケーション モードを使用できます。
$ config = [
' lark ' => [
// or 'app_id'
' client_id ' => ' your app id ' ,
// or 'app_secret'
' client_secret ' => ' your app secret ' ,
// or 'redirect_url'
' redirect ' => ' redirect URL ' ,
// 如果你想使用使用内部应用的方式获取 app_access_token
// 对这个键设置了 'internal' 值那么你已经开启了内部应用模式
' app_mode ' => ' internal '
]
];
$ socialite = new SocialiteManager ( $ config );
$ larkDriver = $ socialite -> create ( ' lark ' );
$ larkDriver -> withInternalAppMode ()-> userFromCode ( ' here is code ' );
$ larkDriver -> withDefaultMode ()-> withAppTicket ( ' app_ticket ' )-> userFromCode ( ' here is code ' );
その他の設定は他のプラットフォームと同じで、 withView()
使用して表示するリダイレクト ページのタイプを選択できます。
$ authUrl = $ socialite -> create ( ' taobao ' )-> withView ( ' wap ' )-> redirect ();
web
モードはツールで使用されるデフォルトの表示モードで、 user_info
デフォルトのスコープ値です。
当社は、パブリック アカウントに代わってサードパーティ プラットフォームの Web ページを承認するオープン プラットフォームをサポートしています。
以下のように設定を入力するだけです。公式アカウントは承認を必要としません。
. . .
[
' wechat ' =>
[
' client_id ' => ' client_id ' ,
' client_secret ' => ' client_secret ' ,
' redirect ' => ' redirect-url ' ,
// 开放平台 - 第三方平台所需
' component ' => [
// or 'app_id', 'component_app_id' as key
' id ' => ' component-app-id ' ,
// or 'app_token', 'access_token', 'component_access_token' as key
' token ' => ' component-access-token ' ,
]
]
],
...
さらに、 team_url
チームのドメイン名として構成する必要があります。たとえば、次のようになります。
$ config = [
' coding ' => [
' team_url ' => ' https://{your-team}.coding.net ' ,
' client_id ' => ' your app id ' ,
' client_secret ' => ' your app secret ' ,
' redirect ' => ' redirect URL ' ,
]
];
場合によってはid_token
responseType を設定する必要があります。withResponseType 関数を使用して設定できます。デフォルトはcode
であり、 withResponseType
またはcode
& id_token
https://developer.paypal.com/docs/log-in-with-paypal/integrate/generate-button/
$ config = [
' paypal ' => [
' client_id ' => ' AT****************** ' ,
' client_secret ' => ' EK************** ' ,
' sandbox ' => false ,
' redirect_url ' => " nativexo://paypalpay " ,
],
];
ユーザーをリダイレクトする前に、 scopes()
メソッドを使用してリクエストに「スコープ」を設定することもできます。このメソッドは、既存のスコープをすべて上書きします。
$ response = $ socialite -> create ( ' github ' )
-> scopes ([ ' scope1 ' , ' scope2 ' ])-> redirect ();
「 redirect_uri 」を動的に設定することもできます。次のメソッドを使用してredirect_uri
URL を変更できます。
$ url = ' your callback url. ' ;
$ socialite -> redirect ( $ url );
// or
$ socialite -> withRedirectUrl ( $ url )-> redirect ();
アプリケーションは、ステータス パラメーターを使用して、応答が要求を開始したのと同じユーザーに属することを確認することで、クロスサイト リクエスト フォージェリ (CSFR) 攻撃を防ぐことができます。 CSFR 攻撃は、悪意のある攻撃者がユーザーをだまして、信頼された Web アプリケーション上でそのユーザーのみが実行できる許可を持っている望ましくないアクションを、ユーザーの関与や警告なしに実行させるときに発生します。
ここでは、状態を提供することでアプリケーションの安全性がどのように高まるかを示す最小限の例を示します。この例では、セッション ID を状態パラメータとして使用しますが、状態の値を作成するために任意のロジックを使用できます。
state
パラメータを使用したリダイレクト <?php
session_start ();
$ config = [
//...
];
// Assign to state the hashing of the session ID
$ state = hash ( ' sha256 ' , session_id ());
$ socialite = new SocialiteManager ( $ config );
$ url = $ socialite -> create ( ' github ' )-> withState ( $ state )-> redirect ();
return redirect ( $ url );
state
を確認するユーザーがアプリを承認すると、ユーザーはアプリの redirect_uri にリダイレクトされます。 OAuth サーバーはステータス パラメータを変更せずに返します。 redirect_uri で指定されたステータスがアプリケーションによって生成されたステータスと一致することを確認します。
<?php
session_start ();
$ state = request ()-> query ( ' state ' );
$ code = request ()-> query ( ' code ' );
// Check the state received with current session id
if ( $ state != hash ( ' sha256 ' , session_id ())) {
exit ( ' State does not match! ' );
}
$ user = $ socialite -> create ( ' github ' )-> userFromCode ( $ code );
// authorized
state
パラメータに関するドキュメントをさらに表示する
リクエストにオプションのパラメータを含めるには、設定する値の連想配列を渡してwith()
メソッドを呼び出します。
$ response = $ socialite -> create ( ' google ' )
-> with ([ ' hd ' => ' example.com ' ])-> redirect ();
$ user = $ socialite -> create ( ' github ' )-> userFromCode ( $ code );
{
"id" : 1472352 ,
"nickname" : " overtrue " ,
"name" : "安正超" ,
"email" : " [email protected] " ,
"avatar" : " https://avatars.githubusercontent.com/u/1472352?v=3 " ,
"raw" : {
"login" : " overtrue " ,
"id" : 1472352 ,
"avatar_url" : " https://avatars.githubusercontent.com/u/1472352?v=3 " ,
"gravatar_id" : " " ,
"url" : " https://api.github.com/users/overtrue " ,
"html_url" : " https://github.com/overtrue " ,
...
},
"token_response" : {
"access_token" : " 5b1dc56d64fffbd052359f032716cc4e0a1cb9a0 " ,
"token_type" : " bearer " ,
"scope" : " user:email "
}
}
次のように配列キーとしてユーザー属性を取得できます。
$ user [ ' id ' ]; // 1472352
$ user [ ' nickname ' ]; // "overtrue"
$ user [ ' name ' ]; // "安正超"
$ user [ ' email ' ]; // "[email protected]"
. . .
または、 User
オブジェクトのメソッドを使用します。
mixed $ user -> getId ();
?string $ user -> getNickname ();
?string $ user -> getName ();
?string $ user -> getEmail ();
?string $ user -> getAvatar ();
?string $ user -> getRaw ();
?string $ user -> getAccessToken ();
?string $ user -> getRefreshToken ();
?int $ user -> getExpiresIn ();
?array $ user -> getTokenResponse ();
$user->getRaw()
メソッドは配列を返します。
$user->getTokenResponse()
メソッドは、トークンの取得時に API から返された応答を含む配列を返します。
注: このメソッドは、
userFromCode()
使用する場合にのみ有効な配列を返します。それ以外の場合、userFromToken()
にはトークンの HTTP 応答がないため、 nullが返されます。
$ accessToken = ' xxxxxxxxxxx ' ;
$ user = $ socialite -> userFromToken ( $ accessToken );
PHP 拡張パッケージを最初から構築する方法を知りたいですか?
拡張機能開発の経験を共有する私の実践的なコース「PHP 拡張パック実践チュートリアル - 入門からリリースまで」に注目してください。
マサチューセッツ工科大学