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 ' );
다음 두 가지 사항을 따르면 사용자 지정 서비스 공급자로부터 애플리케이션을 쉽게 만들 수 있습니다.
커스텀 크리에이터 사용
다음 코드에서 볼 수 있듯이 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 개인 개인 키 인증 방법만 지원합니다.
문서에 나와 있듯이
참고: 이 도구는 사용자 정보(opeid, Unionid 및 별명)를 얻기 위해 제3자 웹사이트에 연결하는 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()
통해 로그인 페이지를 리디렉션하는 모드를 쉽게 선택할 수 있습니다.
$ 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
기본 범위 값입니다.
우리는 공개 계정을 대신하여 제3자 플랫폼 웹 페이지를 승인하는 개방형 플랫폼을 지원합니다.
아래와 같이 구성을 입력하기만 하면 됩니다. 공식 계정에는 승인이 필요하지 않습니다.
. . .
[
' 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 ' ,
]
];
responseType을 설정해야 할 수도 있습니다. withResponseType
함수를 사용하여 설정할 수 있습니다. 기본값은 code
이며 id_token
또는 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 공격은 악의적인 공격자가 사용자를 속여 신뢰할 수 있는 웹 응용 프로그램에서 사용자에게만 권한이 있는 원치 않는 작업을 수행하도록 할 때 발생합니다. 이 모든 작업은 사용자에게 관련되거나 경고하지 않습니다.
다음은 상태를 제공하여 애플리케이션을 더욱 안전하게 만드는 방법에 대한 최소한의 예입니다. 이 예에서는 세션 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 서버는 상태 매개변수를 변경하지 않고 반환합니다. 리디렉션_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 Extension Pack Practical Tutorial - 시작하기부터 릴리스까지"에 주목하시기 바랍니다.
MIT