如何在 devserver 上使用 Oauth 测试 Cloud Endpoints

Posted

技术标签:

【中文标题】如何在 devserver 上使用 Oauth 测试 Cloud Endpoints【英文标题】:How do I test Cloud Endpoints with Oauth on devserver 【发布时间】:2013-10-07 16:50:52 【问题描述】:

我的应用使用 Oauthed Cloud Endpoints,并且在生产环境中运行良好。

我的问题是在本地开发服务器上,我的用户用户始终设置为 example@example.com,即使我已经完成了通常的身份验证、访问代码等等等等等有一个有效的认证用户。

我知道 example@example.com 在我让 oauth 正常工作之前测试 oauth 端点很有用,但由于我的应用程序正在工作,我宁愿在那里看到实际用户。

具体来说,我的端点方法是

@ApiMethod(name = "insertEmp"), etc
public Emp insertEmp(User user, Emp emp) 
      System.out.println(user.getEmail());  // (A) log "appengine" email
      System.out.println(OAuthServiceFactory.getOAuthService().getCurrentUser().getEmail(); // (B) log authed email

       ...

部署后,一切正常,(A) 和 (B) 都记录经过身份验证的用户 (my.email@gmail.com)。

在我的本地开发服务器上进行测试时,(A) 始终记录“example@example.com”,即使我已经完成了 Oauth 序列并且拥有一个有效的、经过身份验证的用户,并且 (B) 记录了 my.email@gmail .com。所以我可以做高保真测试,我需要用户是真正的认证用户。

那么简单来说,我如何让 (A) 和 (B) 相同?

【问题讨论】:

【参考方案1】:

好像做不到。通过将以下代码放在我的 Endpoint 方法的顶部,我最终围绕它进行了编码。

if ("example@example.com".equalsIgnoreCase(user.getEmail()) 
    user = new User(OAuthServiceFactory.getOAuthService().getCurrentUser().getEmail(),"foo");

所以现在,即使在开发服务器上,用户电子邮件与 Oauth 电子邮件匹配。

【讨论】:

对我不起作用...使用 appengine 1.9.3 并且电子邮件继续相同:example@example.com 您还能收到真正的电子邮件吗?我以用户身份返回 null,如果我调用 OAuthServiceFactory.getOa..().getCurrentUser() 我会得到 example@example.com 这里也一样。我为端点返回的用户和​​ OAuthServiceFactory.getOAuthService().getCurrentUser() 获取 example@example.com 我最终放弃了云端点。麻烦多于其价值 @pinoyyid 你有没有写下你为什么放弃端点?【参考方案2】:

这并不容易。您必须在 API 控制台中进行设置。在这里,您将能够添加“localhost”(http://localhost/)然后您可以通过 Google 进行身份验证,即使您在 localhost 上运行您的应用程序以进行开发。 我已经广泛使用它,它工作正常 友情链接:https://code.google.com/apis/console/ 请记住,您在此处使用的 ID 完全独立于您的 appengine ID。 我花了几个小时才弄明白。

【讨论】:

谢谢,但这不是我问题的答案。我已经解决了将本地服务器配置到 API 控制台的问题,并且 Oauth 正在 工作。我的问题是,即使 Oauth 正常工作,Cloud Endpoints 也会忽略它并将 example@example.com 替换为经过身份验证的用户 @pinoyyid :Google 在其文档“重要提示:如果后端 API 受 Auth 保护,您的客户端必须提供支持,如上文添加 OAuth 2.0 的身份验证支持中所述。但是,当在本地开发服务器上运行时,不会显示凭据页面来响应用户的登录尝试。相反,登录只是发生,授予用户对受保护 API 的访问权限,并且返回的用户始终为 example@example。 com"cloud.google.com/appengine/docs/java/endpoints/…【参考方案3】:

问题是,当您在本地进行身份验证时,您并没有通过 Google 服务器进行身份验证,因此对您的用户进行身份验证实际上并没有在本地进行。

当您尝试模拟登录时,Google 始终提供 example@example.com 用户,它基本上发生在所有服务中,例如当您通过您的 Google 帐户在任何网站上提供登录时(例如使用 GWT和 App 引擎)。

如果您使用真实用户进行测试,或者您将 example@example.com 用户视为您的用户,您的网站会有什么不同?

【讨论】:

但是...我 am 正在浏览谷歌服务器。如果我从我的 servlet 调用 oauth 端点,我将获得真正的、经过身份验证的谷歌用户。问题是 devserver 中的 appengine/endpoint 代码忽略了它。我无法进行高保真测试,因为我想测试将用户从未知状态带到拥有能够访问 Google API 的存储凭证的入职流程。这受到阻碍,因为我的 CE 端点类不是真实用户,而是假用户。 我已更新问题以更详细地展示差异。【参考方案4】:

在你的端点 API 中你需要这个

ApiMethod ( name="YourEndPointName", path="yourPath",
            clientIds="YourId.apps.googleusercontent.com",
                    scopes =    "https://www.googleapis.com/auth/userinfo.profile" )

然后在被调用的方法中,您将拥有来自 GAPI 的 User 对象。 使用它从谷歌用户对象中获取实际的电子邮件,如下所示

public myEndPointMethod( Foo foo, User user )
    email = user.getEmail();

【讨论】:

请阅读问题。我已经有了!问题是 user.getEmail() 返回的值。 此外,范围应为developers.google.com/+/api/oauth#profile 上声明的“电子邮件”,因为 userionfo.profile 不包含用户的电子邮件,因此用户参数将为空。 + 您提到的范围已被弃用。 什么是'YourId'?我有 myapp-xxxx.appspot.com - 我觉得我已经接近但有点卡住了 对不起,这是很久以前的事了,我没有源代码了。所以我帮不了你。可以是你的 google id 吗?【参考方案5】:

我用来自 UserFactory 的用户替换了 Oauth2 用户 (example@example.com),它工作正常。我使用这种方法来验证所有 API 身份验证的 API 请求的用户。

public static User isAuthenticated(User user) throws OAuthRequestException

    if(user == null)
        throw new OAuthRequestException("Please login before making requests");
     
    if(SystemProperty.environment.value() ==
            SystemProperty.Environment.Value.Development && "example@example.com".equalsIgnoreCase(user.getEmail()) ) 

        //Replace the user from the user factory here.
        user = UserServiceFactory.getUserService().getCurrentUser();

    
    return user;


【讨论】:

这不起作用。我从 UserServiceFactory.getUserService().getCurrentUser() 和 example@example.com 从 OAuthServiceFactory.getUserService() 获得 null【参考方案6】:

使用 go 运行时,我使用了这个函数来获取一个在开发服务器和生产服务器上都可以使用的用户:

func currentUser(c context.Context) *user.User 
    const scope = "https://www.googleapis.com/auth/userinfo.email"
    const devClient = "123456789.apps.googleusercontent.com"

    allowedClients := map[string]bool
        "client-id-here.apps.googleusercontent.com": true,
        devClient: true,                // dev server
    

    usr, err := user.CurrentOAuth(c, scope)
    if err != nil 
        log.Printf("Warning: Could not get current user: %s", err)
        return nil
    

    if !allowedClients[usr.ClientID] 
        log.Printf("Warning: Unauthorized client connecting with the server: %s", usr.ClientID)
        return nil
    

    if (usr.ClientID == devClient) 
        usr = user.Current(c)           // replace with a more interesting user for dev server
    
    return usr

这将使用使用http://localhost:8080/_ah/login 输入的开发服务器登录信息

【讨论】:

【参考方案7】:

这是不可能的。 我使用另一个端点来替换当前会话中的 user_id。

【讨论】:

以上是关于如何在 devserver 上使用 Oauth 测试 Cloud Endpoints的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Easyphp Devserver 16.1.1 上激活 Curl

Webpack devserver代理,如何避免401错误?

在 vuepress 中,我如何以及在哪里设置 webpack devServer?

如何让 Eclipse 和 mvn appengine:devserver 相互通信?

为暂存环境构建时如何忽略 vue.config.js 中的 devServer 设置?

如何修复 Vue 3 中的“错误:未知选项:devServer”[关闭]