【发布时间】:2015-04-11 07:43:12
【问题描述】:
我在这篇帖子 Google Cloud Endpoints and user's authentication 中引用了 @MinWan 的精彩回答,他在其中描述了一种将自定义标头添加到针对 App Engine 的 Cloud Endpoints 的请求的方法。
很明显,我们可以添加一个自定义标头并为每个我们想要对其进行身份验证的服务(例如 Google、Twitter、Facebook)编写一个身份验证器,其中每个身份验证器读取一个特定的标头并针对该服务进行身份验证。如果令牌有效,服务通常会返回带有电子邮件地址或用户 ID 以及一些额外信息 [A] 的响应,我们从中生成 com.google.api.server.spi.auth.common.User,它稍后作为 com.google.appengine.api.users.User 传递到端点方法。
第一个问题:为什么我们有两个不同的用户实体,例如具有不同命名空间的用户?看起来,这些都不是子类/超类,因此它们可能是在幕后显式转换的。
第二个问题:显式转换的用户实体带来的问题是,没有自定义字段可以放置服务返回的额外信息 [A],即额外信息丢失了。此类额外信息可能有助于将外部服务的 oauth2 用户与本地用户或其他服务返回的 oauth2 用户进行匹配。
任何输入?处理多个身份验证服务的建议方法是什么?
【问题讨论】:
-
由于似乎没有解决方案,我作为解决方法所做的是通过返回 JSON 而不是字符串来“滥用”
com.google.api.server.spi.auth.common.User,稍后我可以将其解包。这样我的身份验证器可以存储其他属性。正如我所说,这不是我问题的答案,只是一个丑陋的解决方法。 -
这是一个有趣的用例。您应该在 Public Issue Tracker 中为 App Engine 提出功能请求!
-
刚刚测试过,您绝对可以将 User 子类化以包含您想要的任何私有字段。只需使用类继承多态性从 Authenticator 方法返回该类型的对象,而无需更改方法签名中默认 User 的类型。
-
非常好的解决方案@Nick。如果您将此作为答案发布,我会给您应得的荣誉。
标签: google-app-engine authentication google-oauth google-cloud-endpoints facebook-authentication