我对Oauth很新,但需要学习如何在Java中完成它,以便我们可以验证REST请求。这是我到目前为止所做的。
经过一番阅读后,我决定尝试ScribeJava。我创建了一个实现DefaultApi10a
的自定义API并指向我们的端点。我设置了这样的服务:
final OAuth10aService service = new ServiceBuilder()
.apiKey("key")
.apiSecret("secret")
.build(TestApi.instance());
这不起作用。在进行了大量挖掘之后,似乎因为我们使用的是自签名证书,我无法访问远程主机。我收到一个错误,说连接到远程服务时出现问题。 ScribeJava似乎没有办法禁用使用自签名证书的验证。
由于我们希望能够使用请求上的授权标头进行身份验证,我将如何使用Java库生成标头部分?我环顾四周,找不到任何东西。
作为参考,我们使用Python成功地使用Python做了很好的Oauth REST调用:
headeroauth = OAuth1(Oauth1Key, Oauth1Secret,
signature_type='auth_header')
myResponse = requests.get("endpoint_here", auth=headeroauth, verify=False)
关于如何使用Java完成同样的事情的任何输入?
答案 0 :(得分:4)
我想用很多库来创建OAUTH登录。但在我看来,最简单的是JWT(Json Web Token)。您可以在此处找到使用说明:
https://github.com/auth0/java-jwt
基本上你要做的就是按照以下三个步骤作为登录流程:
1)当用户尝试登录时,验证他的用户名和密码,如果成功,则生成一个JWT签名,其中密钥存储在您的后备中。图书馆本身非常明确如何签署Json Web Token对象。
2)返回签名给用户的令牌,用户将在您需要身份验证的每个REST服务/端点的每个请求的Header内向您发送此令牌
3)您首先使用从用户处获得的令牌来验证签名(库也非常清楚如何执行此操作)。如果验证通过意味着令牌是可信任的,您可以继续使用您的应用程序。
关于JWT的一个很酷的事情是,您可以将非私有信息放在对您有用的令牌中,这样您就不必一直在数据库中查找它。例如,userId,用户电子邮件,令牌时间到期本身等
显然这些数据将作为base-64字符串传递给Token中的用户,所以可能如果他足够聪明,他可以解码它并看看里面是什么(他会看到他的userId,用户名或你放置的任何内容在令牌内部),但他无法处理的是签名。因此,如果他试图玩智能并更改令牌内的任何值并编码一个新的来破解你,你的令牌签名验证将失败,你可以继续你决定的任何惩罚..
在这里,您可以看到解码和编码的JWT内容的实例。
希望这有帮助!
答案 1 :(得分:0)
您可以设置标题如下。
HttpPost post = new HttpPost("someurl");
post.addHeader(key1, value1));
post.addHeader(key2, value2));
访问Setting Header in request header,了解有关在休息请求中设置标头的详细信息。