Grails Rest API与用于移动应用的OAuth

Grails Rest API与用于移动应用的OAuth,api,rest,grails,mobile,oauth,Api,Rest,Grails,Mobile,Oauth,TL;DR:从编辑1读取 我试图找到一个解决方案来实现身份验证,特别是针对我的RESTAPI的OAuth,它将被移动应用程序使用 我发现了这个流行的插件(Spring Security Rest): 但问题是它是为javascript前端应用程序设计的,因此它需要一个回调url到我的前端来传递生成的令牌(如图中所示) 对于移动应用程序,我如何才能做到这一点?是否有其他插件或设计,我可以实现这一点? 我觉得奇怪的是,在Grails或Spring中,关于无状态OAuth的插件或教程并不多,但有大量

TL;DR:从编辑1读取

我试图找到一个解决方案来实现身份验证,特别是针对我的RESTAPI的OAuth,它将被移动应用程序使用

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

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

对于移动应用程序,我如何才能做到这一点?是否有其他插件或设计,我可以实现这一点? 我觉得奇怪的是,在Grails或Spring中,关于无状态OAuth的插件或教程并不多,但有大量的移动应用程序使用它

下面是一个用例示例:

  • 用户打开移动应用程序
  • 用户通过移动应用程序登录facebook
  • 用户向api/orders发出请求,该请求将只返回他的订单
谁来处理这件事中的OAuth部分?插件上显示的图表中的流程无法与移动应用程序一起工作,因此移动应用程序是否应该授权到facebook,获取令牌存储,然后将其传递到web应用程序

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

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

如果是的话,是否有一种标准的方法来用Grails实现这一点

编辑2:现在我了解了流程,我需要将登录部分与SpringSecurityREST插件集成(该插件已经处理了所有其他事情)。 下面是我想与插件集成的代码,但我不知道在插件中修改的位置或内容:

    // 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)

    }

}

下面是我们如何使用GrailsREST插件解决facebook连接的问题

  • 客户端向facebook发出请求并获取FBUID
  • 客户端向服务器发送FBUID以及其他详细信息,如电子邮件等(验证后从facebook获取的任何信息)
    • 服务器接收fbuid并使用facebook重新验证fbuid然后尝试在数据库中查找具有此fbuid的用户
    • 如果用户发现,请使用电子邮件登录用户并返回令牌
    • 如果找不到用户,请注册并登录该用户,并发送回令牌作为响应
  • 客户端使用从第2步返回的令牌进行任何后续调用

  • 如何确保FB UID是正确的?您是否在注册或登录用户之前通过调用facebook api进行检查?我们在客户端成功调用facebook api FB应返回uid。谢谢。你能快速告诉我你是如何修改SpringSecurityREST插件来处理这个流的吗?(尤其是登录部分)。你有没有推荐一个与fb交流的插件?这是我第一次用auth构建一个web应用程序(甚至是一个web应用程序…),你有没有运气让它工作?