最近我一直在阅读关于OAuth2,OpenID Connect等的内容.但是在使用什么时以及如何实现它时仍然非常迷失.我正在考虑使用NodeJS.
让我们说我想创建一个博客服务.此服务将公开API供客户使用."客户端"包括管理CMS.我认为将服务器和客户端(UI)分离会很好.我可以在不触及服务器的情况下更改UI.这些客户端可能是单页Web应用程序.
好的第一个问题:在这个例子中,我应该使用OAuth2吗?为什么?是因为我授权管理员应用程序通过博客访问?
自SPA以来,我认为正确的策略是OAuth2 Implicit Flow?
对于每个应用程序,例如.admin cms,我将生成一个传递给auth服务器的AppID.没有应用秘密是否正确?
在这种情况下是否可以使用谷歌登录(而不是用户名/密码)?OpenID连接是否可以这样做?
如何在NodeJS中实现所有这些?我看到https://github.com/jaredhanson/oauth2orize,但我没有看到如何实现隐式流程.
我确实看到了一个非官方的例子https://github.com/reneweb/oauth2orize_implicit_example/blob/master/app.js,但我在想的是为什么需要会话?我认为令牌的目标之一是服务器可以无国籍?
我也想知道,我什么时候应该使用API密钥/秘密身份验证?
我目前正在开发一个用于Oauth2身份验证的spring应用程序,但是我在实现自定义ClientDetailsService时遇到了一些问题.
我不能使用常见的inMemory ou jdbc clientDetailsService,因为客户端信息没有存储在我的应用程序中,我从外部Web服务获取它们.但是当我设置自定义ClientDetailService时,我不再获得access_confirmation页面(我得到一个空白页面).
为了向您展示我的问题,我不使用我的应用程序,而是使用官方spring中的vanilla测试 - security-oauth项目spring-security-oauth
这是应用程序代码:
@SpringBootApplication
@EnableResourceServer
@RestController
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@RequestMapping("/")
public String home() {
return "Hello World";
}
@RequestMapping(value = "/", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public String create(@RequestBody MultiValueMap<String, String> map) {
return "OK";
}
@Configuration
@EnableAuthorizationServer
protected static class OAuth2Config extends AuthorizationServerConfigurerAdapter {
@Autowired
private AuthenticationManager authenticationManager;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(authenticationManager);
}
@Override
public void configure(AuthorizationServerSecurityConfigurer security) …Run Code Online (Sandbox Code Playgroud) 我正在使用spring-oauth 2.0库来创建OAuth 2.0客户端,我可以使用该客户端从正在运行的OAuth 2.0授权服务器获取和访问令牌.客户端配置如下:
@Configuration
@EnableOAuth2Client
@PropertySource("classpath:oauth2client.properties")
public class OAuth2ClientConfig {
@Value("${accessTokenUri}")
private String accessTokenUri;
@Value("${userAuthorizationUri}")
private String userAuthorizationUri;
@Value("${clientID}")
private String clientID;
@Value("${clientSecret}")
private String clientSecret;
@Bean
public OAuth2ProtectedResourceDetails oauth2Client() {
AuthorizationCodeResourceDetails details = new AuthorizationCodeResourceDetails();
details.setId("oauth2client");
details.setClientId(clientID);
details.setClientSecret(clientSecret);
details.setAccessTokenUri(accessTokenUri);
details.setUserAuthorizationUri(userAuthorizationUri);
details.setTokenName("access_token");
details.setScope(Arrays.asList(new String[] { "email", "cn" }));
details.setPreEstablishedRedirectUri("http://oauth2callback/");
details.setUseCurrentUri(false);
return details;
}
@Bean
public OAuth2RestTemplate oauth2ClientRestTemplate(OAuth2ClientContext clientContext) {
OAuth2RestTemplate oAuth2RestTemplate = new OAuth2RestTemplate(oauth2Client(), clientContext);
AccessTokenProvider accessTokenProvider = new AccessTokenProviderChain(Arrays.<AccessTokenProvider> asList(
new AuthorizationCodeAccessTokenProvider(), new ImplicitAccessTokenProvider(),
new ResourceOwnerPasswordAccessTokenProvider(), new ClientCredentialsAccessTokenProvider())); …Run Code Online (Sandbox Code Playgroud) 我需要使用由OAuth2保护的API.为此我使用OAuth2RestTemplate.但我得到以下错误:
java.net.ConnectException: Connection timed out: connect
Run Code Online (Sandbox Code Playgroud)
由于代理问题,这种情况正在发生.我知道如何在RestTemplate中设置代理:
SimpleClientHttpRequestFactory clientHttpRequestFactory = new SimpleClientHttpRequestFactory();
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("Proxy host", 8080));
Run Code Online (Sandbox Code Playgroud)
clientHttpRequestFactory.setProxy(代理); RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory);
我尝试为OAuth2RestTemplate设置的方式相同:
@Bean
public OAuth2RestOperations restTemplate(OAuth2ClientContext oauth2ClientContext) {
OAuth2RestTemplate client = new OAuth2RestTemplate(resource(), oauth2ClientContext);
SimpleClientHttpRequestFactory clientHttpRequestFactory = new SimpleClientHttpRequestFactory();
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_HOST, PROXY_PORT));
clientHttpRequestFactory.setProxy(proxy);
client.setRequestFactory(clientHttpRequestFactory);
return client;
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用并给出"连接超时"例外.发生这种情况是因为第一行OAuth2RestTemplate client = new OAuth2RestTemplate(resource(), oauth2ClientContext);尝试获取Access令牌,这意味着它还需要代理设置.如果我添加以下行,那么它的工作原理:
System.setProperty("https.proxyHost", "urproxy.com");
System.setProperty("https.proxyPort", "8080");
Run Code Online (Sandbox Code Playgroud)
但我不能使用System.setProperties("","")选项,因为我们没有权限在tomcat服务器上设置.
我研究过但在创建此对象时找不到任何在OAuth2RestTemplate中设置代理的方法.
任何帮助,将不胜感激.谢谢
我在我的Android应用程序中集成了Linkedin和Amazon登录.我从他们的文档中学习了OAuth2,并了解了这个过程.但是我对整个过程有些困惑:
我认为应该发生什么(以LinkedIn为例):
首先,我的问题是,在获取重定向网址后,后端会对访问令牌进行另一次API调用吗?或者后端会以某种方式将我带到我的应用程序(如果是,如何?),然后我的应用程序将调用访问令牌.
我的另一个疑问是,即使不使用OAuth2,我也可以使用以下代码获取LinkedIn用户数据:
LISessionManager.getInstance(getApplicationContext())
.init(this, buildScope(), new AuthListener() {
@Override
public void onAuthSuccess() {
mLinkedinAccessToken = LISessionManager
.getInstance(getApplicationContext())
.getSession().getAccessToken().toString();
Toast.makeText(getApplicationContext(), "success" + mLinkedinAccessToken, Toast.LENGTH_LONG).show();
APIHelper apiHelper = APIHelper.getInstance(getApplicationContext());
apiHelper.getRequest(FaceBookLoginActivity.this, topCardUrl, new ApiListener() {
@Override
public void onApiSuccess(ApiResponse s) {
Gson gson = new Gson();
mLinkedInUserInfo = gson.fromJson(s.getResponseDataAsString(), LinkedInUserInfo.class);
Run Code Online (Sandbox Code Playgroud)
在这里,我没有指定任何重定向URL,甚至没有点击他们在文档中提到的URL,但我可以轻松访问数据.这不是打败了安全认证的全部目的吗?当然,我错过了一些东西,对整个过程有点困惑.我在这里感谢一些帮助.
IG似乎有很多变化.许多OAuth2 repos,似乎都有bug,或者真的不容易转换为Swift3.想知道是否有人有解决方案转移到Swift3并在Instagram上使用最新的变化?
解决方案最受欢 OAuth2实现似乎是一个更复杂的事情.令人惊讶的是,IG没有提供他们自己的示例文档,介绍如何使用iOS.他们只有基于Web的解决方案的文档.
也许在那里酿造的东西?他们有员工数以万计的编码员.但就目前而言,寻找一个(我敢说?)简单的解决方案.
太感谢了.:-)
这是我第一次涉足 OAuth,所以如果我离基地很远,或者走向完全错误的方向,请耐心等待。
我想编写一个脚本来从 basecamp 3 中提取信息,对其进行格式化,然后通过电子邮件发送。我已经用 basecamp 2 做到了这一点,而且效果很好。但是 basecamp 3 不允许简单的身份验证。这只是一个每周通过 cron 运行一次的脚本。
我发现的大多数 OAuth 示例都需要获取授权 url、在浏览器中访问它、授予授权等以获取访问令牌。请告诉我有一种自动化的方式!我不能让这成为一个手动过程。
我用 requests-oauthlib 尝试了后端应用程序流(在这里找到:https ://requests-oauthlib.readthedocs.io/en/latest/oauth2_workflow.html#backend-application-flow )
我几乎没有运气就直接尝试了他们的例子:
from oauthlib.oauth2 import BackendApplicationClient
from requests_oauthlib import OAuth2Session
ktclient_id = r'my-client-id'
ktclient_secret = r'my-client-secret'
ktredirect_uri = r'http://www.company.com/whatever'
client = BackendApplicationClient(client_id=ktclient_id)
oauth = OAuth2Session(client=client)
token = oauth.fetch_token(token_url=r'https://launchpad.37signals.com/authorization/token',
client_id=ktclient_id,
client_secret=ktclient_secret)
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
Traceback (most recent call last):
File "./get-token.py", line 20, in <module>
client_secret=ktclient_secret)
File "/home/mwilson/.local/lib/python2.7/site-packages/requests_oauthlib/oauth2_session.py", line 244, in fetch_token
self._client.parse_request_body_response(r.text, scope=self.scope)
File "/home/mwilson/.local/lib/python2.7/site-packages/oauthlib/oauth2/rfc6749/clients/base.py", line 409, in parse_request_body_response …Run Code Online (Sandbox Code Playgroud) 我正在创建一个身份验证服务器,我现有的一些应用程序可以使用它来进行身份验证。我按照此示例项目和教程https://github.com/dynamind/spring-boot-security-oauth2-minimal将 OAuth2 与 Spring Boot 一起使用。
但就我而言,我现有的应用程序是使用 Spring MVC 和 angular 构建的。所以没有单独的资源服务器。资源也位于同一个应用程序中(资源是我在同一个应用程序中的安全请求映射)。我只想将身份验证过程与我的客户端应用程序分开并使用一个通用的授权服务器。(目前他们使用 Google Authentication + Spring Security 来保护应用程序)。所以我尝试在同一个应用程序中使用 @EnableResourceServer 和 @EnableOAuth2Client 但我无法获得预期的结果。
完成这项任务的最佳方法是什么?是否有任何其他方法可以用来从 Oauth2 服务器验证我的应用程序?
我正在设计一个web应用程序,主要分为以下两部分
我想为此应用程序实现OAuth2。我通读了 OAuth2 并了解了它的各种流程,根据我的理解,我得出结论,“资源所有者密码凭据”流程是一种方法,因为客户端和服务都属于我,用户也将直接向我的应用程序注册,因此他们将提供用户名和密码。
我对“资源所有者密码凭据”流程进行了大量研究,但此流程的讨论和记录很少。我几乎没有接近零的想法,我应该如何在我的应用程序中实现这个流程。我正在 Node JS 中开发网站和 Rest API。请指导我如何实施?任何演示、文档都会有所帮助。
提前致谢 !
按照https://github.com/reddit/reddit/wiki/OAuth2 中描述的 OAuth2 登录流程,我到了 POST 到https://www.reddit.com/api/v1/access_token返回类似内容的地步这个:
{'token_type': 'bearer', 'expires_in': 3600, 'scope': 'identity', 'access_token': '*****'}
Run Code Online (Sandbox Code Playgroud)
然后我做
GET https://oauth.reddit.com/api/v1/me
Run Code Online (Sandbox Code Playgroud)
有了这个标题:
Authorization: bearer *****
Run Code Online (Sandbox Code Playgroud)
响应是 HTTP 403 Unauthorized。但为什么?很明显,访问令牌具有“身份”范围。还记录了 /api/v1/me 调用仅需要此范围。(见https://www.reddit.com/dev/api/oauth#GET_api_v1_me)
那么为什么我会收到 http 403 呢?