【问题标题】:Grails Rest API with OAuth for Mobile App带有 OAuth 的 Grails Rest API 用于移动应用程序
【发布时间】:2015-02-09 12:06:56
【问题描述】:

TL;DR:从 EDIT 1 读取

我正在尝试寻找如何实现身份验证的解决方案,尤其是用于移动应用程序使用的我的 rest api 的 OAuth。

我发现了这个流行的插件Spring Security Rest):

http://alvarosanchez.github.io/grails-spring-security-rest/docs/guide/single.html#oauth1

但问题是它是为 javascript 前端应用程序设计的,所以它需要一个 callback url 到我的前端来传递生成的令牌(如图所示)。

对于移动应用程序,我该怎么做?我可以为此实现另一个插件或设计吗? 我觉得奇怪的是,在 Grails 或 Spring 中并没有很多关于无状态 OAuth 的插件或教程,但是有大量的移动应用程序使用它。

这是一个用例示例:

  • 用户打开移动应用程序。
  • 用户在移动应用上使用 facebook 登录。
  • 用户向 api/orders 发出请求,这将只返回他的订单。

谁应该处理其中的 OAuth 部分?插件上显示的图表中的流程不适用于移动应用程序,因此移动应用程序是否应该向 facebook 验证,获取令牌存储然后将其传递给网络应用程序?

我想了解在这种情况下正确的设计/流程是什么,以及是否有插件或使用 grails 实现它的方法。

编辑:这是正确的流程吗?

如果是,是否有使用 Grails 实现此功能的标准方法?

编辑 2: 现在我了解了流程,我需要将登录部分与 Spring 安全休息插件(已经处理其他所有内容)集成。 这是我想与插件集成的代码,但我不知道在插件中的何处或修改什么:

    // api/auth/fb
def auth(){

    //Extract fb_access_token
    String fbAccessToken = request.JSON.?fb_access_token

    //Call https://graph.facebook.com/me?access_token=fbAccessToken
    def userInfo = facebookService. ... (fbAcessToken) //Method to use in the plugin

    //Verify if the userInfo contains an error/doesn't contain a fbId
    if(userInfo.getFbId() == null ){
        respond unauthorized() // 401, Invalid access token
    }
    //Verify if this token is for our app
    else if(userInfo.getAppSecret() != System.env.getParameter("appSecret")){
        respond unauthorized() //401, token not for this app
    }
    //Register or login
    else{
        User user = User.findByFbId(userInfo.getFbId())
        if(user == null){
            facebookService.registerUser(userInfo) //Custom method implemented in the service
        }
        else{
            FbToken fbToken = new FbToken(userInfo.getToken(), userInfo.getExpiration())
            user.setFbAccessToken(fbToken)
        }

        //Login the user with spring security and let it handle the rest (token creation => storage => http answer)

    }

}

【问题讨论】:

  • 你最后有没有运气让它工作?

标签: api rest grails mobile oauth


【解决方案1】:

以下是我们使用 grails rest 插件处理 facebook connect 的方法。

  1. 客户端向 facebook 发出请求并获取 fb uid。
  2. 客户端将 fb uid 连同其他详细信息(例如电子邮件等)发送到服务器(在身份验证后从 facebook 获取的任何内容)
    • 服务器接收 fb uid 并使用 facebook 重新验证 fbuid,然后尝试在数据库中查找具有此 fbuid 的用户。
    • 如果发现用户使用电子邮件登录用户并返回令牌。
    • 如果未找到用户,请注册并登录用户并发回令牌作为响应。
  3. 客户端使用从第二步返回的令牌进行任何后续调用。

【讨论】:

  • 如何确保 FB UID 正确?在注册或登录用户之前,您是否通过调用 facebook api 来检查它?
  • 成功后我们在客户端调用facebook API FB应该返回uid。
  • 谢谢。您能快速告诉我您是如何修改 spring security rest 插件以使用此流程的吗? (尤其是登录部分)。你有推荐的插件来与 fb 交流吗?这是我第一次使用 auth 构建 Web 应用程序(甚至是 Web 应用程序......)
猜你喜欢
  • 2013-11-27
  • 2013-03-16
  • 1970-01-01
  • 2011-12-18
  • 2021-01-04
  • 2012-05-27
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多