使用Okta和JWT保护laravel api服务

时间:2017-12-06 13:40:27

标签: laravel jwt okta

尝试使用OKTA和JWT整合解决方案来保护Laravel 5.4 api。我有一个通过OKTA登录我的应用程序的SPA,并检索access_token和id_token。它还使用“授权”将标题传递给标题中的API调用:Bearer ${accessToken}但现在我正在努力寻找一种解决方案,以便在Laravel后端内使用OKTA验证此访问令牌。一直在看tymon / jwt-auth但是无法锻炼如何添加自定义解决方案来验证令牌,但我认为可以使用okta / jwt-verifier完成任何人都有任何样本/指南吗?还看了laravel / socialite和socialiteproviders / okta,但这似乎更像是传统的后端登录而不是SPA

2 个答案:

答案 0 :(得分:1)

我们的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有效性后有权访问的内容的信息,请参阅github repo readme

答案 1 :(得分:0)

对于那些发现这篇文章。在SPA中确保你也定义了发行者,这应该是一个有用的开始...... //反应登录 this.oktaAuth = new OktaAuth({   url:props.config.oktaUrl   ,的clientId:props.config.clientId   ,redirectUri:props.config.redirectUri   ,issuer:props.config.issuer }); this.oktaAuth.signIn({     用户名:this.state.username,     密码:this.state.password }) .then((response)=> {     if(response.status ===' SUCCESS'){         this.setState({             sessionToken:response.sessionToken         });         this.oktaAuth.token.getWithoutPrompt({             responseType:[' id_token','令牌']             ,范围:[' openid','电子邮件','个人资料']             ,sessionToken:response.sessionToken         })         .then((tokenOrTokens)=> {             this.setState({                 tokenOrTokens:tokenOrTokens             });             window.localStorage.setItem(' access_token',tokenOrTokens [1] .accessToken);         })         .catch(function(err){             console.log(' err',错误);         });     } }) // api电话 const accessToken = window.localStorage.getItem(' access_token')||空值; const config = {   方法:' GET',   标题:{     '内容类型':' application / x-www-form-urlencoded',     '授权':'Bearer $ {accessToken}`   }, }; fetch(url,config)     .then((response)=> {     ... // laravel api route Route :: group(['前缀' =>'受限制','中间件' => [' okta.validate']] ,function(){     Route :: get(' / getprotecteddata',' MyController @ getProtectedData'); }); // laravel kernel.php protected $ routeMiddleware = [     ...     ' okta.validate' => \ APP \ HTTP \中间件\ ValidateOKTAToken ::类, ]。 // laravel中间件 namespace App \ Http \ Middleware; 使用闭包; 使用Illuminate \ Http \ Request; class ValidateOKTAToken {     公共函数句柄($ 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)          - >建立();         $ jwt = $ jwtVerifier-> verify($ token);         return $ jwt;     }     受保护的函数parseAuthHeader(请求$ request,$ header ='授权',$ method =' bearer')     {         $ header = $ request-> headers-> get($ header);         if(!starts_with(strtolower($ header),$ method)){             返回false;         }         返回修剪(str_ireplace($ method,'',$ header));     } }