teamupdivision/saltid-provider

v1.0.4 2023-08-18 10:13 UTC

This package is auto-updated.

Last update: 2024-09-18 12:46:05 UTC


README

文档

设置与安装

1. 在 config/services.php 中添加

'saltid' => [
    'client_id' => env('SALTID_CLIENT_ID'),
    'client_secret' => env('SALTID_CLIENT_SECRET'),
    'redirect' => env('SALTID_REDIRECT'),
    'url' => env('SALTID_URL'),
],

2. 在 .env 文件中添加凭证

SALTID_CLIENT_ID=yourclient-key-from-saltid
SALTID_CLIENT_SECRET=your-secret-key-from-saltid
SALTID_REDIRECT=http://your-domain.com/salt/callback
SALTID_URL=http://saltid.com/

注意。 这些由 SaltId 用户管理生成

3. 创建路由

Route::get('salt/redirect',  [SaltController::class, 'redirect']);
Route::get('salt/callback', [SaltController::class, 'callback']);

4. 安装包

运行 composer require teamupdivision/saltid-provider

如何在单体中使用 SaltId 包

创建一个管理 sso 认证 SaltId 的控制器,并使用函数

  • 导入包
    • 使用 Teamupdivision\SaltId\Facades\SaltId;
  • 创建 redirect 函数
    /**
     * Redirect function to external call for authorization step
     *
     * @param Request $request
     * @return RedirectResponse
     */
    public function redirect(Request $request): RedirectResponse
    {
        $redirect = SaltId::driver('saltid')->redirect();
        return $redirect;
    }
  • 创建 callback 函数
    /**
     * Callback function for authorization and get user
     *
     * @param Request $request
     * @return RedirectResponse
     */
    public function callback(Request $request): RedirectResponse
    {
        $saltUser = SaltId::driver('saltid')->user();
        $user = User::where('email',$saltUser->getEmail())->first();

        if(!$user){
            $user = new User;
            $user->name = $saltUser->getName() ? $saltUser->getName() : $saltUser->getEmail();
            $user->email = $saltUser->getEmail();
            $user->password = bcrypt(123456);
            $user->save();
        }

        Auth::login($user);

        return redirect('/dashboard');
    }

如何在 API 中使用 SaltId 包

创建一个管理 sso 认证 SaltId 的控制器,并使用函数

  • 导入包
    • 使用 Teamupdivision\SaltId\Facades\SaltId;
  • 创建 redirect 函数
    /**
     * Redirect function to external call for authorization step
     *
     * @return JsonResponse
     */
    public function redirect(): JsonResponse
    {
        $redirectTarget = SaltId::driver('saltid')->stateless()->redirect()->getTargetUrl();
        return response()->json([
            'data' => [
                'redirectTarget' =>  $redirectTarget,
            ],
        ]);
    }
  • 创建 callback 函数
    /**
     * Callback function for authorization and get user
     *
     * @return JsonResponse
     */
    public function callback(): JsonResponse
    {
        try {
            $saltUser = SaltId::driver('saltid')->stateless()->user();
        } catch (Throwable) {
            return response()->json([
                'message' => 'Code expired',
            ], 401);
        }

        if (User::where('email', $saltUser->getEmail())->doesntExist()) {
            User::create([
                'name' => $saltUser->getName() ?? $saltUser->getEmail(),
                'email' => $saltUser->getEmail(),
                'password' => Hash::make('password'),
            ]);
        }

        return response()->json([
            'data' => [
                'type' => 'Bearer',
                'access_token' => $saltUser->token,
                'refreshToken' => $saltUser->refreshToken,
                'expiresIn' => $saltUser->expiresIn,
            ],
        ]);
    }

如何以手动模式使用 SaltId

创建一个管理 sso 认证 SaltId 的控制器,并使用函数

  • 创建 redirect 函数
    /**
     * Redirect function to external call for authorization step
     *
     * @param Request $request
     * @return RedirectResponse
     */
    public function redirect(Request $request): RedirectResponse
    {
       $request->session()->put('state', $state = Str ::random(40));

        $request->session()->put(
            'code_verifier', $code_verifier = Str::random(128)
        );

        $codeChallenge = strtr(rtrim(
            base64_encode(hash('sha256', $code_verifier, true))
        , '='), '+/', '-_');

        $query = http_build_query([
            'client_id' =>  config('services.saltid.client_id'),
            'redirect_uri' => config('services.saltid.redirect'),
            'response_type' => 'code',
            'state' => $state,
        ]);

        return redirect(config('services.saltid.url').'oauth/authorize?'.$query);
    }
  • 创建 callback 函数
    /**
     * Callback function for authorization and get user
     *
     * @param Request $request
     * @return RedirectResponse
     */
    public function callback(Request $request): RedirectResponse
    {
        $state = $request->session()->pull('state');
        $codeVerifier = $request->session()->pull('code_verifier');

        throw_unless(
            strlen($state) > 0 && $state === $request->state,
            InvalidArgumentException::class
        );

        $response = Http::asForm()->post(config('services.saltid.url').'oauth/token', [
            'grant_type' => 'authorization_code',
            'client_id' => config('services.saltid.client_id'),
            'client_secret' => config('services.saltid.client_secret'),
            'redirect_uri' => config('services.saltid.redirect'),
            'code_verifier' => $codeVerifier,
            'code' => $request->code,
        ]);

        if($response->failed()) {
            $errorMessage = $response->body();
            return redirect('/login')->with('error',str_replace('"', '', $errorMessage));
        }


        $saltUser = Http::withHeaders([
            'Accept' => 'application/json',
            'Authorization' => 'Bearer '.$response->json()['access_token']
        ])->get(config('services.saltid.url').'api/v1/me');

        $user = User::where('email',$saltUser->json()['data']['email'])->first();

        if(!$user){
            $user = new User;
            $user->name = $saltUser->json()['data']['email'];
            $user->email = $saltUser->json()['data']['email'];
            $user->password = bcrypt(123456);
            $user->save();
        }

        Auth::login($user);

        return redirect('/dashboard');
    }

用户实体的重要函数