Loading...

Hướng dẫn kết nối Auth OpenID Sapo bằng Laravel 8


Lần trước là code Hướng dẫn kết nối Auth OpenID Haravan bằng Laravel 8 

Nay cuối tuần tiếp tục làm thêm 1 cái Auth OpenId Sapo đã public lên github cho anh em nào cần dev app cho Sapo bằng laravel.

Nó cũng tương tự như Auth OpenId Haravan

Đầu tiên đăng ký:






Việc đăng ký cơ bản như xong. Bây giờ bắt đầu vào dev.

Source code laravel của bạn cài vào laravel/socialite nếu chưa có

composer require laravel/socialite

- Tạo 1 app/Providers/SapoProvider.php

<?php

namespace App\Providers;

use Laravel\Socialite\Two\AbstractProvider;
use Laravel\Socialite\Two\ProviderInterface;
use Laravel\Socialite\Two\User;
use Illuminate\Support\Arr;

class SapoProvider extends AbstractProvider implements ProviderInterface
{
protected $scopeSeparator = ',';

protected $scopes = [
'read_orders',
'write_orders',
'read_customers',
'write_customers',
'read_content',
'write_content',
'read_themes',
'write_themes',
'read_products',
'write_products',
'read_script_tags',
'write_script_tags',
'read_price_rules',
'write_price_rules',
'read_draft_orders',
'write_draft_orders',
];

/**
* Get the authentication URL for the provider.
*
* @param string $state
* @return string
*/
protected function getAuthUrl($state)
{
$params = $this->parameters;
return $this->buildAuthUrlFromBase('https://' . $params['store'] . '.mysapo.net/admin/oauth/authorize', $state);
}

/**
* Get the token URL for the provider.
*
* @return string
*/
protected function getTokenUrl()
{
$params = $this->parameters;
return 'https://' . $params['store'] . '.mysapo.net/admin/oauth/access_token';
}

protected function getTokenFields($code)
{
return Arr::add(
parent::getTokenFields($code),
'grant_type',
'authorization_code'
);
}

/**
* Get the raw user for the given access token.
*
* @param string $token
* @return array
*/
protected function getUserByToken($token)
{
$response = $this->getHttpClient()->get('https://laravel-test.mysapo.net/admin/store.json', [
'headers' => [
'Accept' => 'application/json',
'X-Sapo-Access-Token' => $token,
],
]);
$data = json_decode($response->getBody(), true);

return $data['store'] ?? [];
}

protected function mapUserToObject(array $user)
{
return (new User())->setRaw($user)->map([
'id' => Arr::get($user, 'id'),
'name' => Arr::get($user, 'store_owner'),
'email' => Arr::get($user, 'email'),
'org_id' => (int)Arr::get($user, 'id'),
'org_name' => Arr::get($user, 'name'),
]);
}
}




- Trong file app/Providers/AppServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}

/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
$this->bootSapoSocialite();
}

private function bootSapoSocialite()
{
$socialite = $this->app->make('Laravel\Socialite\Contracts\Factory');
$socialite->extend('sapo', function ($app) use ($socialite) {
$config = $app['config']['services.sapo'];
return $socialite->buildProvider(SapoProvider::class, $config);
});
}
}

- File config/services.php thêm vào config haravan

'sapo' => [
'client_id' => env('SAPO_ACCESS_KEY_ID'),
'client_secret' => env('SAPO_SECRET_ACCESS_KEY'),
'redirect' => env('SAPO_REDIRECT')
]

- File config/session.php cấu hình lại same_site

'same_site' => 'none',

- File app/Http/Kernel.php enable session. Remove comment   \Illuminate\Session\Middleware\AuthenticateSession::class,

/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],

'api' => [
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];


- File routes/web.php thêm mới 

Route::get('/login', [SapoAuthController::class, 'redirectToProvider'])->name('login');
Route::get('/login_callback', [SapoAuthController::class, 'handleProviderCallback']);


- Chổ này lưu ý khi redirect về coi chừng bị csrf nên vào file app/Http/Middleware/VerifyCsrfToken.php

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
'login_callback'
];
}

- File controller app/Http/Controllers/SapoAuthController.php


- File .env thêm vào 3 biến môi trường

SAPO_ACCESS_KEY_ID=2060b727ac84445a87c2a0a31273f96a
SAPO_SECRET_ACCESS_KEY=a21c3483249a41118d82bb78a29b2ed1
SAPO_REDIRECT=https://simpleweb.test/login_callback


- Code thì cơ bản chỉ có nhiêu đó file, bây giờ test xem kết quả. Sapo khi auth thì họ bắt request tên store nên mình mới cho file input nhập vào.

- Ví dụ shop mình tạo ở sapo https://laravel-test.mysapo.net 




Sau khi auth thành công thì mình cho redirect vể trang dashboard mình, ở đây chỉ là html thôi nha.



Như vậy là ok rồi.

Nhìn chung sử dụng socialite extend lại thì có vẻ đơn giản hơn nhiều. 

Ngoài ra có thể viết dạng package như https://socialiteproviders.com/usage/

Mình đang làm basic hết có thể cho anh em hiểu cách tiếp cần OpenID đã phần 1 số bạn dev mới sẽ còn khó hiểu về vấn đề này.

Mình có up code trên https://github.com/tinhnguyenvan/laravel-auth-sapo anh em có thể down về xem thử.



# Bài viết cùng chuyên mục