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