GVKun编程网logo

是否有OAuth 2服务器端PHP或Java实现?(oauth2.0服务端)

11

如果您对是否有OAuth2服务器端PHP或Java实现?感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于是否有OAuth2服务器端PHP或Java实现?的详细内容,我们还将为

如果您对是否有OAuth 2服务器端PHP或Java实现?感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于是否有OAuth 2服务器端PHP或Java实现?的详细内容,我们还将为您解答oauth2.0服务端的相关问题,并且为您提供关于EvaOAuth : 基于php/ZF2支持OAuth1.0与OAuth2.0的第三方Oauth登录、ios 服务器端php推送证书生成、java – Android文件上传器与服务器端php、java – 为什么我的Spring OAuth2服务器无法使用SSL自签名ssl?的有价值信息。

本文目录一览:

是否有OAuth 2服务器端PHP或Java实现?(oauth2.0服务端)

是否有OAuth 2服务器端PHP或Java实现?(oauth2.0服务端)

如果存在一个以上的实现,哪个/更好的维护?

专门用于OAuth 2.0草案12。

答案1

小编典典

来自OAuth
Wiki,似乎有一个名为oauth2-php的
PHP实现,它支持IETF v9草案。由于OAuth2仍是草案,因此可能很难找到更多实现。

EvaOAuth : 基于php/ZF2支持OAuth1.0与OAuth2.0的第三方Oauth登录

EvaOAuth : 基于php/ZF2支持OAuth1.0与OAuth2.0的第三方Oauth登录

EvaOAuth是一个统一接口设计,兼容OAuth1.0与OAuth2.0规范的php oauth登录模块,目前支持超过20个主流网站的OAuth登录,包括:

  • 国外

    1. Facebook OAuth2

    2. Twitter OAuth1

    3. Google OAuth2

    4. Github OAuth2

    5. Msn Live OAuth2

    6. Flickr OAuth1

    7. LinkedIn OAuth1

    8. Yahoo OAuth1

    9. Dropbox OAuth1

    10. Foursquare OAuth2

    11. Disqus OAuth2

  • 国内

    1. 豆瓣 Douban OAuth1

    2. 豆瓣 Douban OAuth2

    3. 微博 Weibo OAuth2

    4. 人人网 Renren OAuth2

    5. 腾讯QQ Tencent OAuth2

    6. 开心网 Kaixin OAuth2

    7. 百度 Baidu OAuth2

    8. 360 Qihoo OAuth2

    9. 网易微博 Netease OAuth2

    10. 搜狐微博 Sohu OAuth1

    11. 天涯 Tianya OAuth1

EvaOAuth统一接口规范,上面的任何一个第三方网站,在使用EvaOAuth时的代码与流程都是完全一致的,也可以很简单的扩展并加入新的第三方网站。

最终可以用20行左右代码实现以上所有支持网站的完整OAuth登录授权。

获得代码

推荐在项目中使用Composer进行一键安装。

请编辑composer.json,加入

"require": {
    "AlloVince/EvaOAuth": "dev-master"
},

然后运行

php composer.phar install

即可。

EvaOAuth要求PHP版本必须高于5.3.3,并主要依赖以下几个ZF2模块:

  • ZendOAuth

  • Zend\Session 储存Token信息,也可以自己扩展Storage\StorageInterface实现其他存储方式

  • Zend\Json

在同目录下会自动创建vendor目录并下载所有的依赖,在你的项目中,只需要包含自动生成的vendor/autoload.php即可。

或者请访问EvaOAuth的Github项目主页。

在Windows环境下composer.phar的安装配置

参考之前的ZF2在Windows下的环境搭建,假设我们的php.exe目录在d:\xampp\php,那么首先将php目录加入windows环境变量。

cd d:\xampp\php
php -r "eval(''?>''.file_get_contents(''https://getcomposer.org/installer''));"

同目录下编辑文件 composer.bat,内容为

@ECHO OFF
SET composerScript=composer.phar
php "%~dp0%composerScript%" %*

运行

composer -V

检查composer安装是否成功。

进入EvaOAuth目录下运行:

php D:\xampp\php\composer.phar install

申请应用

实现OAuth登录必须先在相应的第三方网站上申请应用并获得的consumer key与consumer secret,每个网站可能叫法不太一样,以豆瓣为例:

访问豆瓣开发者,我的应用->创建新应用。创建完毕后

  • 豆瓣应用的API Key对应EvaOAuth的consumer key

  • 豆瓣应用的Secret对应EvaOAuth的consumer secret

快速开始

假设我们将EvaOAuth文件夹命名为OAuth并可以用http://localhost/OAuth/访问,同时已经安装好了所有的依赖。我们以豆瓣的OAuth2.0为例(因为豆瓣没有限制CallbackUrl的域,非常方便测试),用几十行代码构建一个完整的OAuth登录:

获得Request Token并跳转到第三方进行授权

首先编写一个文件request.php,内容如下:

require_once ''./vendor/autoload.php'';
use EvaOAuth\Service as OAuthService;

$oauth = new OAuthService();
$oauth->setOptions(array(
    ''callbackUrl'' => ''http://localhost/EvaOAuth/examples/access.php'',
    ''consumerKey'' => ''XXX'',
    ''consumerSecret'' => ''YYY'',
));
$oauth->initAdapter(''Douban'', ''OAuth2'');

$requestToken = $oauth->getAdapter()->getRequestToken();
$oauth->getStorage()->saveRequestToken($requestToken);
$requestTokenUrl = $oauth->getAdapter()->getRequestTokenUrl();
header("location: $requestTokenUrl");

将consumerKey和consumerSecret替换为在豆瓣申请应用的API Key与Secret,然后访问

http://localhost/EvaOAuth/examples/request.php

不出意外的话会被引导向豆瓣进行授权。

这一步中,我们取得了一个Request Token,然后将其暂存在Session里。然后被跳转往第三方网站进行授权。

虽然Request Token只存在于OAuth1.0规范,但是为了兼容两个规范,即便是OAuth2.0中,EvaOAuth也会构建一个虚拟的Request Token。

授权后会被带往我们指定的链接callbackUrl。

用Request Token换取Access Token

继续编写另一个文件access.php

require_once ''./vendor/autoload.php'';
use EvaOAuth\Service as OAuthService;

$oauth = new OAuthService();
$oauth->setOptions(array(
    ''callbackUrl'' => ''http://localhost/EvaOAuth/examples/access.php'',
    ''consumerKey'' => ''XXX'',
    ''consumerSecret'' => ''YYY'',
));
$oauth->initAdapter(''Douban'', ''OAuth2'');

$requestToken = $oauth->getStorage()->getRequestToken();
$accessToken = $oauth->getAdapter()->getAccessToken($_GET, $requestToken);
$accessTokenArray = $oauth->getAdapter()->accessTokenToArray($accessToken);
$oauth->getStorage()->saveAccessToken($accessTokenArray);
$oauth->getStorage()->clearRequestToken();

print_r($accessTokenArray);

在这一步中,从Session中取出上一步获得的Request Token,配合CallbackUrl中携带的参数,最终会换取一个授权的Access Token。上例中我们会看到最终获得的Access Token信息:

Array (
[adapterKey] => douban
[token] => tokenXXXXXXX
[expireTime] => 2012-12-06 15:20:38
[refreshToken] => refreshTokenXXXXXX
[version] => OAuth2
[remoteUserId] => 1291360
)

使用Access Token访问API

取得Access Token后,我们可以根据需求将其存入数据库或以其他方式存放。如果需要携带Access Token访问API也很简单,比如使用上例中的$accessTokenArray:

$oauth = new OAuthService();
$oauth->setOptions(array(
    ''consumerKey'' => ''XXX'',
    ''consumerSecret'' => ''YYY'',
));
$oauth->initByAccessToken($accessTokenArray);
$adapter = $oauth->getAdapter();

$client = $adapter->getHttpClient();
$client->setUri(''https://api.douban.com/v2/user/~me'');
$response = $client->send();
print_r($response->getBody());

Access Token格式参考

EvaOAuth最终返回的Access Token格式是统一的,但是由于第三方应用规定的差别,并不是所有的参数都一定存在:

  • adapterKey (Required) : 第三方网站名,全小写

  • token (Required) : Access Token

  • tokenSecret : Access Token Secret,仅在OAuth1.0中存在

  • version (Required) : 值为 OAuth1/OAuth2

  • refreshToken : Refresh Token

  • expireTime : Access Token过期时间,为UTC时间

  • remoteUserId (Required) : 当前用户在第三方网站的User Id

  • remoteUserName : 当前用户在第三方网站的User Name

  • remoteExtra : 取得Access Token时的其他附加信息,如果有则为一个Json字符串

OAuth登录判断

每次用户的OAuth登录,只需要判定adapterKey/version/remoteUserId三个值完全一致时,即可认为是同一用户。

注意事项

很多第三方应用内需要将测试用的域名加入白名单。

Yahoo OAuth必须在App Permissions栏选择并设定至少一项权限,否则会出现oauth_problem=consumer_key_rejected错误

由于Zend Http新版本存在Bug,可能会引起

Fatal error: Call to a member function connect() on a non-object in Zend/Http/Client.php 

这样的报错,目前修复的方法是强制使用旧版本的Zend Http,项目composer.json中指定:

"allovince/evaoauth": "dev-master",
"zendframework/zend-http": "2.2.3",

重新运行composer即可

ios 服务器端php推送证书生成

ios 服务器端php推送证书生成

1.打开mac的钥匙串,生成证书请求文件

clipboard.png

2.登录Apple dev账号,编辑对应APP ID

clipboard.png

点击创建证书,使用步骤1生成的证书请求创建推送证书,开发证书和推送证书可以用同一个证书请求生成证书

clipboard.png

3.下载步骤2中生成的推送证书并导入到系统中

clipboard.png

4.导出证书私钥,点击证书打开,导出对应的专用秘钥

clipboard.png

设置私钥保护密码,这个密码一定要记住后面有用
clipboard.png

5.转换证书格式

转换推送证书为pem格式(这里的推送证书是从苹果官网直接下载下来的证书)
openssl x509 -in aps.cer -inform der -out aps.pem

转换证书私钥为pem格式,这里需要输入三次秘钥,第一次为步骤4中导出私钥时设置的秘钥,第二和三次为pem设置私钥,这里设置的私钥需要保留
openssl pkcs12 -nocerts -out key.pem -in key.p12

合成证书
cat key.pem aps.pem > push.pem

clipboard.png

6.验证证书

iOS的推送证书分为两种,开发证书和发布证书。开发证书用于平时测试用,只有导出的ipa文件为开发模式时才能使用;发布证书,需要导出的ipa文件为ad hoc模式,或者是发布到APP store中的安装包。

验证开发证书方式
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert dev_cert.pem -key dev_key.pem

验证发布证书的方式
openssl s_client -connect gateway.push.apple.com:2195 -cert aps.pem -key key.pem

以验证开发证书的方式示例。
clipboard.png

输入如下内容说明证书验证通过
clipboard.png

7.提交证书给服务器

最终提交给服务器的为步骤5中 生成的push.pem和转换私钥过程中新设置的秘钥。开发证书也是按照这个步骤来生成。

8.特别提示

过程中生成的 .p12文件记得保留,我们在其他Mac上使用一些推送测试工具时,不仅要导入推送证书还需要导入key.p12才能推送出消息。

9.验证证书的PHP代码

<?php

$deviceToken = ''0b81f895e96624e942fa0a9877d4f8441f0daf961865d98759f3b997b647d3e4'';   //推送设备id
$passphrase = ''password'';    //证书私钥密码
$pemfilename = ''pro_push.pem'';   //推送证书
// SIMPLE PUSH 
$body[''aps''] = array(
    ''alert'' => array(
        ''title'' => "You have a notification",
        ''body'' => "Body of the message",
    ),
    ''badge'' => 1,
    ''sound'' => ''default'',
    ); // Create the payload body
////////////////////////////////////////////////////////////////////////////////
$ctx = stream_context_create();
stream_context_set_option($ctx, ''ssl'', ''local_cert'', $pemfilename);
stream_context_set_option($ctx, ''ssl'', ''passphrase'', $passphrase);
$fp = stream_socket_client(
    ''ssl://gateway.push.apple.com:2195'', $err,
    $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); // Open a connection to the APNS server
if (!$fp)
    exit("Failed to connect: $err $errstr" . PHP_EOL);
echo ''Connected to APNS'' . PHP_EOL;
$payload = json_encode($body); // Encode the payload as JSON
$msg = chr(0) . pack(''n'', 32) . pack(''H*'', $deviceToken) . pack(''n'', strlen($payload)) . $payload; // Build the binary notification
$result = fwrite($fp, $msg, strlen($msg)); // Send it to the server
if (!$result)
    echo ''Message not delivered'' . PHP_EOL;
else
    echo ''Message successfully delivered'' . PHP_EOL;
fclose($fp); // Close the connection to the server
?>

java – Android文件上传器与服务器端php

java – Android文件上传器与服务器端php

我一直在寻找一个解决方案这个几个小时,但我找不到任何.

基本上,我想从我的Android设备上传文件到http网站.但是,我不知道如何做到这一点.我在设备上使用java,我想在服务器端使用PHP.我只想上传文件,不要在服务器上做任何事情.

任何人都可以提供代码和/或一个很好的链接,我需要什么?我在这方面几乎没有任何经验,我很失落.

谢谢,
NS

PS.我没有PHP编码的经验.

解决方法

是的,所以我发现java方面的东西.这样做,所以…是的.
public class Uploader extends Activity {

    private String Tag = "UPLOADER";
    private String urlString = "YOUR_ONLINE_PHP";
    HttpURLConnection conn;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        String exsistingFileName = "/sdcard/uploader/data/testfile";

        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";
        try {
            // ------------------ CLIENT REQUEST

            Log.e(Tag,"Inside second Method");

            FileInputStream fileInputStream = new FileInputStream(new File(
                    exsistingFileName));

            // open a URL connection to the Servlet

            URL url = new URL(urlString);

            // Open a HTTP connection to the URL

            conn = (HttpURLConnection) url.openConnection();

            // Allow Inputs
            conn.setDoInput(true);

            // Allow Outputs
            conn.setDoOutput(true);

            // Don't use a cached copy.
            conn.setUseCaches(false);

            // Use a post method.
            conn.setRequestMethod("POST");

            conn.setRequestProperty("Connection","Keep-Alive");

            conn.setRequestProperty("Content-Type","multipart/form-data;boundary=" + boundary);

            DataOutputStream dos = new DataOutputStream(conn.getoutputStream());

            dos.writeBytes(twoHyphens + boundary + lineEnd);
            dos
                    .writeBytes("Content-disposition: post-data; name=uploadedfile;filename="
                            + exsistingFileName + "" + lineEnd);
            dos.writeBytes(lineEnd);

            Log.e(Tag,"Headers are written");

            // create a buffer of maximum size

            int bytesAvailable = fileInputStream.available();
            int maxBufferSize = 1000;
            // int bufferSize = Math.min(bytesAvailable,maxBufferSize);
            byte[] buffer = new byte[bytesAvailable];

            // read file and write it into form...

            int bytesRead = fileInputStream.read(buffer,bytesAvailable);

            while (bytesRead > 0) {
                dos.write(buffer,bytesAvailable);
                bytesAvailable = fileInputStream.available();
                bytesAvailable = Math.min(bytesAvailable,maxBufferSize);
                bytesRead = fileInputStream.read(buffer,bytesAvailable);
            }

            // send multipart form data necesssary after file data...

            dos.writeBytes(lineEnd);
            dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

            // close streams
            Log.e(Tag,"File is written");
            fileInputStream.close();
            dos.flush();
            dos.close();

        } catch (MalformedURLException ex) {
            Log.e(Tag,"error: " + ex.getMessage(),ex);
        }

        catch (IOException ioe) {
            Log.e(Tag,"error: " + ioe.getMessage(),ioe);
        }

        try {
            BufferedReader rd = new BufferedReader(new InputStreamReader(conn
                    .getInputStream()));
            String line;
            while ((line = rd.readLine()) != null) {
                Log.e("Dialoge Box","Message: " + line);
            }
            rd.close();

        } catch (IOException ioex) {
            Log.e("MediaPlayer","error: " + ioex.getMessage(),ioex);
        }
    }
}

java – 为什么我的Spring OAuth2服务器无法使用SSL自签名ssl?

java – 为什么我的Spring OAuth2服务器无法使用SSL自签名ssl?

我在我的应用程序上使用OAuth 2.0.我有2个使用 Spring Boot开发的应用程序,一个使用url https://192.168.1.30:2999/autenticador进行身份验证,第二个使用客户端 https://192.168.1.30:2901/进行身份验证.

当我使用没有SSL的服务器(http://192.168.1.30:2999/autenticador和https://192.168.1.30:2901/)时,授权成功.但是,当我使用自签名证书时,我遇到了问题,返回错误401,未授权,身份验证失败:无法获取访问令牌.我不知道它是如何以及为什么会发生的.

观察:证书在我的计算机上注册,如信任,然后我看到地址栏为绿色.

客户端:

@SpringBootApplication
@EnableOAuth2Sso
public class Application {
    public static void main(String[] args) throws KeyManagementException,NoSuchAlgorithmException,KeyStoreException {
        SpringApplication.run(Application.class,args);
    }
}

服务器上的OAuth 2.0配置:

@Configuration
@EnableAuthorizationServer
public class OAuthConfiguration extends AuthorizationServerConfigurerAdapter{
    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
         endpoints.authenticationManager(authenticationManager);
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
        .withClient("client")
        .authorizedGrantTypes("authorization_code")
        .scopes("read","trust")
        .resourceIds("RESOURCE_ID")
        .secret("secret");
    }
}

这是服务器登录成功后的客户端日志:

2016-06-06 16:47:27.376  DEBUG  [nio-2901-exec-4]  o.s.security.web.FilterChainProxy          / at position 1 of 12 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter'
  2016-06-06 16:47:27.377  DEBUG  [nio-2901-exec-4]  o.s.security.web.FilterChainProxy          / at position 2 of 12 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter'
  2016-06-06 16:47:27.378  DEBUG  [nio-2901-exec-4]  w.c.HttpSessionSecurityContextRepository   No HttpSession currently exists
  2016-06-06 16:47:27.378  DEBUG  [nio-2901-exec-4]  w.c.HttpSessionSecurityContextRepository   No SecurityContext was available from the HttpSession: null. A new one will be created.
  2016-06-06 16:47:27.381  DEBUG  [nio-2901-exec-4]  o.s.security.web.FilterChainProxy          / at position 3 of 12 in additional filter chain; firing Filter: 'HeaderWriterFilter'
  2016-06-06 16:47:27.382  DEBUG  [nio-2901-exec-4]  o.s.security.web.FilterChainProxy          / at position 4 of 12 in additional filter chain; firing Filter: 'CsrfFilter'
  2016-06-06 16:47:27.383  DEBUG  [nio-2901-exec-4]  o.s.security.web.FilterChainProxy          / at position 5 of 12 in additional filter chain; firing Filter: 'logoutFilter'
  2016-06-06 16:47:27.383  DEBUG  [nio-2901-exec-4]  o.s.s.w.u.matcher.AntPathRequestMatcher    Request 'GET /' doesn't match 'POST /logout
  2016-06-06 16:47:27.383  DEBUG  [nio-2901-exec-4]  o.s.security.web.FilterChainProxy          / at position 6 of 12 in additional filter chain; firing Filter: 'oauth2clientAuthenticationProcessingFilter'
  2016-06-06 16:47:27.384  DEBUG  [nio-2901-exec-4]  o.s.s.w.u.matcher.AntPathRequestMatcher    Checking match of request : '/'; against '/login'
  2016-06-06 16:47:27.384  DEBUG  [nio-2901-exec-4]  o.s.security.web.FilterChainProxy          / at position 7 of 12 in additional filter chain; firing Filter: 'RequestCacheAwareFilter'
  2016-06-06 16:47:27.384  DEBUG  [nio-2901-exec-4]  o.s.security.web.FilterChainProxy          / at position 8 of 12 in additional filter chain; firing Filter: 'SecurityContextHolderAwareRequestFilter'
  2016-06-06 16:47:27.386  DEBUG  [nio-2901-exec-4]  o.s.security.web.FilterChainProxy          / at position 9 of 12 in additional filter chain; firing Filter: 'AnonymousAuthenticationFilter'
  2016-06-06 16:47:27.389  DEBUG  [nio-2901-exec-4]  o.s.s.w.a.AnonymousAuthenticationFilter    Populated SecurityContextHolder with anonymous token: 'org.springframework.security.authentication.AnonymousAuthenticationToken@9055e4a6: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@957e: RemoteIpAddress: 192.168.1.30; SessionId: null; Granted Authorities: ROLE_ANONYMOUS'
  2016-06-06 16:47:27.389  DEBUG  [nio-2901-exec-4]  o.s.security.web.FilterChainProxy          / at position 10 of 12 in additional filter chain; firing Filter: 'SessionManagementFilter'
  2016-06-06 16:47:27.389  DEBUG  [nio-2901-exec-4]  o.s.s.w.session.SessionManagementFilter    Requested session ID CBA2CC9F09D613F91D95FD4764E48A50 is invalid.
  2016-06-06 16:47:27.389  DEBUG  [nio-2901-exec-4]  o.s.security.web.FilterChainProxy          / at position 11 of 12 in additional filter chain; firing Filter: 'ExceptionTranslationFilter'
  2016-06-06 16:47:27.389  DEBUG  [nio-2901-exec-4]  o.s.security.web.FilterChainProxy          / at position 12 of 12 in additional filter chain; firing Filter: 'FilterSecurityInterceptor'
  2016-06-06 16:47:27.390  DEBUG  [nio-2901-exec-4]  o.s.s.w.a.i.FilterSecurityInterceptor      Secure object: FilterInvocation: URL: /; Attributes: [authenticated]
  2016-06-06 16:47:27.390  DEBUG  [nio-2901-exec-4]  o.s.s.w.a.i.FilterSecurityInterceptor      PrevIoUsly Authenticated: org.springframework.security.authentication.AnonymousAuthenticationToken@9055e4a6: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@957e: RemoteIpAddress: 192.168.1.30; SessionId: null; Granted Authorities: ROLE_ANONYMOUS
  2016-06-06 16:47:27.399  DEBUG  [nio-2901-exec-4]  o.s.s.access.Vote.AffirmativeBased         Voter: org.springframework.security.web.access.expression.WebExpressionVoter@3fcae110,returned: -1
  2016-06-06 16:47:27.404  DEBUG  [nio-2901-exec-4]  o.s.s.w.a.ExceptionTranslationFilter       Access is denied (user is anonymous); redirecting to authentication entry point

org.springframework.security.access.AccessDeniedException: Access is denied

解决方法

你能检查一下“spring-security.xml”中的配置,看看’requires-channel’属性是否设置为https而不是http?如果没有,请将all设置为https并尝试.

关于这个问题的更多信息在这里.
http://docs.spring.io/spring-security/site/faq/faq.html#faq-tomcat-https-session

样品:

<intercept-url pattern="/login.html" access="hasRole('ROLE_ANONYMOUS')" requires-channel="https"/>
    <intercept-url pattern="/resources/**" access="permitAll" requires-channel="https"/>
    <intercept-url pattern="/admin**" access="hasRole('ROLE_ADMIN')" requires-channel="https"/>
    <intercept-url pattern="/rest/**" access="hasRole('ROLE_USER')" requires-channel="https"/>
    <intercept-url pattern="/index" access="hasRole('ROLE_USER')" requires-channel="https"/>
    <intercept-url pattern="/upload/**" access="hasRole('ROLE_USER')" requires-channel="https"/>

今天的关于是否有OAuth 2服务器端PHP或Java实现?oauth2.0服务端的分享已经结束,谢谢您的关注,如果想了解更多关于EvaOAuth : 基于php/ZF2支持OAuth1.0与OAuth2.0的第三方Oauth登录、ios 服务器端php推送证书生成、java – Android文件上传器与服务器端php、java – 为什么我的Spring OAuth2服务器无法使用SSL自签名ssl?的相关知识,请在本站进行查询。

本文标签: