oriceon/oauth-5-laravel을 사용한 Laravel 5의 OAuth 인증

소개



Laravel5는 Laravel4에 비해 호환성이 없다고 해도 좋을 정도로 많이 변하고 있습니다.

이번에는 시험에 지금까지 사용하고 있던 artdarek/oauth-4-laravel의 OAuth 라이브러리를 사용하여 Laravel5에 설치해 보았습니다.

그리고! 그 전에, 앞서 말했듯이 Laravel5와 Laravel4의 호환성은 없다고 해도 좋을 정도로 다르기 때문에, 그렇게 간단하게 인스톨 할 수 있을 것은 없습니다. 먼저 artdarek/oauth-4-laravel의 issue를 Laravel 5라는 키워드로 검색하여 어떤 문제가 있었는지 알아보았습니다.



왔어! ! ! 역시 그런 이슈가 있습니다. 해외에서는 L5Laravel 5 라고 가리킵니다.

그럼 바로 첫 번째 이슈를 읽어 보겠습니다. 분명히 oriceon이 이미 oauth-5-laravel 용 래리 브래리를 만든 것 같아서 즉시 시도해 보겠습니다. (지금은 이 리포는 pull-request 대기합니다만, 이것을 merge해 버리면 아마 Laravel 4의 대응은 사라져 버리는 것이 아닌가)

Composer update



oriceon씨가 만든 Laravel 5에 대응한 OAuth의 리포지토리입니다만, 2015년 2월 11일에 만든 것답게, 완성된 리포지토리입니다.

우선 이 리포지토리는 packagist에 등록되어 있지 않은 것이므로 github에서 얻을 수밖에 없습니다. 이 때 composer.json은 require 이외에 repository를 추가해야합니다. 그리고 master 브랜치를 clone하므로 버전은 dev-master가됩니다.
    "require": {
        "laravel/framework": "5.0.*",
        "oriceon/oauth-5-laravel":"dev-master"
    },
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/oriceon/oauth-5-laravel"
        }
    ],

그런 다음 composer를 업데이트합니다.
composer update

app.php에 패키지 등록



업데이트가 완료되면 artdarek/oauth-4-laravel과 마찬가지로 config/app.php 파일을 편집하여 패키지를 등록합니다.
'providers' => array(
    // ...

    'Artdarek\OAuth\OAuthServiceProvider'
)
// ....

'aliases' => array(
    // ...

    'OAuth' => 'Artdarek\OAuth\Facade\OAuth',
)

client_id 및 client_secret 설정



Laravel 5에서는 다른 vendor 명령을 준비했습니다. 우선, 초기 파일을 생성해 주므로 다음의 vendor 커멘드를 실행.
php artisan vendor:publish

그리고 config/oauth-5-laravel.php 에 다음과 같은 초기 설정 파일이 생성됩니다.
<?php
return [ 

    /*
    |--------------------------------------------------------------------------
    | oAuth Config
    |--------------------------------------------------------------------------
    */

    /**
     * Storage
     */
    'storage' => 'Session', 

    /**
     * Consumers
     */
    'consumers' => [

        /**
         * Facebook
         */
        'Facebook' => [
            'client_id'     => '',
            'client_secret' => '',
            'scope'         => [],
        ],      

    ]

];

아무래도 좋은 이야기입니다만, 배열을 [] 로 표현하는 것은 매우 Laravel 5인 것 같습니다.

여기에서 Laravel 5의 묘미입니다. 다음과 같이 설정합시다. 예제에서는 Google을 사용하는 경우 Facebook을 Google로 변경합니다.
<?php
return [ 

    /*
    |--------------------------------------------------------------------------
    | oAuth Config
    |--------------------------------------------------------------------------
    */

    /**
     * Storage
     */
    'storage' => 'Session', 

    /**
     * Consumers
     */
    'consumers' => [

        'Google' => array(
            'client_id'     => env('GOOGLE_CLIENT_ID'),
            'client_secret' => env('GOOGLE_CLIENT_SECRET'),
            'scope'         => ['userinfo_email', 'userinfo_profile'],
        ),       

    ]

];

Laravel 5에서는 환경 변수로 비밀 정보를 관리합니다. 그렇게 함으로써 github에 비밀 정보를 푸시하지 않아도 개발 환경인지 프로덕션 환경인지에 따라 사용하는 비밀 정보를 자동으로 관리해 줍니다.

그런 다음 프로젝트 루트의 .env 파일을 열고 (만약 .env.example이면 .env로 파일 이름을 변경하십시오) 다음 두 줄을 늘릴 수 있습니다. 단, my_google_client_idmy_google_client_secret 를 올바른 것으로 바꾸어 주세요.
GOOGLE_CLIENT_ID=my_google_client_id
GOOGLE_CLIENT_SECRET=my_google_client_secret

마지막으로 .env 파일을 github에 푸시하지 않도록 .gitignore에 .env를 추가하십시오.

실행하자.



리포지토리로 굴러가는 샘플 스니펫을 시도했습니다.
public function loginWithGoogle(Request $request)
{
    // get data from request
    $code = $request->get('code');

    // get google service
    $googleService = \OAuth::consumer('Google');

    // check if code is valid

    // if code is provided get user data and sign in
    if ( ! is_null($code))
    {
        // This was a callback request from google, get the token
        $token = $googleService->requestAccessToken($code);

        // Send a request with it
        $result = json_decode($googleService->request('https://www.googleapis.com/oauth2/v1/userinfo'), true);

        $message = 'Your unique Google user id is: ' . $result['id'] . ' and your name is ' . $result['name'];
        echo $message. "<br/>";

        //Var_dump
        //display whole array.
        dd($result);
    }
    // if not ask for permission first
    else
    {
        // get googleService authorization
        $url = $googleService->getAuthorizationUri();

        // return to google login url
        return redirect((string)$url);
    }
}

Laravel 5에서는 global의 namespace를 그만두었으므로, OAuth 클래스를 사용할 때 반드시 \ 를 붙여 사용하는 것입니다.

좋은 웹페이지 즐겨찾기