目前,我们有以下方面:提供RESTful API的后端(Play + Scala)服务器。此外,我们还有一个前端Web客户端和一个Android原生应用客户端。现在我们要添加WSO2标识服务器(v 5.1)以维护用户登录。
我面临的问题是本机Android应用程序集成。我有一个成功的Google登录,因此我有Open ID令牌。根据{{3}}我应该将令牌发送到我的后端服务器(WSO2IS),其中令牌应该针对Google权限进行验证,如果令牌是合法的,它应该在WSO2IS中签署我的用户。请注意,如果我们的系统中不存在此类用户,则应首先创建该用户然后登录。遗憾的是,我找不到将令牌发送到WSO2 Identity Server的方法。
到目前为止我做了什么:
1)配置身份提供商(IDP Google Federated Authenticators)
2)配置服务提供商,其中Local&出站身份验证配置指向先前定义的联合身份验证器Google
3)在IDP和SP中配置了一些声明
然后我开始玩端点:
的 /的oauth2 /令牌
的 /的oauth2 /授权
但是使用它并不是我想要的,因为这些端点会为我生成一个新的令牌而不是获得我的令牌。
然后我发现Open ID prompt = none(https://developers.google.com/identity/sign-in/android/backend-auth),我还尝试调用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
还尝试无+登录。
是否可以使用WSO2IS执行此操作?通过传递Google Open ID令牌注册/登录用户?
如果事实证明我想做的事情是不可能的,我会提出以下解决方法:
1)创建一个自定义服务,验证令牌,如果合法将注册新用户。这只是一个想法,我不知道是否可能以及我是否需要自己编写代码为什么要使用WSO2 Identity Server?
2)在Android应用程序中,我应该删除本机Google登录支持并使用WebView,我们将使用非常清晰和标准的Web App流程。我无法通过使用Web视图而不是API来评估我将失去什么,但它似乎是错误的。很自然,在Android手机上,您应该使用自己的Google帐户无缝登录。
如果我需要使用其中一种解决方法,请告诉我哪种方法更好?或者提出一个新的。
编辑1 :根据
丢弃解决方法2浏览器弹出窗口是网络应用将用户重定向到IdP的首选方式。 Android或iOS等平台上的移动应用程序应为此目的启动系统浏览器。嵌入式Web视图不受信任,因为没有什么可以阻止应用程序窥探用户密码。用户身份验证必须始终在与应用程序上下文(例如浏览器)分开的可信上下文中进行。
这取自http://openid.net/specs/openid-connect-core-1_0.html#AuthRequest
如果无法使用WebView(出于安全考虑)而在Android中,您只能打开浏览器,但无法使用startActivityForResult
命令它。这意味着即使用户登录,浏览器也不会自动关闭,并且会在那里发送,直到用户关闭它。此外,浏览器不会告诉您的应用用户已登录且应用程序应自行查明(老实说,我不知道如何:您无法进行服务器推送或类似的操作,因为您可以使用相同的Google登录多个设备上的帐户;第二个明显的选项是服务器轮询,但应用程序不知道要询问哪个用户)。
编辑2 :对事物的新观点
在配置Google进行Web客户端登录时,会有一个授权URI字段(Google调用以回送令牌的回调)。对于WSO2IS,这是http://connect2id.com/learn/openid-connect#auth-request。因此,这应该是我们需要在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个参数:类型和 sessionDataKey 。我认为应该将类型设置为openid,但是如何获得有效的sessionDataKey?