zoukankan      html  css  js  c++  java
  • laravel5实现第三方登录(微信)

    背景

    最近手头一个项目需要实现用户在网站的第三方登录(微信和微博),后端框架laravel5.4。

    实现过程以微信网页版第三方登录,其他于此类似,在此不做重复。

    准备工作

    网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。
    在进行微信OAuth2.在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的网站应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程。

    总结下来就是:

    1. 进入微信开放平台注册开发者账号
    2. 根据项目类型创建应用,再此我创建的是网站应用.
    3. 接入微信登陆功能,让用户可使用微信登录你的网站应用
    4. 获得AppID和AppSectet

    到此微信第三方登录的准备工作就完成了。

    授权流程说明

    1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
    2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;
    3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

    在框架中实现(laravel)

    Laravel Socialite简介

    除了传统的基于表单的登录认证外,Laravel 还可以通过 Laravel Socialite 提供 OAuth 认证,目前支持的认证驱动包括 Facebook、Twitter、Google、LinkedIn、GitHub 和 Bitbucket。

    安装相关依赖

    composer require laravel/socialite
    安装weixin-web
    composer require socialiteproviders/weixin-web
    注意网站实现微信登录需要的依赖包为socialiteproviders/weixin-web,如果是手机端App那么可以用socialiteproviders/weixin。
    shanlei@shanlei-Lenovo-ideapad-110-15ISK:/var/www/html/zslm_back$ composer search socialiteproviders/weixin
    socialiteproviders/weixin Weixin OAuth2 Provider for Laravel Socialite
    socialiteproviders/weixin-web Weixin-Web OAuth2 Provider for Laravel Socialite
    socialiteproviders/weixin-web Weixin-Web OAuth2 Provider for Laravel Socialite
    socialiteproviders/weixin Weixin OAuth2 Provider for Laravel Socialite

    相关配置

    1. 设置app/config.php

    添加providers:

    'providers' => [
        SocialiteProvidersManagerServiceProvider::class,
    ],

    添加aliases:

    'aliases' => [ 
        'Socialite' => LaravelSocialiteFacadesSocialite::class, 
    ],

    2. 配置config/services.php

        'weixinweb' => [
            'client_id' => env('WEIXIN_KEY'),
            'client_secret' => env('WEIXIN_SECRET'),
            'redirect' => env('WEIXIN_REDIRECT_URI'),
        ],

    3. 设置app/Providers/EventServiceProvider.php

    添加事件监听

    use SocialiteProvidersManagerSocialiteWasCalled;
    
        protected $listen = [
            'SocialiteProvidersManagerSocialiteWasCalled' => [
                'SocialiteProvidersWeixinWebWeixinWebExtendSocialite@handle',
            ],
        ];
    4. 添加路由
    Route::get('auth/weixin', 'AutoThirdLoginWeixinController@redirectToProvider');
    Route::get('auth/weixin/callback','AutoThirdLoginWeixinController@handleProviderCallback');

    5. 编写WeixinController

    <?php
    /**
     * Created by PhpStorm.
     * User: shanlei
     * Date: 1/6/2017
     * Time: 11:34 AM
     */
    
    namespace AppHttpControllersAutoThirdLogin;
    
    use Socialite;
    use IlluminateHttpRequest;
    use AppHttpControllersController;
    use SocialiteProvidersWeixinWebProvider;
    
    class WeixinController extends Controller{
        public function redirectToProvider(Request $request)
        {   
            return Socialite::with('weixinweb')->redirect();
        }
    
        public function handleProviderCallback(Request $request)
        {
            $user_data = Socialite::with('weixinweb')->stateless()->user();
            dd($user_data);
        }
    }

    访问auth/weixin,获得返回数据。

     

     

    常见错误

    1. 微信授权回调域不符(redirect_uri不符),参见下面规范:

    2. 执行过程中出现一下错误:

    exception 'LaravelSocialiteTwoInvalidStateException' 
    in /example/vendor/laravel/socialite/src/Two/AbstractProvider.php:161

    解决:

    通过stateless()方法禁止会话状态验证

    Socialite::driver('weixinweb')->stateless()->user()

    其他第三方登录在此不做赘述。

  • 相关阅读:
    jquery 实现 点击按钮后倒计时效果,多用于实现发送手机验证码、邮箱验证码
    javascript 中的后退和前进到上下一页
    文件IO流完成文件的复制(复杂版本主要用来演示各种流的用途,不是最佳复制方案哦)
    int ,Intege,String 三者之间的转换
    servlet生成验证码代码
    jsp servlet 的 请求转发和重定向
    struts2
    SQL连接:内连接、外连接、交叉连接。
    今天参加了聚思力面试
    进程(Process)和线程(Thread)的关系和区别
  • 原文地址:https://www.cnblogs.com/lishanlei/p/10073878.html
Copyright © 2011-2022 走看看