42

我正在使用Play 2.0Scala开发一个应用程序,它公开了一些 REST API。这些 API 将被不同的应用程序、Web、移动或桌面使用,因此 OAuth 协议 (OAuth2) 似乎是最合适的。

此外,我最初会使用外部 OAuth 提供程序,例如 Facebook。

我的问题是:授权单个 REST 调用的确切流程是什么?每次调用在服务器端我应该期待什么以及我应该与外部提供商检查什么?

使用 OAuth1 我知道客户端发送了带有所有签名请求的令牌,但使用 Oauth2 我认为不是这样,我想如果令牌未签名是不可信的,因此我认为这不是流程。

4

7 回答 7

17

您可以使用名为 SecureSocial 的模块。

https://github.com/jaliss/securesocial/

这个非常精致,Play 社区中的许多人似乎都知道/使用这个模块。

对于授权可能有用。 https://github.com/schaloner/deadbolt-2/

对于端到端 scala 的东西, https://github.com/t2v/play20-auth

于 2012-07-13T05:16:41.907 回答
16

我将 Apache Amber 移植到 Play2 Scala,这里是链接: https ://github.com/cleanyong/oauth2play2scala

移植 Apache Amber 的原因是:

  1. 它已经过测试
  2. 比自制的好
  3. 它适合 Play2 Scala API
  4. 便于使用
  5. 不打扰

如果你想在你的站点上设置 oauth2 服务器,你可以尝试使用我的端口。它有文件。

于 2013-08-10T02:50:30.177 回答
7

基本上,标准流程如下:

  1. 在每个请求中,检查 cookie(Play! 方言中的“会话”)是否包含 id
  2. 如果没有,请让用户向提供者(Facebook 或其他)进行身份验证
  3. 如果没问题,提供者将返回一个 id,将此 id 保存在您的持久性系统(注册)和当前 cookie/会话中
  4. 在下一个请求中,检查 cookie/session 中是否存在 id 并对应于持久性系统中的现有用户
  5. 要“注销”,只需清除 cookie/会话

如果您想了解更多详细信息,请询问:-)

于 2012-07-15T12:21:42.527 回答
4

OAuth 是一种授权协议,因此如果您正在查看身份验证解决方案,这可能不是一个。

您的问题是 API 的使用者将是各种应用程序。这导致了两种情况,

 1. Where there is no end user involved (grant_type: client_credential)  
 2. Where end-user can consume these APIs on multiple Application (Owned by your Org) (grant_type: implicit/password)
 3. Where end-user can consume these APIs via third Party Applications.(authrization_code)

要支持 OAuth 生态系统,您需要一个密钥管理系统。到,

  1. 为应用程序生成密钥/秘密。
  2. 生成 AccessToken/Refresh_token/authorization_code

现在来到你必须暴露的端点,

3-Legged OAuth
GET     /authorize  authorize{entry point/ initiate oauth}  
    Sample Call: http://YourAPIService.com/authorize?response_type=code&client_id=GG1IbStzH45ajx9cEeILqjFt&scope=READ&redirect_uri=www.google.com

    GET     /login  login (Call Page for login App, 302 redirected from /authorize)     
Sample Call: http://YourAPIService.com/v1/oauth20/login?response_type=code&client_id=GG1IbStzH45ajx9cEeILqjFt&scope=READ&redirect_uri=www.google.com

    POST    /dologin    consentPage     http://YourAPIService.com/dologin 
    Submit the credential, On success, render the application page 

    POST    /grantpermission    consentSubmission   http://YourAPIService.com/grantpermission
Permission has been granted/declined. Send a 302 to generate authorization_code 

    GET      /code          AuthorizationCode {To generate auth code}
    Sample Call: http://YourAPIService.com/code?client_id=GG1IbStzH45ajx9cEeILqjFt&response_type=code&user_id=user@YourAPIService.com&redirect_uri=www.google.com

    POST    /token  GenerateAccessToken     http://YourAPIService.com/token 
Sample call: http://kohls-test.mars.apigee.net/v1/oauth20/token
Header: Authorization: Basic R0cxSWJTdHpINDVhang5Y0VlSUxxalFj its generated with apps Api Key & Secret.
Payload: 
grant_type=authorization_code&scope=x&redirect_uri=www.google.com&code=abc123

否则最简单/最可靠的解决方案是 http://apigee.com

您可以使用 Apigee 现有的 OAuth 生态系统。

于 2013-04-17T17:33:42.530 回答
1

我自己没有尝试过,但是tuxdna模块怎么样。正如在 github repo 中所说:

使用 Play 的 OAuth2 服务器!2.0 框架

我希望这有帮助

于 2015-03-18T13:33:40.073 回答
0

我有同样的问题,我所做的(我想这不是最好的解决方案)是将 REST 服务器的方法放在 "@Security.Authenticated(Secure.class)" 内,并使用会话 cookie(它也在后端的哈希表中注册)。会话 cookie 是在用户登录后生成的

I post code:

package controllers;

import ...;

@Security.Authenticated(Secured.class)
public class ExampleController extends Controller {

    public static String currentUserEmail() {

 ... return json after checking that 'session("id")' exists in the loggedin users hash table... 

}

package controllers;

import ...;

public class Secure extends Security.Authenticator {

    @Override
    public String getUserId(Http.Context context) {
        return context.session().get("user_id");
    }
...
}

希望这可以帮助

于 2013-05-11T01:35:46.257 回答
0

您可以尝试使用此模板进行游戏,将 OAuth 2 提供程序与 Deadbolt 相结合。OAuth 范围映射到 Deadbolt 权限和角色概念。它使用 Redis 存储访问令牌,并在您配置的时间段后自动过期。

https://github.com/lglossman/scala-oauth2-deadbolt-redis

于 2016-07-12T19:27:45.810 回答