用户统一认证

.net core使用identity server4初步实现了一套用户统一认证服务器,用了两种认证模式一种password认证,一种是Implicit模式,客户端即支持API的用户认证也支持其他系统的跨系统认证。

.net的客户端就不用再说了,直接使用identity server4提供的功能,下面主要说下php下的laravel框架客户端开发。

1、需要引入两个库

composer require jumbojett/openid-connect-php

oauth2.0的认证,支持oauth2.0的4种认证模式。

composer require lcobucci/jwt

解析认证后的token,分析认证用户信息。

2、去掉自带的Auth的controller新建AuthController

两个方法一个进行登录认证,一个callback处理认证信息

public function login()
{

    $oidc = new OpenIDConnectClient('http://localhost:5000',
        'DotnetCoreClient');
    $oidc->setResponseTypes(array('id_token'));
    $oidc->setRedirectURL('http://localhost:8090/call_back'); //设置项目RedirectURL
    $oidc->addScope(array('openid profile'));
    $oidc->setAllowImplicitFlow(true);
    $oidc->addAuthParam(array('response_mode' => 'form_post'));
    $oidc->authenticate();
}

public function callback()
{
    $token = (new Parser())->parse((string)$_POST['id_token']); // Parses from a string
    $user = new User();
    $user->name = $token->getClaim('nickname');
    $user->id = $token->getClaim('UserId');
    if (!User::where('id', $user->id)->first())
        $user->save();
    //$user->update();
    Auth::login($user);
    return redirect('/');
}
这其中主要就是要注意RedirectURL,这个在认证服务端也要做设置。
然后就是回调登陆后,laravel的每个页面都要去数据库验证一下,所有这里要先建立一个users表,初始字段包括id name,
其他字段可自行添加处理,保存到自己的数据库,以便后续验证。
3、路由配置
Route::get('/', 'HomeController@Index');
Route::get('login', 'AuthController@Login')->name('login');
Route::post('call_back', 'LoginController@Callback')->name('call_back');
在 app/Http/Middleware/VerifyCsrfToken.php 中,添加 except 规则,去掉call_back的csrf验证。

完毕。总体来说项目是初步搭建起来了,后期继续深度学习oauth2.0,indenity server4。
https://github.com/jfwangncs/IdentityMicroServer/PHPClient