我们的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
对于那些发现这篇文章。在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));
}
}