Express 在同一浏览器上同时访问两个应用程序模块且用户尚未登录时,授予提供程序OAuth状态不匹配
我一直在尝试实现单点登录(SSO)。我有不同的前端应用程序模块,它们运行在不同的域上,它们都使用单个API服务器Express 在同一浏览器上同时访问两个应用程序模块且用户尚未登录时,授予提供程序OAuth状态不匹配,express,oauth-2.0,single-sign-on,express-session,grant-oauth,Express,Oauth 2.0,Single Sign On,Express Session,Grant Oauth,我一直在尝试实现单点登录(SSO)。我有不同的前端应用程序模块,它们运行在不同的域上,它们都使用单个API服务器 单点登录服务器 API服务器 前端模块1 前端模块2 认证流 身份验证的流程是前端模块检查本地存储中的令牌。如果找不到令牌,它会将用户重定向到API服务器端点,比如说。 API服务器具有SSO服务器的客户端ID和机密。API服务器在cookie中设置前端模块的url(以便我可以将用户重定向回启动器前端模块),然后将请求重定向到SSO服务器,在该服务器上,用户将显示登录屏幕。用户在那里
require('dotenv').config();
var express=require('express')
,session=require('express-session')
,morgan=require('morgan')
var Grant=require('Grant-express')
,port=process.env.port | | 3001
,oauthConsumer=process.env.OAUTH|u CONSUMER |`http://localhost`
,oauthProvider=process.env.OAUTH_PROVIDER|URL|http://localhost'
,grant=new grant({
默认值:{
协议:“https”,
主持人:oauthConsumer,
运输:"会议",,
国家:对
},
MyAuth:{
关键字:process.env.CLIENT|u ID | |“test”,
秘密:process.env.CLIENT|u secret | |“secret”,
重定向\u uri:`${oauthConsumer}/connect/myOAuth/callback`,
authorize\u url:`${oauthProvider}/oauth/authorize`,
访问url:“${oauthProvider}/oauth/token`,
非统组织:2,
作用域:['openid','profile'],
回调:'/done',
作用域分隔符:“”,
动态:['uiState'],
自定义参数:{deviceId:'abcd',appId:'com.pud'}
}
})
var app=express()
应用程序使用(摩根(‘开发’))
//必需:(任何会话存储-请参阅./examples/express session)
使用(会话({secret:'grant'}))
//在Grant的动态键中设置FrontEndModule URL。
应用程序使用((请求、恢复、下一步)=>{
req.locals.grant={
动态:{
uiState:req.query.uiState
}
}
next();
})
//格兰特山
应用程序使用(授权)
app.get('/done',(req,res)=>{
if(请求会话授予响应错误){
res.status(500.json)(req.session.grant.response.error);
}否则{
res.json(req.session.grant);
}
})
应用程序侦听(端口,()=>{
log(`READY port${port}`)
})
在点击SSO服务器时,您有中继状态选项,该选项在发送到SSO服务器时返回,只是为了在请求SSO之前跟踪应用程序状态
要了解有关中继状态的更多信息,请执行以下操作:
您使用的是哪种SSO服务???您必须将用户重定向回原始应用程序URL,而不是API服务器URL:
。使用('/connect/:provider',(req,res,next)=>{
res.locals.grant={dynamic:{redirect\u uri:
`http://${req.headers.host}/connect/${req.params.provider}/callback`
}}
下一个()
})
.use(grant(require('./config.json')))
然后,您需要同时指定以下两项:
https://foo1.bar.com/connect/google/callback
https://foo2.bar.com/connect/google/callback
允许重定向OAuth应用程序的URI
最后,您必须将一些应用程序域路由路由路由到Grant正在处理重定向URI的API服务器
例子
https://foo1.bar.com/connect/google/callback
https://foo1.bar.com/login
在您的浏览器应用程序中https://api.bar.com/connect/google
的传入Host
头配置重定向uri
https://foo1.bar.com/connect/google/callback
https://foo1.bar.com/connect/google/callback
https://api.bar.com/connect/g