保护Play框架和OAuth2上的REST API

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

另外,我会最初使用Facebook等外部OAuth提供程序。

我的问题是:授权个别REST调用的确切stream程是什么? 我应该期待在服务器端每次打电话,我应该与外部提供商检查什么?

使用OAuth1,我知道客户端发送了带有所有签名请求的令牌,但是使用Oauth2我认为不是这样,我想如果一个令牌没有签名是不可信的,所以我不认为这是stream量。

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

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

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

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

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

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

端口Apache琥珀的原因是:

  1. 它已经过testing
  2. 比自制的好
  3. 它适合Play2 Scala API
  4. 使用方便
  5. 没有侵入性

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

基本上,标准stream程如下:

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

如果你想要更多的细节,只需要问:-)

OAuth是一个授权协议,所以如果你正在寻找一个authentication解决scheme,这可能不是一个。

你有问题说API的使用者会是各种各样的应用程序。 这导致2场景,

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生态系统,您需要一个密钥pipe理系统。 至,

  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 

否则,最简单/健壮的解决scheme将是, http://apigee.com

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

我没有自己尝试,但如何tuxdna模块。 在github回购中,它说:

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

我希望这有帮助

我有同样的问题,我做了什么(我想这不是最好的解决scheme)是放置REST服务器的方法,在“@ Security.Authenticated(Secure.class)”,并使用会话cookie这也是在后台的哈希表中注册的)。 会话cookie是在用户login后生成的

 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"); } ... } 

希望这可以帮助

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

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