首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用OAuth2RestTemplate?

如何使用OAuth2RestTemplate?
EN

Stack Overflow用户
提问于 2015-01-09 23:50:49
回答 1查看 141.7K关注 0票数 50

我正在尝试理解如何使用OAuth2RestTemplate对象来使用我的OAuth2安全REST服务(它运行在不同的项目下,假设也运行在不同的服务器上,等等)。

我的REST服务的一个例子是:

http://localhost:8082/app/helloworld

访问此URL的->会生成错误,因为我未通过身份验证

要请求令牌,我将转到:

http://localhost:8082/app/oauth/token?grant_type=password&client_id=restapp&client_secret=restapp&username=**USERNAME**&password=**PASSWORD**

收到令牌后,我可以使用以下URL (插入的示例令牌)连接到REST API

http://localhost:8082/app/helloworld/?access_token=**4855f557-c6ee-43b7-8617-c24591965206**

现在我的问题是,我如何实现第二个可以使用这个OAuth2安全REST API的应用程序?我真的没有找到任何可行的例子,你提供用户名和密码(例如,来自登录表单),然后生成一个令牌,可以重用该令牌来从REST API获取数据。

我目前使用以下对象进行了尝试:

BaseOAuth2ProtectedResourceDetails baseOAuth2ProtectedResourceDetails =  new BaseOAuth2ProtectedResourceDetails();
baseOAuth2ProtectedResourceDetails.setClientId("restapp");
baseOAuth2ProtectedResourceDetails.setClientSecret("restapp");
baseOAuth2ProtectedResourceDetails.setGrantType("password");
// how to set user name and password ???

DefaultAccessTokenRequest accessTokenRequest = new DefaultAccessTokenRequest();
OAuth2ClientContext oAuth2ClientContext = new DefaultOAuth2ClientContext(accessTokenRequest());

OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(baseOAuth2ProtectedResourceDetails,oAuth2ClientContext);

但这是行不通的:

任何想法,链接到工作的例子或教程是非常感谢。

EN

回答 1

Stack Overflow用户

发布于 2018-02-03 00:18:59

在@mariubog (https://stackoverflow.com/a/27882337/1279002)的回答中,我也使用了密码授予类型,如示例所示,但需要将客户端身份验证方案设置为form。password的终结点不支持作用域,并且不需要设置授权类型,因为ResourceOwnerPasswordResourceDetails对象会在构造函数中自行设置授权类型。

..。

public ResourceOwnerPasswordResourceDetails() {
    setGrantType("password");
}

..。

对我来说最关键的事情是,如果没有设置resource.setClientAuthenticationScheme(AuthenticationScheme.form);,client_id和client_secret不会被添加到表单对象中以在正文中发布。

查看中的开关:org.springframework.security.oauth2.client.token.auth.DefaultClientAuthenticationHandler.authenticateTokenRequest()

最后,当连接到Salesforce端点时,需要将密码令牌附加到密码上。

@EnableOAuth2Client
@Configuration
class MyConfig {

@Value("${security.oauth2.client.access-token-uri}")
private String tokenUrl;

@Value("${security.oauth2.client.client-id}")
private String clientId;

@Value("${security.oauth2.client.client-secret}")
private String clientSecret;

@Value("${security.oauth2.client.password-token}")
private String passwordToken;

@Value("${security.user.name}")
private String username;

@Value("${security.user.password}")
private String password;


@Bean
protected OAuth2ProtectedResourceDetails resource() {

    ResourceOwnerPasswordResourceDetails resource = new ResourceOwnerPasswordResourceDetails();

    resource.setAccessTokenUri(tokenUrl);
    resource.setClientId(clientId);
    resource.setClientSecret(clientSecret);
    resource.setClientAuthenticationScheme(AuthenticationScheme.form);
    resource.setUsername(username);
    resource.setPassword(password + passwordToken);

    return resource;
}

@Bean
 public OAuth2RestOperations restTemplate() {
    return new OAuth2RestTemplate(resource(), new DefaultOAuth2ClientContext(new DefaultAccessTokenRequest()));
    }
}


@Service
@SuppressWarnings("unchecked")
class MyService {
    @Autowired
    private OAuth2RestOperations restTemplate;

    public MyService() {
        restTemplate.getAccessToken();
    }
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27864295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档