2017-12-06 32 views
0

OKTAとJWTを使用してLaravel 5.4 APIを保護するソリューションをまとめようとしています。私はOKTAを介して私のアプリケーションにログインし、access_tokenとid_tokenを取得するSPAを持っています。また、これを 'Authorization'を使用しているヘッダーのAPI呼び出しに渡します:Bearer ${accessToken}今、私はLaravelバックエンド内のOKTAでこのアクセストークンを検証するソリューションを見つけるのに苦労しています。 tymon/jwt-authを見ていますが、トークンをverifiyするカスタムソリューションを追加する方法はありませんが、okta/jwt-verifierを使用して誰でもサンプル/ガイドを使用できますか? laravel/socialiteとsocialiteproviders/oktaも見ていますが、これはSPAではなく従来のバックエンドログインに関するものですOtaaとJWTでlaravel apiサービスを保護

答えて

0

私たちのokta/jwt-verifier図書館はあなたを助けてくれるはずです。ベアラトークンに基づいてリクエストをキャプチャして認可するカスタムミドルウェアソリューションを作成する必要があります。ミドルウェアを設定したら、検証者ライブラリの内部で、次のコマンドを実行してaccessTokenを確認できます。

$jwtVerifier = (new \Okta\JwtVerifier\JwtVerifierBuilder()) 
    ->setAudience('api://default') 
    ->setClientId('{clientId}') 
    ->setIssuer('https://{yourOktaDomain}.com/oauth2/default') 
    ->build(); 

$jwt = $jwtVerifier->verify($jwt); 

上記のクライアントIDとoktaドメインを変更することで、accessTokenをverifyメソッドに渡すことができます。例外が発生しない場合は、jwtが有効であるとみなしてリクエストを承認することができます。

はあなたがこの記事を見つける人のためにJWT

+0

感謝しかし、あなたが提案どおりにやったがInvalidArgumentException取得する必要があります。ベンダー/ spomky-ラボ/ホセ/ SRC/Verifier.php中:146 oktaAuth.signInからaccessTokenを渡すのclientId、発行者など、すべての有効な – Jezer

+0

[ { "idToken" をチェックする: "..."、 "expiresAt": .. "スコープ":[ "のOpenID"、 "電子メール" ]、 "authorizeUrl": "HTTPS:\/\/dev-XXX.oktapreview.com \ /のOAuth2 \/V1 \ /許可します" 、 "発行者": "HTTPS:\/\/dev-XXX.oktapreview.com"、 "のclientId": "..." }、{ "accessToken":」... " " expiresAt ":...、 " tokenType ":" Bearer "、 "スコープ ":[ "userize": "https:\/\/dev-XXX.oktapreview.com \/oauth2 \/v1 \/authorize"、 、 「authorizeUrl」:「openid」、 「https: \/\/dev-XXX.oktapreview.com \/oauth2 \/v1 \/userinfo " } ] – Jezer

+0

あなたが提供したデコードされたバージョンではなく、JWTの文字列バージョンを渡す必要があります。 – bretterer

0

の妥当性を検証した後にアクセスを持っているものについては、github repo readmeを参照してください。 JWSを確認することができません:SPAあなたも発行者を定義することを確認してくださいでは、これは便利なスタート...

//react login 

this.oktaAuth = new OktaAuth({ 
    url: props.config.oktaUrl 
    ,clientId:props.config.clientId 
    ,redirectUri:props.config.redirectUri 
    ,issuer: props.config.issuer 
}); 
this.oktaAuth.signIn({ 
    username: this.state.username, 
    password: this.state.password 
}) 
.then((response) => { 
    if (response.status === 'SUCCESS') { 
     this.setState({ 
      sessionToken: response.sessionToken 
     }); 
     this.oktaAuth.token.getWithoutPrompt({ 
      responseType: ['id_token', 'token'] 
      ,scopes: ['openid', 'email', 'profile'] 
      ,sessionToken: response.sessionToken 
     }) 
     .then((tokenOrTokens) => { 
      this.setState({ 
       tokenOrTokens: tokenOrTokens 
      }); 
      window.localStorage.setItem('access_token', tokenOrTokens[1].accessToken); 
     }) 
     .catch(function(err) { 
      console.log('err', err); 
     }); 
    } 
}) 

//api call 

const accessToken = window.localStorage.getItem('access_token') || null; 

const config = { 
    method: 'GET', 
    headers: { 
    'Content-Type': 'application/x-www-form-urlencoded', 
    'Authorization': `Bearer ${accessToken}` 
    }, 
}; 

fetch(url, config) 
    .then((response) => { 
    ... 

//laravel api route 

Route::group(['prefix' => 'restricted', 'middleware' => ['okta.validate']], function() { 
    Route::get('/getprotecteddata', '[email protected]'); 
}); 

//laravel kernel.php 
protected $routeMiddleware = [ 
    ... 
    'okta.validate' => \App\Http\Middleware\ValidateOKTAToken::class, 
]; 


//laravel middleware 

namespace App\Http\Middleware; 

use Closure; 
use Illuminate\Http\Request; 


class ValidateOKTAToken 
{ 
    public function handle($request, Closure $next) 
    { 
     $token = $this->parseAuthHeader($request); 
     $jwt = $this->validate($token); 
     \Log::info("ValidateOKTAToken jwt=" . json_encode($jwt->toJson())); 
     return $next($request); 
    } 


    protected function validate($token) { 

     $oktaClientId = env('OKTA_CLIENTID'); 
     $oktaIssuer = env('OKTA_ISSUER'); 
     $oktaAudience = env('OKTA_AUDIENCE'); 

     $jwtVerifier = (new \Okta\JwtVerifier\JwtVerifierBuilder()) 
     ->setAudience($oktaAudience) 
     ->setClientId($oktaClientId) 
     ->setIssuer($oktaIssuer) 
     ->build(); 

     $jwt = $jwtVerifier->verify($token); 
     return $jwt;   
    } 

    protected function parseAuthHeader(Request $request, $header = 'authorization', $method = 'bearer') 
    { 
     $header = $request->headers->get($header); 

     if (! starts_with(strtolower($header), $method)) { 
      return false; 
     } 

     return trim(str_ireplace($method, '', $header)); 
    } 
} 
関連する問題