此处使用REST Java API请求OAuth 2.0令牌

如何解决此处使用REST Java API请求OAuth 2.0令牌

我正在尝试使用Rest服务java向Here API请求令牌,以获得OAuth 2.0令牌证书。我被限制在请求级别,并且始终遇到相同的错误,但是根据文档,我没有做错任何事情。

这是REST Java中发出请求的必要代码。 我尝试了以下代码。

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

public class here {

private static final String HMAC_SHA256 = "HmacSHA256";
private static final String ENC = "UTF-8";
private static Base64 base64 = new Base64();
private static String key = "MyKeyID"; // here.access.key.id from credential file
private static String secret = "MySecretKey" //here.access.key.secret
public static void main(String[] args) {


 HttpClient httpClient = new DefaultHttpClient();
 long value = (System.currentTimeMillis() / 1000);
 int unique = (int) (Math.random() * 100000000);
 
 // These params should ordered in key
    List<NameValuePair> qparams = new ArrayList<NameValuePair>();
    qparams.add(new BasicNameValuePair("grant_type","client_credentials"));
    qparams.add(new BasicNameValuePair("oauth_consumer_key","MY_KEY_ID"));
    qparams.add(new BasicNameValuePair("oauth_nonce",""
            + unique));
    qparams.add(new BasicNameValuePair("oauth_signature_method","HMAC-SHA256"));
    qparams.add(new BasicNameValuePair("oauth_timestamp",""
            + value));
    qparams.add(new BasicNameValuePair("oauth_version","1.0"));
    System.err.println("query param->>>");
    
    // creating authentication signature
    String  signature = getSignature(URLEncoder.encode(
                    "https://account.api.here.com/oauth2/token",ENC),URLEncoder.encode(URLEncodedUtils.format(qparams,ENC));
  
    
   // comibining the params
    String authHeader = "OAuth oauth_consumer_key=MY_KEY,"
           +"oauth_nonce="+unique+","
           +"oauth_signature="+signature+","
           +"oauth_signature_method=HMAC-SHA256,"
           +"oauth_timestamp="+value+","
           +"oauth_version=1.0";
   
    
    HttpPost httpPost = new HttpPost("https://account.api.here.com/oauth2/token");
    httpPost.addHeader("Content-Type","application/x-www-form-urlencoded");
    httpPost.setHeader(HttpHeaders.AUTHORIZATION,authHeader);
   
    String grant_type = "client_credentials";
    StringEntity input = new StringEntity("grant_type=" + grant_type);
    httpPost.setEntity(input);
    // output the response content.
    System.out.println("Token and Token Secrect:");
    
    HttpResponse    response = httpClient.execute(httpPost);
    HttpEntity entity = response.getEntity();
    
    if (entity != null) {
        
        InputStream instream = entity.getContent();
        int len;
        byte[] tmp = new byte[2048];
        try {
            while ((len = instream.read(tmp)) != -1) {
                System.out.println(new String(tmp,len,ENC));
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


}

private static String getSignature(String url,String params) throws UnsupportedEncodingException,NoSuchAlgorithmException,InvalidKeyException {
    
    StringBuilder base = new StringBuilder();
    base.append("POST&");
    base.append(url);
    base.append("&");
    base.append(params);
    System.out.println("Stirng for oauth_signature generation:" + base);
    // yea,don't ask me why,it is needed to append a "&" to the end of
    // secret key.
    byte[] keyBytes = (secret + "&").getBytes(ENC);

    SecretKey key = new SecretKeySpec(keyBytes,HMAC_SHA256);

    Mac mac = Mac.getInstance(HMAC_SHA256);
    mac.init(key);

    // encode it,base64 it,change it to string and return.
    return new String(base64.encode(mac.doFinal(base.toString().getBytes(
            ENC))),ENC).trim();

}}

这是我不断得到的错误:

{“ errorId”:“ ERROR-27b88f02-5d76-40ea-81d5-de6e70cf8464”,“ httpStatus”:401,“ errorCode”:401205,“ message”:“标头中不支持的签名方法。需要HMAC-SHA256 “,” error“:” invalid_request“,” error_description“:” errorCode:'401205'。标头中不支持的签名方法。需要HMAC-SHA256“}

根据文档https://developer.here.com/documentation/authentication/dev_guide/topics/using-aaa-javasdk-or-3rd-party-libraries.html

我根据上述api文档开发了代码,但没有得到结果。 有人知道如何解决此问题吗?

解决方法

我尝试了这段代码

 HttpClient httpClient = HttpClientBuilder.create().build();
         String headers = "grant_type=client_credentials"+"&oauth_consumer_key=mykey"+"&oauth_nonce=uniquevalue"+"&oauth_signature_method=HMAC-SHA256"+"&oauth_timestamp=timestamp"+"&oauth_version=1.0";
          String combine = "POST"+"\n&"+URLEncoder.encode("https://account.api.here.com/oauth2/token",StandardCharsets.UTF_8.toString())+"\n&"+URLEncoder.encode(headers,StandardCharsets.UTF_8.toString());
          Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
          SecretKeySpec secret_key = new SecretKeySpec(("mysecretkey &").getBytes(),"HmacSHA256");
          sha256_HMAC.init(secret_key);
          String signature = Base64.encodeBase64String(sha256_HMAC.doFinal(combine.getBytes()));
           String authHeader = "OAuth "
                   + "oauth_consumer_key=\"X1E2a0ElfkaHx7aezqN5Hg-1234\","
                   +"oauth_nonce=\"uniquevalue\","
                   +"oauth_signature=\""+signature+"\","
                   +"oauth_signature_method=\"HMAC-SHA256\","
                   +"oauth_timestamp=\"timestamp\","
                   +"oauth_version=\"1.0\"";
            HttpPost httpPost = new HttpPost("https://account.api.here.com/oauth2/token");
            httpPost.addHeader("Content-Type","application/x-www-form-urlencoded");
            httpPost.addHeader("Host","account.api.here.com");
            httpPost.setHeader(HttpHeaders.AUTHORIZATION,authHeader);
            StringEntity input = new StringEntity("grant_type=" + "client_credentials");
            httpPost.setEntity(input);
            HttpResponse    response = httpClient.execute(httpPost);
            HttpEntity entity = response.getEntity();
            

它显示了另一个错误,例如errorCode:'401202'。无效的客户端授权标头,要求签署的请求格式。请给一些建议,如何索取代币?

,

您能否尝试将代码修改为-

//创建身份验证签名

字符串签名= getSignature(URLEncoder.encode(
“ https://account.api.here.com/oauth2/token",ENC), URLEncoder.encode(URLEncodedUtils.format(qparams,ENC),ENC));

//合并参数

String authHeader =“ OAuth oauth_consumer_key = MY_KEY,” +“ oauth_nonce =” + unique +“,” +“ oauth_signature =” + URLEncoder.encode(signature,“ UTF-8”)+“,” +“ oauth_signature_method = HMAC-SHA256” +“ oauth_timestamp =” + value +“,” +“ oauth_version = 1.0”;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-