保护Play框架和OAuth2上的REST API
我正在开发一个Play 2.0和Scala的应用程序,它公开了一些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琥珀的原因是:
- 它已经过testing
- 比自制的好
- 它适合Play2 Scala API
- 使用方便
- 没有侵入性
如果你想在你的网站上设置oauth2服务器,你可以尝试使用我的端口。 它有文件。
基本上,标准stream程如下:
- 在每个请求中,如果它包含一个id,请检查cookie(Play!方言中的“会话”)
- 如果没有,请求用户使用提供者(Facebook或其他)进行身份validation
- 如果可以,提供者将返回一个id,将这个id保存在持久化系统(注册)中,并保存在当前的cookie / session中
- 在接下来的请求中,检查cookie / session中是否存在id,并且对应于持久性系统中的现有用户
- 要“注销”,只需清除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理系统。 至,
- 为应用程序生成密钥/秘密
- 生成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的时间段过后自动过期。