Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php OAuth 2授权码授权实现_Php_Vue.js_Authentication_Oauth 2.0_Authorization - Fatal编程技术网

Php OAuth 2授权码授权实现

Php OAuth 2授权码授权实现,php,vue.js,authentication,oauth-2.0,authorization,Php,Vue.js,Authentication,Oauth 2.0,Authorization,我有以下设置: 资源服务器:它是一个用PHP编写的基本RESTful API(Slim,Doctrine) Auth服务器:我自己用PHP实现的OAuth 2服务器(Slim,Doctrine) 公共客户端:用VueJS编写的SPA,可在web上公开获取 此外,我想使用授权代码或客户端凭据授权类型授权更多客户端 我已经阅读了大部分规范以及其他几个“简单指南”和实现它的库。 我想我了解授权代码授权类型的流程是如何工作的,但是在尝试实现它时,所有重定向都有很多问题。 我知道我们有一个有效的解决方案,

我有以下设置:

资源服务器:它是一个用PHP编写的基本RESTful API(Slim,Doctrine)

Auth服务器:我自己用PHP实现的OAuth 2服务器(Slim,Doctrine)

公共客户端:用VueJS编写的SPA,可在web上公开获取

此外,我想使用授权代码或客户端凭据授权类型授权更多客户端

我已经阅读了大部分规范以及其他几个“简单指南”和实现它的库。 我想我了解授权代码授权类型的流程是如何工作的,但是在尝试实现它时,所有重定向都有很多问题。 我知道我们有一个有效的解决方案,但感觉很粗糙,我确信必须有一个更简单更好的解决方案。此外,由于我不是安全专家,我很担心 我的解决方案容易受到攻击

因此,我的问题是:如果不依赖于许多第三方库,OAuth 2授权码授权类型的简单而安全的实现会是什么样子

在这里,我提供了一个我如何理解流程的图像,我将描述并提供我的解决方案的代码片段

  • (步骤1至步骤4)用户单击网站上的登录按钮。将触发Vuex操作
    loginOAuth
    ,该操作要求验证服务器提供登录表单,并在新窗口中显示该表单
Vuex操作
loginOAuth

loginOAuth({commit}){
让oauth_axios=axios.create({
baseURL:“/php-own-oauth-server/API/public/API/v1/”,
超时:1000
});
奥阿斯({
url:'auth form',
方法:“获取”
})
。然后(resp=>{
控制台日志(resp);
让login_window=window.open(''‘我的名字’、‘左=0、顶=0、宽=800、高=500、工具栏=0、滚动条=0、状态=0');
登录窗口。文件。写入(相应数据);
登录_window.document.close();
})
.catch(错误=>{
提交(“设置错误消息”,错误);
});
},
  • (步骤5至步骤7)用户输入其用户凭据并单击表单上的submit,表单将向Auth服务器发送POST调用。如果凭据正确,服务器将使用 这是一个代码,在我的例子中是一个短暂的JWT。响应通过
    window.opener.postMessage(xhr.responseText,“*”)提供给主窗口这让我感觉很不舒服。我还没找到
    执行“代码重定向到应用程序”步骤的更好方法。为了给代表授权类型代码的JWT签名,我使用了一个简单的字符串密码,因为它只需要在
    相同的身份验证服务器
    
HTML登录表单,由OAuth服务器返回
../auth Form


window.onload=函数(){
var form=document.querySelector(“表单”);
form.onsubmit=submited.bind(表单);
}
已提交功能(事件){
event.preventDefault();
var xhr=new XMLHttpRequest();
xhr.open(“POST”https://localhost/php-own-oauth-server/API/public/api/v1/auth-form-validate-user-credentials");
xhr.onreadystatechange=函数(事件){
if(xhr.readyState==XMLHttpRequest.DONE){
如果(xhr.status==200){
window.opener.postMessage(xhr.responseText,'*');
window.close();
}
}
};
var formData=newformdata(document.getElementById(“myForm”);
xhr.send(formData);
}
电子邮件地址
密码
记得我吗
登录
忘记密码
在VueJS应用程序中,我注册了以下事件侦听器以接收登录表单发送的消息。 它从Auth服务器获取响应,Auth服务器主要是以JWT令牌和 通过分派操作将其放回Vuex上下文中

从登录表单获取响应的JavaScript事件侦听器

window.addEventListener(“消息”,receiveMessage,false);
函数接收消息(事件){
if(事件数据){
试一试{
dispatch('Auth/requestAccessToken',JSON.parse(event.data));
}捕获(e){
}
}
}
  • (步骤8至步骤9)该代码与客户机id和客户机机密(是的,我知道客户机机密对公共SPA客户机没有多大意义)一起用于从身份验证服务器请求访问令牌
Vuex操作
requestAccessToken

requestAccessToken({commit},负载){
让oauth_axios=axios.create({
baseURL:“/php-own-oauth-server/API/public/API/v1/”,
超时:1000
});
奥阿斯({
url:“请求访问令牌”,
方法:“POST”,
数据:{
客户端id:“前端应用程序”,
客户机密:“test123!”,
代码:payload.data.code
}
})
。然后(resp=>{
控制台日志(resp);
//resp.data.data.access\u令牌
})
.catch(错误=>{
提交(“设置错误消息”,错误);
});
}
从这一点开始,水流是直线的。我只需将访问令牌作为头添加到资源服务器的每个请求中,资源服务器就可以对其进行验证。 此验证使用私有和公共rsa密钥对。身份验证服务器使用私钥对JWT进行签名,资源服务器使用公钥验证签名

对我来说,这个解决方案不合适。是否有更好/更通用的解决方案来实现OAuth 2授权码授权类型?我还怀疑我的解决方案是否能被非web应用程序客户端使用

谢谢你的阅读和帮助。 干杯


Raphael Hippe

OAuth体系结构应该满足的一个好目标是通过以下步骤将安全性外部化:

  • 使用AWS/Google/Microsoft提供的云授权服务器,该服务器可能完全免费,可适度使用
  • 在SPA中使用基于标准的库,以执行安全繁重工作和avoi