Laravel Socialite Gitlab 401
Laravel Socialite Gitlab 401
我有一个本地项目,我想在其中使用我的 gitlab 凭据登录。
我为此使用 Laravel Socialite 并将 socialiteproviders/gitlab 包下载到我的项目中。
在gitlab.mycompany.be中,我创建了一个application key,一个secret key和uri如下:
http://react.test/login
http://react.test/login/gitlab/callback
我已经包括了供应商:
'gitlab' => [
'client_id' => env('GITLAB_KEY'),
'client_secret' => env('GITLAB_SECRET'),
'redirect' => env('GITLAB_REDIRECT_URI'),
'instance_uri' => env('GITLAB_BASE_URL'),
],
我的 LoginController 看起来像这样:
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/home';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
public function redirectToProvider()
{
return Socialite::driver('gitlab')->redirect();
}
public function handleProviderCallback()
{
$user = Socialite::driver('GitLab')->user();
$accessTokenResponseBody = $user->accessTokenResponseBody;
// $user->token;
}
我的路线:
Route::get('/', function () {
return view('welcome');
});
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
Route::resource('tasks', "TaskController");
Route::get('login', 'Auth\LoginController@redirectToProvider');
Route::get('login/gitlab/callback', 'Auth\LoginController@handleProviderCallback');
我的 .env 是什么样的:
GITLAB_TOKEN=***
GITLAB_KEY=***
GITLAB_SECRET=***
GITLAB_REDIRECT_URI=http://react.test/login/gitlab/callback
GITLAB_BASE_URL=http://gitlab.mycompany.be/
GITLAB_METHOD=token
GITLAB_HOST="http://gitlab.mycompany.be/"
我可以从 gitlab.mycompany.be 使用我的帐户登录,但在重定向后我收到以下消息:
GuzzleHttp \ Exception \ ClientException (401)
Client error: POST https://gitlab.com/oauth/token
resulted in a 401 Unauthorized
response: {"error":"invalid_client","error_description":"Client authentication failed due to unknown client, no client authenticat (truncated...)
为什么 guzzle 返回 401 未经授权?
我为可能感兴趣的其他人找到了我自己的问题的解决方案:
我改了:
public function redirectToProvider()
{
return Socialite::driver('gitlab')->redirect();
}
public function handleProviderCallback()
{
$user = Socialite::driver('GitLab')->user();
}
到
public function redirectToProvider()
{
return Socialite::driver('gitlab')->stateless()->redirect();
}
public function handleProviderCallback()
{
$user = Socialite::driver('GitLab')->stateless()->user();
}
然后在我的回调中进一步将用户存储在数据库中
public function handleProviderCallback(Request $request)
{
$user = Socialite::driver('gitlab')->stateless()->user();
$authUser = $this->findOrCreateUser($user);
Auth::login($authUser, true);
return redirect()->route('/');
}
现在它可以正常工作了。
确保您提供的回调 URL
在 gitlab/github 中/任何提供者都与在应用程序中相同 (config/services.php)
我有一个本地项目,我想在其中使用我的 gitlab 凭据登录。 我为此使用 Laravel Socialite 并将 socialiteproviders/gitlab 包下载到我的项目中。
在gitlab.mycompany.be中,我创建了一个application key,一个secret key和uri如下:
http://react.test/login
http://react.test/login/gitlab/callback
我已经包括了供应商:
'gitlab' => [
'client_id' => env('GITLAB_KEY'),
'client_secret' => env('GITLAB_SECRET'),
'redirect' => env('GITLAB_REDIRECT_URI'),
'instance_uri' => env('GITLAB_BASE_URL'),
],
我的 LoginController 看起来像这样:
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/home';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
public function redirectToProvider()
{
return Socialite::driver('gitlab')->redirect();
}
public function handleProviderCallback()
{
$user = Socialite::driver('GitLab')->user();
$accessTokenResponseBody = $user->accessTokenResponseBody;
// $user->token;
}
我的路线:
Route::get('/', function () {
return view('welcome');
});
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
Route::resource('tasks', "TaskController");
Route::get('login', 'Auth\LoginController@redirectToProvider');
Route::get('login/gitlab/callback', 'Auth\LoginController@handleProviderCallback');
我的 .env 是什么样的:
GITLAB_TOKEN=***
GITLAB_KEY=***
GITLAB_SECRET=***
GITLAB_REDIRECT_URI=http://react.test/login/gitlab/callback
GITLAB_BASE_URL=http://gitlab.mycompany.be/
GITLAB_METHOD=token
GITLAB_HOST="http://gitlab.mycompany.be/"
我可以从 gitlab.mycompany.be 使用我的帐户登录,但在重定向后我收到以下消息:
GuzzleHttp \ Exception \ ClientException (401)
Client error:
POST https://gitlab.com/oauth/token
resulted in a401 Unauthorized
response: {"error":"invalid_client","error_description":"Client authentication failed due to unknown client, no client authenticat (truncated...)
为什么 guzzle 返回 401 未经授权?
我为可能感兴趣的其他人找到了我自己的问题的解决方案:
我改了:
public function redirectToProvider()
{
return Socialite::driver('gitlab')->redirect();
}
public function handleProviderCallback()
{
$user = Socialite::driver('GitLab')->user();
}
到
public function redirectToProvider()
{
return Socialite::driver('gitlab')->stateless()->redirect();
}
public function handleProviderCallback()
{
$user = Socialite::driver('GitLab')->stateless()->user();
}
然后在我的回调中进一步将用户存储在数据库中
public function handleProviderCallback(Request $request)
{
$user = Socialite::driver('gitlab')->stateless()->user();
$authUser = $this->findOrCreateUser($user);
Auth::login($authUser, true);
return redirect()->route('/');
}
现在它可以正常工作了。
确保您提供的回调 URL 在 gitlab/github 中/任何提供者都与在应用程序中相同 (config/services.php)