目前,我们有以下方面:提供RESTful API的后端(Play Scala)服务器 . 此外,我们还有一个前端Web客户端和一个Android原生应用客户端 . 现在我们要添加WSO2标识服务器(v 5.1)以维护用户登录 .

我面临的问题是本机Android应用程序集成 . 我有一个成功的Google登录,因此我有Open ID令牌 . 根据https://developers.google.com/identity/sign-in/android/backend-auth,我应该将令牌发送到我的后端服务器(WSO2IS),其中应该针对Google权限验证令牌,如果令牌是合法的,它应该在WSO2IS中签署我的用户 . 请注意,如果此类用户没有找到将令牌发送到WSO2 Identity Server的方法 .

到目前为止我做了什么:
1)配置身份提供商(IDP Google联合身份验证器)
2)配置的服务提供商,其中本地和出站认证配置指向先前定义的联合认证器Google
3)在IDP和SP中配置了一些声明

然后我开始玩 endpoints :
/oauth2/token
/oauth2/authorize
但是使用它并不是我想要的,因为这些 endpoints 会为我生成一个新的令牌而不是获得我的令牌 .

然后我发现了Open ID prompt = none(http://openid.net/specs/openid-connect-core-1_0.html#AuthRequest),我也尝试调用authorize并在我调用时将open ID connect作为Authorization:Bearer <token>标头传递
oauth2/authorize?prompt=none&scope=openid&client_id=fzOPC3fCftkgC3xcLn7ZqjXiY_Ya&response_type=code&redirect_uri=https%3A%2F%2Flocalhost%3A9443%2Fcommonauth

也尝试了 none+login .

是否可以使用WSO2IS执行此操作?通过传递Google Open ID令牌注册/登录用户?

如果事实证明我想做的事情是不可能的,我想出了以下解决方法:
1)创建一个自定义服务,验证令牌,如果合法将注册新用户 . 这只是一个想法,我不知道是否可能,如果我需要自己编写代码,我为什么要使用WSO2 Identity Server?
2)在Android应用程序中,我应该删除本机Google登录支持并使用WebView,我们将使用非常清晰和标准的Web App流程 . 我无法通过使用Web视图而不是API来评估我将失去什么,但它似乎是错误的 . 很自然,在Android手机上,您应该使用自己的Google帐户无缝登录 .

如果我需要使用其中一种解决方法,请告诉我哪种方法更好?或者提出一个新的 .

EDIT 1 :解决方法2基于丢弃

浏览器弹出窗口是Web应用程序将用户重定向到IdP的首选方式 . Android或iOS等平台上的移动应用程序应为此目的启动系统浏览器 . 嵌入式Web视图不受信任,因为没有什么可以阻止应用程序窥探用户密码 . 用户身份验证必须始终在与应用程序上下文(例如浏览器)分开的可信上下文中进行 .

这取自http://connect2id.com/learn/openid-connect#auth-request

如果无法使用WebView(出于安全原因),并且在Android中您只能打开浏览器,但无法使用 startActivityForResult 命令它 . 这意味着即使用户登录,浏览器也会告诉您的应用程序用户已登录且应用程序应自行查明(老实说,我不知道要向哪个用户询问) .

EDIT 2 :对事物的新观点

在为Web客户端登录配置Google时,会有一个授权URI字段(Google调用以回送令牌的回调) . 对于WSO2IS,这是https://localhost:9443/commonauth . 因此,这应该是我们需要在Android应用中发送回令牌的网址 . 我开始使用 Postman 进行测试,我发送了以下请求:
POST /commonauth?code=eyJhbGciOiJSUzI1NiIsImtpZCI6IjhhNDJhODMzN2IxMmI5MzI5NGIyNGU5NDY5ZTViZWIwZGFhMWJlNGUifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJpYXQiOjE0ODQ2NDczNjIsImV4cCI6MTQ4NDY1MDk2MiwiYXVkIjoiNTM3ODQyNDY1MDM4LWpwZjRpYmE0cGI4YjN1bWY2aGhpYTFnNTJuODR1N2k1LmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwic3ViIjoiMTAyMjMwNjU1MzQxMzczODU4NDI2IiwiYXpwIjoiNTM3ODQyNDY1MDM4LXJmYmt0YTJ0MWFlazgycDZrNzloNXZrb2ppcXVvMTQ0LmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwibmFtZSI6IkRhbmllbGEgVmxhZGltaXJvdmEiLCJwaWN0dXJlIjoiaHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tLy1YQlNmUXgweE4xcy9BQUFBQUFBQUFBSS9BQUFBQUFBQUFBQS9BS0JfVTh0eTQyZHpfdk5sUFZ2Z01jcjUxUVJBWXBWMjNBL3M5Ni1jL3Bob3RvLmpwZyIsImdpdmVuX25hbWUiOiJEYW5pZWxhIiwiZmFtaWx5X25hbWUiOiJWbGFkaW1pcm92YSJ9.VMspUYeaAVHavEyoK3Hsss0pyZMHu-4QozucTAU-CLXnjAoaFbPBirslX7VpS4wvwHPge0AE5gHpIzAl1el_ufkhiu2NJn_LKo48Ve3HNj9igjnwD2nW_PGOqlYPoWV5UtFlKyUxi72qvLOCkYwsPuKVzA9irD-vGm3U2U3wBu_OQrJzbhdU9lp3aG4F0tQgQi-NPtEZY7Xgu-Om3qmarByhJYjxBPHEWzuyuQ2F9xY65t0mnd7gVAr2F5_aBHemjVx8V9lQc4eyRFjE3g_9ZgYn9xX9w8TwCXO9VpkdVRdFWQ07RFjFz915FO5KX9x4UNAu6H1Jop9ug5oiVCrmFw HTTP/1.1

在服务器端,这会导致错误:上下文不存在 . 可能是由于缓存无效 . 在服务器日志中,我发现:
DEBUG - Session data key is null in the request {org.wso2.carbon.identity.application.authentication.framework.handler.request.impl.DefaultRequestCoordinator} ERROR - Context does not exist. Probably due to invalidated cache {org.wso2.carbon.identity.application.authentication.framework.handler.request.impl.DefaultRequestCoordinator}

我查看了DefaultRequestCoordinator的代码,似乎我还需要2个参数: typesessionDataKey . 我认为类型应该设置为openid,但是如何获得有效的sessionDataKey?